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

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支持进展。


💡 扩展阅读

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℃。”


扩展阅读

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

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支持。

### 调用 DeepSeek API 方法及参数说明 #### 创建环境变量存储 API Key 为了安全起见,在调用 DeepSeek API 前应先创建 `.env` 文件用于保存所获取到的 API 密钥。这一步骤有助于保护密钥不被泄露[^3]。 ```bash # .env 文件内容示例 DEEPSEEK_API_KEY=your_api_key_here ``` #### 初始化配置与导入库 在 Python 中可以利用 `os` 库读取环境变量中的 API 密钥,并设置必要的初始化操作: ```python import os import requests api_key = os.getenv('DEEPSEEK_API_KEY') base_url = "https://api.deepseek.com/v1" headers = { 'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json' } ``` #### 发送请求至 DeepSeek API 构建 HTTP 请求向指定端点发送数据,下面是一个简单的 POST 请求例子用来查询或处理某些任务。注意可以根据实际需求调整 URL 和 payload 参数[^2]。 ```python def call_deepseek_api(endpoint, data=None): url = f"{base_url}/{endpoint}" response = requests.post(url, headers=headers, json=data) if response.status_code == 200: return response.json() else: raise Exception(f"Error calling API: {response.text}") ``` #### 使用流式输出选项 如果希望接收实时更新的结果,则可以在发起请求时将 `stream=True` 添加到函数参数中以便启用流模式。 ```python def stream_call_deepseek_api(endpoint, data=None): url = f"{base_url}/{endpoint}" with requests.post(url, headers=headers, json=data, stream=True) as r: for line in r.iter_lines(): if line: print(line.decode()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dontla

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值