DeepSeek实现FunctionCalling调用API查询天气

news2025/2/28 7:43:13

什么是FunctionCalling

Function Calling(函数调用)是大型语言模型(如 OpenAI 的 GPT 系列)提供的一种能力,允许模型在生成文本的过程中调用外部函数或工具,以完成更复杂的任务。通过 Function Calling,模型可以将自然语言请求转换为结构化的函数调用,从而与外部系统、API 或工具进行交互。

想象你有一个智能助手(比如 GPT),它可以回答你的问题,但它本身无法直接执行某些操作,比如查询天气、发送邮件或查询数据库。这时,Function Calling 就像给这个助手提供了一组工具(函数),让它可以根据你的需求调用这些工具来完成具体任务。例如:

  • 你问助手:“今天北京的天气怎么样?”

  • 助手不会直接回答天气,而是调用一个外部的“天气查询函数”,获取天气数据后,再生成回答。

Function Calling工作流程

Function Calling指的是大模型在生成回复的过程中可以调用外部函数来处理它无法解决的问题,的实现原理如下

  1. 要使用 Function Calling我们需要先定义函数:比如预先定义一组函数(例如查询天气、发送邮件、查询数据库等),并描述这些函数的功能和输入参数。

  2. 当用户提出请求时,模型会判断是否需要调用函数。如果需要,模型会生成一个结构化的函数调用请求

  3. 执行函数:开发者编写的代码接收到函数调用请求后,执行对应的函数,模型根据函数返回的结果,生成自然语言回答给用户

在这里插入图片描述

实现天气查询助手

以下是一个简单的 Function Calling 示例,假设我们需要实现一个天气查询助手,首先找到一个天气查询的平台,我这里使用:https://www.weatherapi.com/my/,注册账号后得到一个APIkey,如下
在这里插入图片描述

然后我们需要准备一个调用天气API的函数,python 代码片段如下:(后面会有完整代码)

# 使用 WeatherAPI 的天气查询函数
def get_weather(city: str):
    # 使用 WeatherAPI 的 API 来获取天气信息
    api_key = "你的天气的APIkEY"  # 替换为你自己的 WeatherAPI APIKEY
    base_url = "http://api.weatherapi.com/v1/current.json"
    params = {
        'key': api_key,
        'q': 'Beijing',
        'aqi': 'no'  # 不需要空气质量数据
    }

    # 调用天气 API
    response = requests.get(base_url, params=params)

    if response.status_code == 200:
        data = response.json()
        #拿到天气和温度
        weather = data['current']['condition']['text']
        temperature = data['current']['temp_c']
        return f"城市 {city} 天气是 {weather} 温度为 {temperature}°C."
    else:
        return f"无法检索 {city} 的天气信息 ."

然后我们定义 tools ,大模型通过tools来调用天气函数:(后面会有完整代码)

# 定义 OpenAI 的 function calling tools
tools = [
    {
        'type': 'function',
        'function': {
            'name': 'get_weather',
            'description': 'Get the current weather for a given city.',
            'parameters': {
                'type': 'object',
                'properties': {
                    'city': {
                        'type': 'string',
                        'description': 'The name of the city to query weather for.',
                    },
                },
                'required': ['city'],
            },
        }
    }
]

接着我们调用大模型,并指定 tools 属性,如下

def function_call_playground(prompt):
    messages = [{'role': 'user', 'content': prompt}]

    # 发送请求到 OpenAI API
    response = client.chat.completions.create(
        model="deepseek-ai/DeepSeek-V2.5",
        messages=messages,
        temperature=0.01,
        top_p=0.95,
        stream=False,
        # 默认值,由 GPT 自主决定返回 function call 还是返回文字回复。也可以强制要求必须调用指定的函数,详见官方文档
        tool_choice="auto",
        tools=tools #指定 function calling tools
    )

完整代码如下:

import requests
from openai import OpenAI
#这里使用的是硅基流动的API接口
client = OpenAI(
    api_key="硅基流动的apikey", # 从https://cloud.siliconflow.cn/account/ak获取
    base_url="https://api.siliconflow.cn/v1"
)

# 使用 WeatherAPI 的天气查询函数
def get_weather(city: str):
    # 使用 WeatherAPI 的 API 来获取天气信息
    api_key = "天气的APIkey"  # 替换为你自己的 WeatherAPI APIKEY
    base_url = "http://api.weatherapi.com/v1/current.json"
    params = {
        'key': api_key,
        'q': 'Beijing',
        'aqi': 'no'  # 不需要空气质量数据
    }

    # 调用天气 API
    response = requests.get(base_url, params=params)

    if response.status_code == 200:
        data = response.json()
        #拿到天气和温度
        weather = data['current']['condition']['text']
        temperature = data['current']['temp_c']
        return f"城市 {city} 天气是 {weather} 温度为 {temperature}°C."
    else:
        return f"无法检索 {city} 的天气信息 ."

# 定义 OpenAI 的 function calling tools
tools = [
    {
        'type': 'function',
        'function': {
            'name': 'get_weather',
            'description': 'Get the current weather for a given city.',
            'parameters': {
                'type': 'object',
                'properties': {
                    'city': {
                        'type': 'string',
                        'description': 'The name of the city to query weather for.',
                    },
                },
                'required': ['city'],
            },
        }
    }
]

# 发送请求并处理 function calling
def function_call_playground(prompt):
    messages = [{'role': 'user', 'content': prompt}]

    # 发送请求到 OpenAI API
    response = client.chat.completions.create(
        model="deepseek-ai/DeepSeek-V2.5",
        messages=messages,
        temperature=0.01,
        top_p=0.95,
        stream=False,
        # 默认值,由 GPT 自主决定返回 function call 还是返回文字回复。也可以强制要求必须调用指定的函数,详见官方文档
        tool_choice="auto",
        tools=tools
    )

    # 处理 API 返回的工具调用请求
    func1_name = response.choices[0].message.tool_calls[0].function.name
    func1_args = response.choices[0].message.tool_calls[0].function.arguments
    func1_out = eval(f'{func1_name}(**{func1_args})')

    # 将结果添加到对话中并返回
    messages.append({
        'role': 'tool',
        'content': f'{func1_out}',
        'tool_call_id': response.choices[0].message.tool_calls[0].id
    })

    return messages

# 示例使用
prompt = "how is the weather today in chegndu?"

print(function_call_playground(prompt))

执行效果如下:
在这里插入图片描述

实现附近地图搜索

通过FunctionCalling调用百度地图进行附近搜索,和上面的思路一样,下面贴一下代码

import requests
from openai import OpenAI

client = OpenAI(
    api_key="你的key", # 从https://cloud.siliconflow.cn/account/ak获取
    base_url="https://api.siliconflow.cn/v1"
)

# 使用 百度地图查询
def doQuery(keyword: str):
    api_key = "你的百度地图的key"  # 替换为你自己的APIKEY
    base_url = "https://api.map.baidu.com/place/v2/search"
    params = {
        'ak': api_key,
        'query': keyword,
        'radius': 2000,
        'output': "json",
        'location': '30.538031,104.061420'  # 以成都为中心点
    }

    # 调用API
    response = requests.get(base_url, params=params)
    if response.status_code == 200:
        data = response.json()
        return data
    else:
        return f"无法检索 {keyword} 信息."

# 定义 OpenAI 的 function calling tools
tools = [
    {
        'type': 'function',
        'function': {
            'name': 'doQuery',
            'description': 'Search for nearby restaurants based on the given keyword',
            'parameters': {
                'type': 'object',
                'properties': {
                    'keyword': {
                        'type': 'string',
                        'description': 'The name of the keyword to query for near.',
                    },
                },
                'required': ['keyword'],
            },
        }
    }
]

# 发送请求并处理 function calling
def function_call_playground(prompt):
    messages = [{'role': 'user', 'content': prompt}]

    # 发送请求到 OpenAI API
    response = client.chat.completions.create(
        model="deepseek-ai/DeepSeek-V2.5",
        messages=messages,
        temperature=0.01,
        top_p=0.95,
        stream=False,
        # 默认值,由 GPT 自主决定返回 function call 还是返回文字回复。也可以强制要求必须调用指定的函数,详见官方文档
        tool_choice="auto",
        tools=tools
    )
    # 处理 API 返回的工具调用请求
    func1_name = response.choices[0].message.tool_calls[0].function.name
    func1_args = response.choices[0].message.tool_calls[0].function.arguments
    func1_out = eval(f'{func1_name}(**{func1_args})')

    # 将结果添加到对话中并返回
    messages.append({
        'role': 'tool',
        'content': f'{func1_out}',
        'tool_call_id': response.choices[0].message.tool_calls[0].id
    })

    return messages

# 示例使用
prompt = "附近有哪些:饭店"

print(function_call_playground(prompt))

文章就写到这,喜欢请给个好评!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows设置暂停更新时长

windows设置暂停更新时长 win11与win10修改注册表操作一致 ,系统界面不同 1.打开注册表 2.在以下路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键新建 DWORD 32位值,名称为FlightSettingsMaxPauseDays 根据需求填写数…

【Kimi】自动生成PPT-并支持下载和在线编辑--全部免费

【Kimi】免费生成PPT并免费下载 用了好几个大模型,有些能生成PPT内容; 有些能生成PPT,但下载需要付费; 目前只有Kimi生成的PPT,能选择模板、能在线编辑、能下载,关键全部免费! 一、用kimi生成PP…

一款在手机上制作电子表格

今天给大家分享一款在手机上制作电子表格的,免费好用的Exce1表格软件,让工作变得更加简单。 1 软件介绍 Exce1是一款手机制作表格的办公软件,您可以使用手机exce1在线制作表格、工资表、编辑xlsx和xls表格文件等,还可以学习使用…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.1单节点安装(Docker与手动部署)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 10分钟快速部署Elasticsearch单节点环境1. 系统环境要求1.1 硬件配置推荐1.2 软件依赖 2. Docker部署方案2.1 部署流程2.2 参数说明2.3 性能优化建议 3. 手动部署方案3.1 安…

【Mac电脑本地部署Deepseek-r1:详细教程与Openwebui配置指南】

文章目录 前言电脑配置:安装的Deepseek版本:使用的UI框架:体验效果展示:本地部署体验总结 部署过程Ollama部署拉取模型运行模型Openwebui部署运行Ollama服务在Openwebui中配置ollama的服务 后话 前言 deepseek最近火的一塌糊涂&a…

网络安全学习中,web渗透的测试流程是怎样的?

渗透测试是什么?网络安全学习中,web渗透的测试流程是怎样的? 渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我…

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但…

第6_7章_管理权限评估和测试策略

管理权限 权限将受保护的对象与必须评估以决定是否应授予访问权限的策略相关联。 在创建要保护的资源以及要用于保护这些资源的策略后, 您可以开始管理权限。要管理权限,请在编辑资源服务器时单击 Permissions 选项卡。 可以创建权限来保护两种主要类…

2025年网校系统源码开发趋势:技术革新的教育培训APP搭建实战

2025年,随着AI、大数据、云计算等技术的深度融合,网校教育系统的源码开发也迎来了新的发展趋势。本文将深入探讨这些趋势,并结合教育培训APP的开发实战,展示如何应对未来的技术挑战。 一、2025年网校教育系统源码的技术趋势 AI驱…

Linux驱动开发实战(一):LED控制驱动详解

Linux驱动开发野火实战(一):LED控制驱动详解 文章目录 Linux驱动开发野火实战(一):LED控制驱动详解引言一、基础知识1.1 什么是字符设备驱动1.2 重要的数据结构read 函数write 函数open 函数release 函数 二…

PowerShell 执行策略:fnm管理软件安装nodejs无法运行npm,错误信息:about_Execution_Policies

通过fnm管理软件安装NodeJS后添加环境变量依然无法执行npm,提示无法加载文件,错误如下: PowerShell 执行策略简介: PowerShell 执行策略是一项安全功能,用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶…

论文阅读笔记:Deep Face Recognition: A Survey

论文阅读笔记:Deep Face Recognition: A Survey 1 介绍2 总览2.1 人脸识别组件2.1.1 人脸处理2.1.2 深度特征提取2.1.3 基于深度特征的人脸对比 3 网络结构和损失函数3.1 判别损失函数的演化3.1.1 基于欧式距离的损失3.1.2 基于角度/余弦边距的损失3.1.3 Softmax损失…

本地dify绑定notion

需要用到 notion 的“集成”功能。对于个人用户来说,选择使用**内部 internal **集成,公司用户可以考虑使用公开 public 集成。 在下面的 notion 集成网站中申请一个新的集成: Notion – The all-in-one workspace for your notes, tasks, …

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema?三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例:定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…

DeepSeek今日连开3源!针对优化的并行策略,梁文锋本人参与开发

DeepSeek开源周第四天,直接痛快「1日3连发」,且全都围绕一个主题: 优化并行策略。 DualPipe:一种创新的双向流水线并行算法,能够完全重叠前向和后向计算-通信阶段,并减少“流水线气泡”。它通过对称的微批…

【含文档+PPT+源码】基于过滤协同算法的旅游推荐管理系统设计与实现

项目介绍 本课程演示的是一款基于过滤协同算法的旅游推荐管理系统设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【华为OD机考】华为OD笔试真题解析(15)--异常的打卡记录

题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据,也是计算职工工资的原始依据,为了正确地计算职工工资和监督工资基金使用情况,公司决定对员工的手机打卡记录进行异常排查。 如果出现以下两种情况,则认为打卡异常…

Java实战:使用HttpClient实现图片下载与本地保存

在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求。其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都显得尤为重要。无论是社交媒体平台、电商平台,还是个人项目,能够高效地…

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Python毕业设计选题:基于Python的社区爱心养老管理系统设计与实现_django

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 身体健康界面 公共书籍界面 借阅信息界面 归还…