函数调用
了解如何将大型语言模型连接到外部工具。
介绍
在 API 调用中,您可以描述函数并且模型可以智能地选择输出一个或多个函数调用的 JSON 对象。Chat Completions API 不会调用函数;而是模型生成符合自定义架构的 JSON,您可以在代码中使用该 JSON 来调用函数。
最新的模型(gpt-4o
,gpt-4-turbo
和 gpt-3.5-turbo
)已经进行了训练,以检测到当前输入是否需要调用函数,并且更准确地遵循函数签名。但是,这种能力也带来了潜在的风险。我们强烈建议在执行可能对用户产生影响的操作之前,建立用户确认流程(例如发送电子邮件,在网上发布内容,进行购买等)。
常见用例
函数调用允许您更可靠地从模型中获取结构化的数据。例如,您可以:
- 创建助手,以调用外部 API 来回答问题。例如,定义函数如
send_email(to: string, body: string)
或get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
。 - 将自然语言转换为 API 调用。例如,将“谁是我们的顶级客户?”转换为
get_customers(min_revenue: int, created_before: string, limit: int)
并调用您的内部 API。 - 从文本中提取结构化的数据。例如,定义一个名为
extract_data(name: string, birthday: string)
或sql_query(query: string)
的函数。
... 等等!
基本的函数调用步骤如下:
- 使用用户查询和在
functions
参数中定义的一组函数调用模型。 - 如果模型选择调用一个或多个函数,内容将是一个符合自定义架构的字符串化 JSON 对象(注意:模型可能会幻觉参数)。
- 在代码中将字符串解析为 JSON,并使用提供的参数调用函数(如果存在)。
- 通过将函数响应追加为新消息来再次调用模型,并让模型将结果汇总回给用户。
支持的模型
并非所有的模型版本都经过了函数调用的训练。函数调用支持以下模型:gpt-4o
,gpt-4o-2024-05-13
,gpt-4-turbo
,gpt-4-turbo-2024-04-09
,gpt-4-turbo-preview
,gpt-4-0125-preview
,gpt-4-1106-preview
,gpt-4
,gpt-4-0613
,gpt-3.5-turbo
,gpt-3.5-turbo-0125
,gpt-3.5-turbo-1106
和 gpt-3.5-turbo-0613
。
此外,并行函数调用在以下模型上受到支持:gpt-4o
,gpt-4o-2024-05-13
,gpt-4-turbo
,gpt-4-turbo-2024-04-09
,gpt-4-turbo-preview
,gpt-4-0125-preview
,gpt-4-1106-preview
,gpt-3.5-turbo-0125
和 gpt-3.5-turbo-1106
。
函数调用行为
默认情况下,tool_choice
为 tool_choice: "auto"
,模型可以决定是否调用函数以及如果要调用的话,哪些函数要调用。
我们提供了三种方式来自定义默认行为,具体取决于您的用例:
- 要强制模型始终调用一个或多个函数,可以将
tool_choice: "required"
。模型将选择要调用的函数。 - 要强制模型仅调用一个特定的函数,可以将
tool_choice: {"type": "function", "function": {"name": "my_function"}}}
。 - 要禁用函数调用并强制模型仅生成面向用户的消息,可以将
tool_choice: "none"
。
并行函数调用
并行函数调用是模型的能力,即可以同时执行多个函数调用,并且可以在减少与 API 的往返次数的同时解决这些函数调用的效果和结果。例如,模型可能会调用函数来同时获取산 Francisco,东京和巴黎的天气,然后在将函数响应发送回模型之后,模型可以决定下一步的操作。它可能会选择再次调用函数,或者可能会生成一个面向用户的消息,告诉用户산 Francisco,东京和巴黎的温度。
在这个例子中,我们定义了一个名为 get_current_weather
的函数。模型调用了这个函数多次,然后我们将函数响应发送回模型,并让它决定下一步的操作。它生成了一个面向用户的消息,告诉用户산 Francisco,东京和巴黎的温度。
请注意,在实际的应用中,您可能需要为每个函数调用创建一个单独的线程或进程,以便于同时执行这些函数调用。此外,并行函数调用可能会导致更高的令牌消耗量和更高的延迟,具体取决于函数的复杂性和所使用的模型。
您可以在 OpenAI Cookbook 中了解更多关于函数调用的示例:如何使用聊天模型调用函数
令牌
函数在底层被注入到系统消息中,并且模型已经对其进行了训练。这意味着函数会计入模型的上下文限制,并且会被视为输入令牌进行计费。如果遇到上下文限制,我们建议限制函数的数量或者为函数参数提供的文档的长度。
也可以使用微调来减少所使用的令牌数量,如果您有许多要定义的函数。