怎么使用 OpenAI Function Calling 功能定义自定义函数参数

文章导读
OpenAI Function Calling 定义自定义函数参数需在 API 请求的 tools 字段中传入符合 JSON Schema 格式的函数描述,包含名称、描述及参数类型约束。该机制适用于让模型识别意图并生成结构化调用请求,但模型本身不执行代码。
📋 目录
  1. 快速处理思路
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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 的响应。

怎么使用 OpenAI Function Calling 功能定义自定义函数参数

3. 开发者执行函数:后端解析模型返回的函数名和参数,执行真实的 Python 函数或 API 请求。

4. 模型处理结果:将函数执行结果作为新的消息输入模型,模型综合结果生成最终自然语言回复。

怎么验证是否生效

检查 API 响应中的 choices[0].finish_reason 字段是否为 tool_calls,确认 tool_calls 数组中包含预期的函数名和参数。验证生成的参数是否符合定义的 JSON Schema 类型,例如字符串、枚举值或必填字段是否存在。若开启 strict 模式,模型参数将严格匹配架构,可通过比对输入 schema 与输出参数进行验收。

常见坑

模型不会自行执行函数,若后端未解析 tool_calls 并执行代码,用户将看不到实际结果。参数命名需与代码实现一致,否则后端无法映射函数。strict 模式需模型支持,旧版本模型可能忽略该字段。函数描述过于模糊会导致模型调用意图不准确,需详细写明何时使用该功能。

常见问题

模型会直接执行我定义的函数吗?

不会,模型只生成调用指令,实际执行需开发者在后端完成。

怎么使用 OpenAI Function Calling 功能定义自定义函数参数

strict 参数的作用是什么?

开启 strict: true 后,结构化输出确保模型生成的参数完全符合提供的 JSON 架构。

函数定义应该放在哪个参数里?

函数定义需放在 API 请求的 tools 参数中,旧版 API 曾使用 functions 参数。

参考来源

OpenAI Function Calling 全解析:从函数定义到流式调用

AI - Function-Call 函数调用_openai function call 文档-CSDN 博客

OpenAI Function Calling 技术原理与实践详解

来自 OpenAI 官网的 Function calling 介绍与最佳实践