OpenAI Function Calling 定义自定义函数参数需在 API 请求的 tools 字段中传入符合 JSON Schema 格式的函数描述,包含名称、描述及参数类型约束。该机制适用于让模型识别意图并生成结构化调用请求,但模型本身不执行代码。
先说结论:通过 tools 参数注册 JSON Schema 定义的函数,模型据此生成调用参数,开发者需在后端执行实际逻辑。
- 适合需要模型获取实时数据、执行特定操作或结构化提取数据的场景。
- 先看函数定义的 parameters 结构是否完整,确保 required 字段和类型描述准确。
- 建议在函数定义中开启 strict: true 确保模型生成的参数完全符合 JSON 架构。
快速处理思路
在调用 Chat Completions API 时,将函数定义放入 tools 数组,每个函数包含 type、name、description 和 parameters。以下为标准定义示例:
{
"type": "function",
"name": "get_weather",
"description": "获取指定地点的当前气温",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和国家,例如:Bogotá, Colombia"
}
},
"required": ["location"],
"additionalProperties": false
},
"strict": true
}将该对象放入请求体的 tools 字段,模型返回的 tool_calls 中将包含符合此 schema 的参数。
为什么会这样
Function Calling 本质是让大模型从纯文本生成进化为可行动的智能体,但模型只负责生成调用指令而非执行代码。开发者声明可用函数后,模型根据上下文判断是否需要调用,并输出包含函数名和参数的结构化数据。实际调用、安全校验和错误处理均由开发者系统完成,模型仅生成自然语言回复或调用请求。
分步处理
1. 注册函数:在 API 请求的 tools 参数中定义函数名称、描述和 JSON Schema 参数,确保类型和必填项清晰。
2. 模型决定调用:发送用户请求,模型根据上下文判断是否调用函数,返回 finish_reason 为 tool_calls 的响应。
3. 开发者执行函数:后端解析模型返回的函数名和参数,执行真实的 Python 函数或 API 请求。
4. 模型处理结果:将函数执行结果作为新的消息输入模型,模型综合结果生成最终自然语言回复。
怎么验证是否生效
检查 API 响应中的 choices[0].finish_reason 字段是否为 tool_calls,确认 tool_calls 数组中包含预期的函数名和参数。验证生成的参数是否符合定义的 JSON Schema 类型,例如字符串、枚举值或必填字段是否存在。若开启 strict 模式,模型参数将严格匹配架构,可通过比对输入 schema 与输出参数进行验收。
常见坑
模型不会自行执行函数,若后端未解析 tool_calls 并执行代码,用户将看不到实际结果。参数命名需与代码实现一致,否则后端无法映射函数。strict 模式需模型支持,旧版本模型可能忽略该字段。函数描述过于模糊会导致模型调用意图不准确,需详细写明何时使用该功能。
常见问题
模型会直接执行我定义的函数吗?
不会,模型只生成调用指令,实际执行需开发者在后端完成。
strict 参数的作用是什么?
开启 strict: true 后,结构化输出确保模型生成的参数完全符合提供的 JSON 架构。
函数定义应该放在哪个参数里?
函数定义需放在 API 请求的 tools 参数中,旧版 API 曾使用 functions 参数。
参考来源
OpenAI Function Calling 全解析:从函数定义到流式调用
AI - Function-Call 函数调用_openai function call 文档-CSDN 博客
OpenAI Function Calling 技术原理与实践详解
来自 OpenAI 官网的 Function calling 介绍与最佳实践