DeepSeek API Function Calling 实战:让 V4-Pro 学会调用你的函数
Function Calling(函数调用)是把大模型从"聊天框"变成"能干活的智能体"的关键一环:模型负责决定何时调用、传什么参数,你的代码负责真正执行。本篇用 DeepSeek 官方 API(OpenAI 兼容格式)以 deepseek-v4-pro 为例,从零跑通一个最小可用的函数调用流程。API 定价与选型见V4-Pro-0813 接入与比价,首次配置 API Key 可先过一遍Python 快速入门。
准备工作
安装 OpenAI 官方 SDK 并配置密钥(DeepSeek API 兼容 OpenAI 接口格式):
pip install openai
export DEEPSEEK_API_KEY="你的密钥"
第一步:定义工具并声明给模型
工具用 JSON Schema 描述名称、用途与参数。示例定义一个查天气函数:
import json
import 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", "description": "城市名,如 北京"},
},
"required": ["city"],
},
},
}]
def get_weather(city: str) -> str:
# 这里换成你的真实数据源;示例返回固定值
return json.dumps({"city": city, "temp_c": 22, "cond": "多云"}, ensure_ascii=False)
第二步:处理 tool_calls 循环
模型返回 tool_calls 时,执行函数并把结果以 role=tool 消息回传,直到模型给出自然语言回答:
messages = [{"role": "user", "content": "北京现在多少度?穿什么合适?"}]
while True:
resp = client.chat.completions.create(
model="deepseek-v4-pro",
messages=messages,
tools=tools,
temperature=0,
)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls:
print(msg.content)
break
for tc in msg.tool_calls:
args = json.loads(tc.function.arguments)
result = get_weather(args["city"])
messages.append({
"role": "tool",
"tool_call_id": tc.id,
"content": result,
})
三个常见的坑
一是参数是字符串不是对象——function.arguments 返回 JSON 字符串,务必 json.loads;二是工具结果要回传——拿到 tool_calls 后不回传结果就再次请求,模型会重复发起调用;三是描述决定准确率——description 写得越具体,模型选错工具或乱填参数的概率越低,必要时在描述里给出取值示例。
进阶方向
跑通单工具后,可以尝试多工具并行(一次返回多个 tool_calls)、把工具接到真实数据源(数据库、内部检索),或结合联网能力做一个实时问答智能体——我们此前用 Search 与 Fetch API 搭过轻量联网问答,两者组合即是完整的 RAG 加工具链。若要处理图片输入,参考视觉能力教程。
大模型网摘