Deepseek Api Function Calling解析(tools、tool_calls)Deepseek函数调用流程图、Python代码示例

文章目录

  • Function Calling介绍
      • **核心原理**
        • 1. **动态扩展模型能力**
        • 2. **JSON结构化交互**
      • **实现步骤**(以支持Function Calling的模型为例)
        • 1. **定义可用函数**
        • 2. **模型匹配与生成**
        • 3. **开发者执行函数**
        • 4. **结果反馈给模型**
      • **DeepSeek R1的当前限制**
      • **替代方案建议**
        • 1. **自定义流程控制**
        • 2. **关注更新动态**
      • 💡 **扩展阅读**
    • Function Calling调用流程
      • **Function Calling 核心流程**
        • 1. **用户输入请求**
        • 2. **模型解析意图**
        • 3. **生成函数调用请求**
        • 4. **执行外部函数**
        • 5. **返回函数结果**
        • 6. **生成最终响应**
      • **流程图**
      • **关键点说明**
        • 1. **两次模型交互(如OpenAI)**
        • 2. **结构化参数验证**
        • 3. **错误处理**
      • **参考案例(天气查询)**
        • 1. **用户输入**
        • 2. **模型返回函数调用**
        • 3. **执行天气API查询**
        • 4. **模型生成最终响应**
      • **扩展阅读**
  • Function Calling Python代码示例(以调用OpenAI模型为例)
      • 代码
      • 代码解析:
        • 1. **函数定义**
        • 2. **API交互流程**
        • 3. **关键参数说明**
      • 执行示例输出:
      • 注意事项:
        • 1. 需替换为有效的OpenAI API密钥(`sk-your-api-key-here`)
        • 2. GPT-3.5-turbo版本需 >= 0613 才能支持函数调用
        • 3. 实际生产环境需要:

Function Calling介绍

根据官方文档和搜索结果,DeepSeek的 Function Calling(函数调用) 功能允许模型通过调用外部工具来增强其能力。以下是其核心原理与实现步骤:


核心原理

1. 动态扩展模型能力

通过预定义函数,模型可将用户查询映射到具体操作(如调用API、执行计算等),从而突破纯文本生成的限制。

2. JSON结构化交互

模型不直接执行函数,而是生成包含函数名参数的JSON对象,开发者据此执行外部逻辑。


实现步骤(以支持Function Calling的模型为例)

1. 定义可用函数

开发者在API请求中声明函数列表,包括:

  • 函数名(如 get_weather
  • 参数描述(如 {"location": "string", "unit": "celsius|fahrenheit"}
2. 模型匹配与生成

用户输入查询后,模型判断是否需要调用函数。若需要,则生成JSON对象,例如:

{"tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"location\": \"北京\"}"}}]
}
3. 开发者执行函数

解析JSON并调用对应函数,获取结果(如调用天气API返回数据)。

4. 结果反馈给模型

将执行结果返回给模型,模型整合信息生成最终回复(如“北京今天晴天,25℃”)。


DeepSeek R1的当前限制

🔴 注意:根据官方文档(DeepSeek API Docs),DeepSeek R1目前不支持Function Calling,且旧版模型(如 deepseek-chat)的此功能存在以下问题:

  • 可能出现循环调用(模型重复生成函数请求)
  • 返回空响应或无意义JSON
  • 开发团队正在修复,预计下一版本改进。

替代方案建议

1. 自定义流程控制

通过Prompt Engineering引导模型输出结构化文本,开发者手动解析后调用外部工具。
示例Prompt

若需查询天气,请以JSON格式回复:{"action": "weather", "location": "城市名"}
2. 关注更新动态

建议定期查阅DeepSeek GitHub仓库或官方文档,获取Function Calling支持进展。


💡 扩展阅读

  • OpenAI式Function Calling详解: OpenAI函数调用机制
  • DeepSeek工具调用优化方向: Reddit讨论

Function Calling调用流程

好的,用户需要理解Function Calling的流程,并希望有一个流程图来辅助理解。我之前提供的搜索结果里提到,Function Calling的基本流程包括用户输入、模型解析、生成函数调用请求、执行函数、返回结果和生成响应。用户可能已经了解了一些基本步骤,但可能对具体细节或流程图有疑问。

首先,需要确认用户的实际需求。他们可能是在开发中使用大模型,需要集成外部工具,比如天气API或数据库查询。流程图的请求表明他们希望有一个可视化的步骤说明,可能用于教学或系统设计。

根据搜索结果,尤其是来自CSDN和知乎的链接,流程通常包括两次模型调用:第一次判断是否需要调用函数,生成请求;第二次根据函数返回的结果生成最终响应。例如,OpenAI的流程是先发送用户输入和可用函数列表,模型返回需要调用的函数及参数,执行后再次将结果传给模型生成回答。

需要注意用户提到的DeepSeek R1目前不支持Function Calling,但其他模型如GPT-4有该功能。用户的示例可能基于通用流程,但需要明确说明不同模型的差异。

用户可能遇到的困惑点在于如何将模型和外部系统连接,以及具体步骤间的数据传递。流程图应清晰展示从用户输入到最终响应的闭环过程,包括模型判断和执行函数的环节。

综合搜索结果,可以构建一个包含以下步骤的流程图:

  1. 用户输入问题。
  2. 模型解析并判断是否需要调用函数。
  3. 生成函数调用请求(名称和参数)。
  4. 应用程序执行函数并获取结果。
  5. 结果返回给模型。
  6. 模型整合结果生成最终响应。

需要指出的是,部分实现可能需要两次模型交互,如OpenAI的流程,而有些可能整合为一次。此外,函数参数的验证和错误处理也是重要环节,但可能不在基础流程中体现。

最后,确保流程图简洁易懂,用文字说明每个步骤的关键点,如模型生成结构化请求(JSON),应用程序执行外部API调用等。同时,参考提供的链接中的示意图,但可能无法直接访问图片,需用文字描述结构。

以下是 Function Calling(函数调用) 的详细流程及示意图,结合大模型与外部工具的交互机制:


Function Calling 核心流程

1. 用户输入请求
  • 用户提出自然语言请求(如“北京今天的天气如何?”)。
2. 模型解析意图
  • 大模型(如GPT-4)分析用户意图,判断是否需要调用外部函数(如天气API)。
3. 生成函数调用请求
  • 模型返回结构化请求(JSON格式),包含函数名和参数:
    {"tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"location\": \"北京\"}"}}]
    }
    
4. 执行外部函数
  • 应用程序解析请求,调用对应的函数(如查询天气API)。
5. 返回函数结果
  • 函数执行结果(如温度、天气状况)返回给模型。
6. 生成最终响应
  • 模型将结果整合为自然语言回复(如“北京今天晴天,25℃”)。

流程图

用户输入│▼
大模型解析意图│▼
是否需要调用函数? ——是→ 生成函数调用请求(JSON)│                       │否                        ▼│                    执行外部函数(如API、数据库)▼                       │
直接生成回答              ▼│                    获取函数结果▼                       │
返回用户响应 ←───────────┘

关键点说明

1. 两次模型交互(如OpenAI)
  • 第一次请求:发送用户输入 + 可用函数列表,模型返回需调用的函数及参数。
  • 第二次请求:发送函数执行结果,模型生成最终回复。
2. 结构化参数验证
  • 应用程序需校验参数格式(如参数类型、必填字段),避免错误调用。
3. 错误处理
  • 若函数调用失败,模型可能重新生成请求或提示用户修正输入。

参考案例(天气查询)

1. 用户输入

“上海明天会下雨吗?”

2. 模型返回函数调用
{"function": "get_weather", "arguments": {"location": "上海", "date": "2024-06-20"}}
3. 执行天气API查询

调用第三方API获取天气数据(如{"weather": "rain", "temp": 22})。

4. 模型生成最终响应

“上海明天有雨,气温22℃。”


扩展阅读

  • OpenAI Function Calling 官方文档
  • 大模型函数调用原理与实战(CSDN)
  • LangChain 函数调用实现

通过流程图和分步解释,可以更清晰地理解大模型如何通过函数调用与外部系统协同工作。

Function Calling Python代码示例(以调用OpenAI模型为例)

代码

以下是使用OpenAI Function Calling的Python代码示例,实现天气查询功能:

import openai
import json# 配置OpenAI API密钥
openai.api_key = "sk-your-api-key-here"def get_current_weather(location, unit="celsius"):"""模拟天气API调用(实际应替换为真实API调用)"""weather_data = {"location": location,"temperature": "25","unit": unit,"forecast": ["sunny", "windy"],}return json.dumps(weather_data)def run_conversation():# 第一步:发送用户查询和函数定义messages = [{"role": "user", "content": "北京今天天气怎么样?"}]functions = [{"name": "get_current_weather","description": "获取指定地区的当前天气","parameters": {"type": "object","properties": {"location": {"type": "string","description": "城市或地区名称,例如:北京",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"],"description": "温度单位"}},"required": ["location"],},}]# 初始API调用response = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",messages=messages,functions=functions,function_call="auto",)response_message = response.choices[0].message# 第二步:处理函数调用if hasattr(response_message, "function_call"):# 解析函数调用信息function_name = response_message["function_call"]["name"]function_args = json.loads(response_message["function_call"]["arguments"])# 调用对应函数if function_name == "get_current_weather":function_response = get_current_weather(location=function_args.get("location"),unit=function_args.get("unit", "celsius"))# 第三步:发送函数结果给模型messages.append(response_message)  # 添加助理的消息messages.append({"role": "function","name": function_name,"content": function_response,})# 获取最终响应final_response = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",messages=messages,)return final_response.choices[0].message['content']else:return response_message['content']# 运行对话
print(run_conversation())

代码解析:

1. 函数定义
  • get_current_weather:模拟天气API调用(实际开发需替换为真实API)
  • 参数验证逻辑可在此函数中添加
2. API交互流程
用户输入 → 模型判断需要函数调用 → 生成函数调用请求 → 
执行函数 → 返回结果给模型 → 生成最终响应
3. 关键参数说明
  • functions:声明模型可用的函数列表
  • function_call:设置为"auto"让模型自主决策

执行示例输出:

北京今天天气晴朗,当前气温为25摄氏度,风力较大。请注意防晒。

注意事项:

1. 需替换为有效的OpenAI API密钥(sk-your-api-key-here
2. GPT-3.5-turbo版本需 >= 0613 才能支持函数调用
3. 实际生产环境需要:
  • 添加错误处理(网络错误/参数错误)
  • 实现真正的天气API调用
  • 设置合理的temperature参数控制输出稳定性

如果需要DeepSeek版本的实现,请关注其API文档的更新,当前(截至2024年6月)DeepSeek R1尚未开放Function Calling支持。

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

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

相关文章

在2023idea中如何创建SpringBoot

目录 一.下载和安装 Maven 1.前往 https://maven.apache.org/download.cgi 下载最新版的 Maven 程序 2.将文件解压到D:Program FilesApachemaven目录 3.新建环境变量MAVEN_HOME,赋值D:Program FilesApachemaven 4.编辑环境变量Path,追加%MAVEN_HOME…

基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

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

用冒泡排序法模拟qsort函数

目录 1.前言 2.qsort函数的介绍 ​3.冒泡法回顾 4.模拟qsort---buble_sort 4.1 buble_sort格式 4.2 主函数,以int类型为例 4.3comp_int函数的功能设计 4.4 swap函数的功能设计 5. 总代码概览 1.前言 今天,小邓儿带大家用冒泡排序法来模拟一下qs…

全星研发项目管理APQP软件系统:铸造芯片集成电路产业研发体系化建设平台

全星研发项目管理APQP软件系统:铸造芯片集成电路产业研发体系化建设平台 在芯片集成电路行业,研发效率和质量直接决定了企业的核心竞争力。面对日益复杂的芯片设计、日益缩短的产品生命周期以及日益严格的质量要求,传统的研发管理模式已难以满…

《Python实战进阶》No 11:微服务架构设计与 Python 实现

第11集:微服务架构设计与 Python 实现 2025年3月3日更新了代码和微服务运行后的系统返回信息截图,所有代码在 python3.11.5虚拟环境下运行通过。 微服务架构通过将复杂应用拆分为独立部署的小型服务,显著提升了系统的可扩展性和维护性。本集…

USRP7440-通用软件无线电平台

1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构,它将射频ADC、DAC、ARM、FPGA等集成一体,瞬时带宽可以达到2.5GHz,尤其适合于射频直采应用,比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着&#xf…

【小羊肖恩】小羊杯 Round 2 C+K

题目链接:https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛虫吗? 思路: 其实很简单,假设我们要满足题目所给条件,那么这个毛毛虫最坏情况下肯定是一条如下图所示的无向图 右端省略号为对称图形 &…

不谓侠--记录

音乐《不谓侠》 衣襟上 别好了晚霞 余晖送我牵匹老马 正路过 烟村里人家 恰似当年故里正飞花 醉过风 喝过茶 寻常巷口寻个酒家 在座皆算老友 碗底便是天涯 天涯远 无处不为家 蓬门自我也像广厦 论意气 不计多或寡 占三分便敢自称为侠 刀可捉 拳也耍 偶尔闲来…

不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比

本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性,并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度,详细分析了不同规模企业在选择 AI 工具时的考量因素…

Vue核心知识:KeepLive全方位分析

KeepAlive 是 Vue 组件中的一个重要功能,主要用于缓存组件,以提升性能和用户体验。 目录 一、KeepAlive 基本概念二、KeepAlive 的核心原理三、KeepAlive 关键属性解析1. include:指定需要缓存的组件2. exclude:指定不需要缓存的组…

【电力——tarjan割点,求连通块】

题目 分析 这是割点的板子 代码 #include <bits/stdc.h> using namespace std;const int N 1e410; const int M 3e410;int h[N], e[M], ne[M], idx; int dfn[N], low[N], tot; int root, ans;void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h…

【HTTP】解码网络通信的奥秘:HTTP,IP 地址,端口,DNS及NAT地址转换的协同之舞

引言 每文学习一句诗&#xff1a;行一棋不足以见智&#xff0c;弹一弦不足以见悲 ——《淮南子说林训》 译文&#xff1a;走一个棋子&#xff0c;不足以现出智慧&#xff1b;弹一根琴弦&#xff0c;不能够使人产生悲哀之情。 自述&#xff1a;互联网现如今已经成为每个人都离不…

18、深拷贝与浅拷贝的区别【中高频】

浅拷贝 浅拷贝只是拷贝了一个指针&#xff0c;并没有开辟一块新的内存。拷贝的指针和原来的指针 指向同一块地址。当一个对象修改了资源&#xff0c;另一个对象也会受到影响&#xff0c;因此浅拷贝是有风险的&#xff1a;当两个对象都销毁 并调用析构函数时&#xff0c;会造成…

【Linux】从入门到精通:Make与Makefile完全指南

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;从入门到精通&#xff1a;Make与Makefile完全指南 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;C | C语言 | Linux | Python | 数据结构和算法 | 算法专题 &#x1…

利用PyQt简单的实现一个机器人的关节JOG界面

在上一篇文章中如何在Python用Plot画出一个简单的机器人模型&#xff0c;我们介绍了如何在Python中画出一个简单的机器人3D模型&#xff0c;但是有的时候我们需要通过界面去控制机器人每一个轴的转动&#xff0c;并实时的显示出当前机器人的关节位置和末端笛卡尔位姿。 那么要实…

iOS 使用消息转发机制实现多代理功能

在iOS开发中&#xff0c;我们有时候会用到多代理功能&#xff0c;比如我们列表的埋点事件&#xff0c;需要我们在列表的某个特定的时机进行埋点上报&#xff0c;我们当然可以用最常见的做法&#xff0c;就是设置代理实现代理方法&#xff0c;然后在对应的代理方法里面进行上报&…

XGBoost和LightGBM机器学习算法对比及实战

文章目录 1. XGBoost 原理核心思想关键技术点2. LightGBM 原理核心思想关键技术点3. XGBoost vs LightGBM 对比4. 适用场景选择5. 总结1. 数据准备2. XGBoost 示例安装库代码实现3. LightGBM 示例安装库代码实现4. 关键参数对比5. 注意事项6. 输出示例XGBoost 和 LightGBM 是两…

局域网自动识别机器名和MAC并生成文件的命令

更新版本&#xff1a;添加了MAC 地址 确定了设备唯一性 V1.1 局域网自动识别机器名和MAC并生成文件的批处理命令 echo off setlocal enabledelayedexpansionREM 设置输出文件 set outputFilenetwork_info.txtREM 清空或创建输出文件 echo Scanning network from 192.168.20.1…

基于Python+Vue开发的体育用品商城管理系统源码+开发文档+课程作业

项目简介 该项目是基于PythonVue开发的体育用品商城管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Python的体…