ByteNoteByteNote
ChatGPT 函数调用实战:让对话模型接入实时外部数据
字

字节笔记本

2026年10月6日 · 约 7 分钟读完

ChatGPT 函数调用实战:让对话模型接入实时外部数据

API中转
¥120

对话式 AI 已经能写文章、改代码、做翻译,但很多人在实际使用中都遇到过同一个尴尬:问它「现在北京天气怎么样」「某某公司股价多少」,模型要么答非所问,要么坦承自己不知道。原因并不复杂:模型的知识来自训练语料,存在时间截止点,也无法主动联网获取最新数据。Function Calling,中文常称函数调用或工具扩展,正是为解决这一问题而设计的机制:模型在对话中负责理解意图并提出请求,由外部程序执行真正的查询动作,再把结果交回给模型,组织成最终回答。

一、模型为什么会「不知道」

ChatGPT 的对话与理解能力已经相当出色,但它的知识被固定在训练数据里。天气、股价、汇率、赛事比分这类实时信息随时在变,单靠模型本身无法给出准确答复,这直接限制了它在真实业务场景中的可用性。要让模型更好地服务用户,就要给它配上可以动态获取外部信息的工具,让它开口之前先去查一下真实世界。

二、函数怎么定义

在 API 层面,函数以结构化格式定义,包含名称、描述、参数等关键信息。下面是一个查询天气函数的定义示例:

python
tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "Get weather of an location, the user should supply a location first",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    }
                },
                "required": ["location"]
            },
        }
    },
]

其中 name 是函数名,description 告诉模型这个函数做什么、什么时候该用,parameters 则用 JSON Schema 描述入参,required 声明哪些参数必须提供。description 写得越清楚,模型判断得越准。定义好之后,模型会根据对话上下文自动判断是否需要调用、调用哪一个。

三、一次完整调用的五个步骤

ChatGPT 函数调用五步流程示意

函数调用的完整流程可以拆成五步:

  1. 模型分析用户请求,判断是否需要调用函数;
  2. 如需调用,模型生成一个结构化的函数调用请求并返回;
  3. 程序提取该请求,执行对应的函数逻辑,比如真正去请求天气接口;
  4. 把函数返回结果追加到对话上下文中;
  5. 再次调用模型,让它结合函数结果生成最终回答。

整个过程中,模型本身并没有执行任何代码,它只负责决定调用什么、传什么参数,以及解读返回结果,真正的执行动作发生在开发者自己的程序里。这也是函数调用机制的安全边界:执行权始终留在程序一侧。

四、程序侧如何处理

在程序侧,需要解析模型返回的调用请求,分发到对应的本地函数,再把结果写回消息列表。示意代码如下:

python
tool_calls = message.get("tool_calls", [])

for tool_call in tool_calls:
    tool_name = tool_call["tool_name"]
    parameters = tool_call["parameters"]

    if tool_name == "get_weather":
        location = parameters.get("location")
        weather_result = get_weather_data(location)
        tool_response = {"role": "function", "content": weather_result}
        messages.append(tool_response)

message = send_messages(messages)
print(f"ChatGPT: {message.content}")

这段代码遍历模型返回的 tool_calls,按函数名分发执行,将结果以消息形式追加进上下文,最后再次请求模型,输出面向用户的最终回答。不同版本的 API 对字段命名的细节略有差异,但这套「解析请求、执行函数、回填结果、再次生成」的思路是一致的。

五、三个典型场景

函数调用三个典型场景与分工要点

  • 实时天气:定义 get_weather 函数后,模型可以查询指定城市的实时天气,为用户提供准确的气象信息。
  • 股价查询:定义 get_stock_price 函数,模型能快速返回特定公司股票的实时价格,方便用户了解市场行情。
  • 数学计算:calculate_expression 函数让模型具备处理复杂数学运算的能力,用户可以直接在对话中完成各类计算任务。

这三个场景有一个共同点:答案依赖模型训练数据之外的信息,或者依赖精确计算。凡是落在这些范围里的需求,都适合用函数调用补足。

六、优势与展望

函数调用带来的变化是实打实的:它极大拓展了对话模型的应用场景,让回答从凭训练记忆作答变成带实时数据作答,准确性和时效性明显提升,模型也因此更像一个真正可用的智能助手,而不只是一个聊天玩具。

往远处看,随着可调用函数的不断丰富,对话模型有望成长为集聊天、任务处理、数据查询等多种功能于一体的平台:订机票、查库存、控设备,都可能是未来对话界面背后的一次函数调用。对开发者而言,早一点熟悉这套定义函数、解析请求、回填结果的范式,就是在为下一代 AI 应用打底。

工具扩展是让 ChatGPT 走向实用化的重要一步。当你下一次发现模型「不知道」某件事时,不妨想一想:也许该给它配一个函数了。

相关文章

分享: