DeepSeek 的 Function Calling(当前官方文档称 Tool Calls)不是让模型直接执行你的函数,而是让模型返回“想调用哪个工具、参数是什么”。你的程序必须校验参数、真正执行函数,再把结果作为 tool 消息回传,模型才会生成最终回答。
先理解完整闭环
- 程序在
tools中声明函数名称、用途和 JSON 参数结构。 - 用户提问后,模型在
message.tool_calls中提出调用请求。 - 程序解析并验证
function.arguments,执行本地函数或受控 API。 - 程序把原 assistant 消息和带
tool_call_id的工具结果追加到消息历史。 - 再次请求模型,得到面向用户的自然语言回答。
这与 DeepSeek 官方Tool Calls 指南中的流程一致;具体请求字段可继续对照Chat Completion 接口。

可运行的最小 Python 结构
先安装当前版 OpenAI Python SDK,并把 DEEPSEEK_API_KEY 放入环境变量。示例用固定字典模拟天气查询,不访问真实天气服务,因此结果只是演示数据。
import json, os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DEEPSEEK_API_KEY"],
base_url="https://api.deepseek.com",
)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的演示天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
"additionalProperties": False
}
}
}]
messages = [{"role": "user", "content": "杭州天气怎样?"}]
first = client.chat.completions.create(
model="deepseek-flash", messages=messages, tools=tools
)
assistant_msg = first.choices[0].message
messages.append(assistant_msg)
for call in assistant_msg.tool_calls or []:
if call.function.name != "get_weather":
raise ValueError("未允许的工具")
args = json.loads(call.function.arguments)
if args.get("city") != "杭州":
raise ValueError("城市参数未通过校验")
result = {"city": "杭州", "temperature": "24℃", "source": "demo"}
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": json.dumps(result, ensure_ascii=False)
})
final = client.chat.completions.create(
model="deepseek-flash", messages=messages, tools=tools
)
print(final.choices[0].message.content)
模型名称以账号当前可用列表和官方文档为准。示例中的 deepseek-flash、温度和来源均不代表真实天气或你的实际调用结果。
怎样验证工具确实被调用
- 第一轮应出现非空
tool_calls,其中名称恰好为允许的get_weather。 arguments必须能解析为 JSON,且只包含 schema 允许的字段。- 工具执行日志应有调用 ID、工具名、脱敏参数和成功/失败状态,不能只看模型最后一句话。
- 最终回答中的城市、温度和来源应与工具返回一致;故意让工具返回错误时,程序应明确失败或把错误回传,不能编造成功结果。
生产环境必须补上的安全检查
函数名要用白名单映射,不能把模型返回的名称拼进 shell 命令或数据库语句。参数需做类型、长度、枚举、权限和资源归属校验;涉及付款、发信、删数据等写操作,还需要用户确认、幂等键和审计记录。模型提出调用不等于获准执行。
工具超时或外部系统返回未知结果时,把状态写成失败或待核实,再把可读错误交给模型。不要把异常吞掉后返回一个“执行成功”的字符串。
常见失败边界
模型可能不调用工具、一次提出多个调用、给出缺字段或格式错误的参数;程序都要有分支处理。并非所有模型、模式和参数组合都支持相同工具能力。本文根据 2026-10-01 官方文档整理,未用你的 Key 实际请求,也未连接真实天气 API;请先用无副作用的模拟函数通过全流程,再接业务系统。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32919.html