跳到主内容
新主题测试

OpenAI Function Calling 实战:让模型自己调用你的函数

100%
OpenAI Function Calling 实战:让模型自己调用你的函数

一句话结论

OpenAI Function Calling(工具调用)让大模型在回答时「自己决定」要不要调用你提供的函数去查实时数据或执行动作,再把函数结果喂回模型生成最终回答。它把 AI 从只能聊天的文本盒,接成了能操作真实系统的Agent 入口。

它解决什么痛点

大模型的知识停在训练截止日,也不懂你系统里的订单、天气、库存。Function Calling 的思路是:你告诉模型「你拥有一组函数」,模型根据对话自行决定是否调用、填什么参数;你在应用侧执行函数,把结果回传,模型据此继续。整个循环由你的代码驱动,模型只负责「决策」和「填参」。

Function Calling 在 OpenAI 文档里也叫 Tool Calling,二者同义。它同时支持 Chat Completions 和更新的 Responses API。

五步调用循环

工具调用的本质,是应用与模型之间的一段多轮对话:

  1. tools 列表向模型发请求;
  2. 模型返回 tool_calls(要调哪个函数、参数是什么);
  3. 应用在本地执行该函数,拿到结果;
  4. 把结果以 role: "tool" + tool_call_id 回传模型;
  5. 模型给出最终回答(或继续发起下一次调用)。

最小可运行示例(Python)

下面用一个「查天气」函数演示完整闭环,参数用 JSON Schema 描述:

from openai import OpenAI
import json

client = OpenAI()

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "查询某地的当前天气",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string", "description": "城市名,如 北京"}
            },
            "required": ["location"],
            "additionalProperties": False
        },
        "strict": True
    }
}]

def get_weather(location):
    return f"{location}:晴,26℃"

messages = [{"role": "user", "content": "北京现在天气怎么样?"}]

# 1+2. 请求并拿到模型的函数调用
resp = client.chat.completions.create(
    model="gpt-5.6", messages=messages, tools=tools)
messages.append(resp.choices[0].message)

# 3. 应用侧执行
for call in resp.choices[0].message.tool_calls or []:
    if call.function.name == "get_weather":
        args = json.loads(call.function.arguments)
        result = get_weather(args["location"])
        # 4. 把结果回传
        messages.append({
            "role": "tool",
            "tool_call_id": call.id,
            "content": json.dumps({"weather": result}, ensure_ascii=False)
        })

# 5. 模型生成最终回答
final = client.chat.completions.create(
    model="gpt-5.6", messages=messages, tools=tools)
print(final.choices[0].message.content)

三个实战要点

1. 用 strict 模式锁死参数结构

给函数定义加 "strict": true,模型生成的参数保证符合你给的 JSON Schema,省去大量容错。若不用 structured output,务必像上面那样用 json.loads 解析并对参数做校验(Pydantic 等),避免脏参数炸掉函数。

2. 并行函数调用

当一句话需要查多个独立信息时,模型可一次发出多个 tool_calls。应用侧并行执行再逐个回传,能显著减少与 API 的往返次数。循环里用 for call in tool_calls 天然兼容单/多调用。

3. 工具太多就上 tool search

函数数量大、Schema 重时,可配合 tool search 把不常用的工具延迟加载,只在模型需要时注入。gpt-5.4 之后的模型支持该能力。

为什么用 role:tool 而不是把结果拼回 user?

tool 角色携带 tool_call_id,模型据此把「这次函数结果」精确对应到「那次调用」,保证多轮、多函数场景下上下文不串。直接拼回 user 消息会丢失这种对应关系,复杂链路里容易出错。

相关阅读

常见问题


Function Calling 和微调有什么区别?
微调改的是模型权重,适合固化风格/知识;Function Calling 不改权重,而是给模型「调用外部能力的开关」,适合接实时数据与动作,二者互补。

模型一定会调用我给的函数吗?
不一定。模型根据对话自行判断;你可以用 tool_choice 强制必须调用某个函数,或设为 “required” 强制至少调一个。

函数执行出错了怎么办?
把错误信息以 success:false 的形式回传模型(Agents API 场景),模型通常能自我纠正或更换参数重试,无需中断整个循环。

和 MCP 是什么关系?
MCP 是「工具/数据源」的标准协议,Function Calling 是模型调用工具的机制。MCP 暴露的能力,最终常封装成函数交给模型调用,两者是不同层。

查看 OpenAI 官方 Function Calling 指南
这篇有帮助吗?
云上的幻象
云上的幻象查看主页
1643文章4评论

相关文章

评论 (0)

发表回复

发表回复