DeepSeek Function Calling 实战

Function Calling 到底是干嘛的?

很多人以为 Function Calling 是让大模型“帮你去执行代码”,其实不对。

实际流程是这样:

  1. 你把本地函数(比如 get_weather)的描述(名字、参数格式)告诉模型。
  2. 用户问“北京天气咋样”,模型理解后返回一个 JSON:{"name":"get_weather","arguments":{"location":"北京"}}
  3. 你的本地代码收到这个 JSON,自己在沙盒环境里执行真正的 get_weather 函数。
  4. 把执行结果(比如 {"temp":22})再传回模型,模型组织成自然语言回答。

关键点:

  • 模型只输出 JSON 指令,不执行任何代码。
  • 真正的函数执行发生在你的本地环境(或任意安全沙盒)。
  • 传递的只是数据(JSON),不是可执行脚本。安全性由此而来——模型无法注入恶意代码。

所以 Function Calling 的本质是:大模型成为“任务调度器”,输出结构化指令,你用自己的环境执行


样例代码(DeepSeek 版)

import json
from openai import OpenAI

client = OpenAI(
    api_key="你的key",
    base_url="https://api.deepseek.com"
)

# 这是本地真正的函数
def get_weather(location: str):
    # 你可以调用真实 API,这里模拟
    return {"location": location, "temp": 22, "condition": "sunny"}

# 告诉模型:有这么一个工具
tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "查询指定城市的天气",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string", "description": "城市名"}
            },
            "required": ["location"]
        }
    }
}]

user_msg = "北京天气怎么样?"

# 第一次请求:模型判断是否需要调用工具
res = client.chat.completions.create(
    model="deepseek-v4-flash",
    messages=[{"role": "user", "content": user_msg}],
    tools=tools,
    tool_choice="auto"
)

msg = res.choices[0].message

if msg.tool_calls:
    for tc in msg.tool_calls:
        # 解析模型返回的 JSON 参数
        args = json.loads(tc.function.arguments)
        # 本地执行真正的函数
        result = get_weather(**args)
        
        # 第二次请求:把执行结果交给模型生成最终回答
        final = client.chat.completions.create(
            model="deepseek-v4-flash",
            messages=[
                {"role": "user", "content": user_msg},
                msg,
                {"role": "tool", "tool_call_id": tc.id, "content": json.dumps(result)}
            ]
        )
        print(final.choices[0].message.content)
else:
    print(msg.content)

模型返回的 JSON 如下:

{
  "name": "get_weather",
  "arguments": "{\"location\":\"北京\"}"
}

本地工程拿到后,程序去调用 get_weather("北京")函数。

在这里插入图片描述


为什么这个设计很重要?

  • 安全:模型只输出 JSON,不会让你 eval("rm -rf /")。执行权完全在你手里。
  • 灵活:你可以让模型调度任何本地工具(查数据库、调 API、发邮件、控制硬件),模型只负责“说该干什么”,实际怎么做你说了算。
  • 可扩展:加一个新工具,只需要把它的描述(JSON Schema)丢给模型,不需要改模型的代码。

迁移到 DeepSeek 的两步

# 1. 改 base_url
# 2. 改 model 名称
client = OpenAI(
    base_url="https://api.deepseek.com",
    api_key="你的key"
)
# model 用 deepseek-v4-flash 或 deepseek-v4-pro

其他和 OpenAI 一模一样。


总结

Function Calling = 大模型输出 JSON 命令,你本地执行真正的函数。模型不跑代码,只做调度。

这才是它的本质。搞清楚这点,你就知道为什么它既强大又安全了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐