OpenAI Function Calling:工具调用与结构化输出
Function Calling(函数调用,也称工具调用)让模型提出结构化的函数名和参数,由你的服务端访问天气、订单、日历或数据库。模型不应直接执行代码;它只提出调用,服务端负责鉴权、校验、执行和返回结果。
1、声明一个最小工具
const tools = [{
type: "function",
name: "get_order_status",
description: "查询当前登录用户的一笔订单状态。",
parameters: {
type: "object",
properties: {
orderId: { type: "string" },
},
required: ["orderId"],
additionalProperties: false,
},
strict: true,
}];
工具描述要说明适用条件,参数 Schema 要限制类型、必填字段和额外字段。即使启用严格模式,服务端仍需检查订单是否属于当前用户,不能信任模型提供的任意 ID。
2、完成工具调用循环
第一次请求可能返回 function_call 项。服务端按允许列表匹配工具名,解析并验证参数,执行业务函数,然后使用与调用关联的 function_call_output 把结果提交回模型。工具失败时返回明确、有限的错误信息,并限制最大循环次数。
退款、删除、发信和创建订单等写操作必须重新鉴权,向用户展示动作与关键参数并获得确认。不要直接执行模型生成的 SQL、Shell 命令或任意 URL。
3、Structured Outputs 解决什么问题
如果目标只是让模型返回固定 JSON,不需要执行外部动作,应使用 Structured Outputs。它通过 JSON Schema约束字段、枚举和必填项,让程序更容易解析。格式符合 Schema 不代表业务结论正确,服务端还要检查日期、金额、权限和事实来源。
工具调用解决“模型需要访问什么能力”,结构化输出解决“模型结果如何交给程序”。二者可以组合,但不要把每个简单分类任务都设计成外部函数。下一页讨论何时值得使用微调。