https://platform.openai.com/docs/api-reference/chat/get
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": "What is the weather like in Boston today?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
}
}
}
],
"tool_choice": "auto"
}'
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1699896916,
"model": "gpt-4o-mini",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_current_weather",
"arguments": "{\n\"location\": \"Boston, MA\"\n}"
}
}
]
},
"logprobs": null,
"finish_reason": "tool_calls"
}
],
"usage": {
"prompt_tokens": 82,
"completion_tokens": 17,
"total_tokens": 99,
"completion_tokens_details": {
"reasoning_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
}
}
-------------------------------------------------------------------------------------------------------
你提到的这个 JSON 结构描述了一个工具调用(tool call)的定义,具体是一个名为 get_current_weather
的函数。这个函数的作用是获取某个地点的当前天气信息。不过,你提到“不联网”时,可能是在疑惑:如果模型无法联网,它如何调用这个函数?
让我详细解释一下这个机制。
在现代语言模型中,工具调用是一种让模型与外部系统或 API 交互的方式。这些工具通常由开发者预先定义,并通过某种接口(如 API 或函数调用)与模型集成。
工具定义: 在你的例子中,get_current_weather
是一个工具,它的输入参数包括:
location
(必填):指定地点,例如 "San Francisco, CA"。unit
(可选):温度单位,可以是摄氏度(celsius
)或华氏度(fahrenheit
)。工具调用: 当模型生成输出时,它可以决定是否调用某个工具。例如,如果用户问:“旧金山现在多少度?” 模型可能会生成类似以下的工具调用请求:
json深色版本
{
"tool_calls": [
{
"id": "call_123",
"type": "function",
"function": {
"name": "get_current_weather",
"arguments": "{\"location\": \"San Francisco, CA\", \"unit\": \"celsius\"}"
}
}
]
}
重点来了:模型本身并不会直接执行工具调用。它的任务只是根据输入生成一个工具调用的请求(如上面的 JSON)。实际的工具调用是由外部系统(比如你的应用程序、API 网关或其他服务)来完成的。
模型的角色: 模型根据用户的输入和上下文,生成一个合理的工具调用请求。例如,用户问天气时,模型会生成一个调用 get_current_weather
的请求。
外部系统的角色: 外部系统接收到模型生成的工具调用请求后,负责执行实际的逻辑。例如,外部系统可能会调用一个天气 API 来获取实时天气数据。
如果你运行的环境没有联网,或者没有实现工具调用的逻辑,那么即使模型生成了工具调用请求,也无法真正获取结果。这种情况下,模型的行为取决于你的实现方式:
默认行为: 如果工具调用失败(例如没有联网或 API 不可用),外部系统可能会返回一个错误消息,或者简单地忽略工具调用。
回退策略: 你可以为工具调用设计回退策略。例如,如果无法获取天气信息,模型可以生成一个通用的回答,比如:
"抱歉,我目前无法获取实时天气信息,但你可以尝试使用其他方式查询。"
离线模式: 如果你的应用完全离线运行,那么工具调用功能将不可用。此时,你需要明确告诉用户模型的能力范围,避免让用户误以为模型可以直接访问外部资源。
-----------------------------------------------------------------------------------------------------
你提到:
get_current_weather
)。虽然从表面上看,输入和输出似乎可以直接映射到工具调用,但实际上,模型在中间起到了至关重要的作用。以下是详细原因:
location
和 unit
)。模型需要从用户输入中提取这些参数。location
是 "Boston, MA",并可能默认 unit
为摄氏度或华氏度。如果完全跳过模型,直接基于输入执行工具调用,可能会遇到以下问题:
location
参数。虽然从表面上看,输入和输出似乎可以直接对应到工具调用,但实际上,模型在中间起到了理解用户意图、提取参数、管理上下文和处理错误的关键作用。如果没有模型的参与,系统会变得非常脆弱,难以应对复杂的用户输入和多样的场景。
因此,即使输入和输出看似简单,模型仍然是不可或缺的一部分。它确保了系统的鲁棒性和用户体验的流畅性。