OpenAI 今年早些时候发布了 gpt-3.5-turbo 和 gpt-4,并且在短短几个月内,开发者在这些模型上开发了很多令人印象深刻的应用。
6月13日, OpenAI 官宣了版本更新的内容:
Chat Completions API 中新增了函数调用功能。
更可控的 gpt-4 和 gpt-3.5-turbo 版本。
新增了 gpt-3.5-turbo的16k 上下文版本(之前为标准的4k版本)。
嵌入模型费用降低了75%。
gpt-3.5-turbo 的输入标记费用降低了25%。
gpt-3.5-turbo-0301 和 gpt-4-0314 模型的弃用时间表。
所有这些模型都遵守3月1日公布的数据隐私和安全保证:客户拥有其请求生成的所有输出,并且其 API 数据不会用于训练。
函数调用
开发者现在可以向 gpt-4-0613 和 gpt-3.5-turbo-0613 描述函数,并让模型智能地选择输出一个包含调用这些函数参数的JSON对象。这是一种新功能:将GPT的能力与外部工具和API连接起来。
这些模型经过了微调,既可以检测到需要调用函数的情况(根据用户的输入),也可以以符合函数签名的JSON形式进行响应。函数调用允许开发者更可靠地从模型获取结构化数据。例如,开发者可以:
1、创建聊天机器人通过调用外部工具来回答问题(例如ChatGPT插件)
将诸如“发送电子邮件给Anya,询问她是否下周五想喝咖啡”这样的查询转换为类似于send_email(to: string, body: string)的函数调用,或者将“波士顿的天气如何?”转换为get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')。
举个例子:如果问 Boston 现在的天气如何?通过函数调用让模型调用气候网站的数据来回答。
第一步:OpenAI API 使用函数和输入来调用模型
请求代码
curl https://api.openai.com/v1/chat/completions -u :$OPENAI_API_KEY -H 'Content-Type: application/json' -d '{"model": "gpt-3.5-turbo-0613","messages": [{"role": "user", "content": "What is the weather like in Boston?"}],"functions": [{"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"]}}]
}'
返回
Response
{"id": "chatcmpl-123",..."choices": [{"index": 0,"message": {"role": "assistant","content": null,"function_call": {"name": "get_current_weather","arguments": "{ \"location\": \"Boston, MA\"}"}},"finish_reason": "function_call"}]
}
第二步:第三方API 使用模型响应去调用API
请求:
curl https://weatherapi.com/...
返回:
{ "temperature": 22, "unit": "celsius", "description": "Sunny" }
第三步:OpenAI API 模型汇总响应返回给用户
请求:
curl https://api.openai.com/v1/chat/completions -u :$OPENAI_API_KEY -H 'Content-Type: application/json' -d '{"model": "gpt-3.5-turbo-0613","messages": [{"role": "user", "content": "What is the weather like in Boston?"},{"role": "assistant", "content": null, "function_call": {"name": "get_current_weather", "arguments": "{ \"location\": \"Boston, MA\"}"}},{"role": "function", "name": "get_current_weather", "content": "{\"temperature\": "22", \"unit\": \"celsius\", \"description\": \"Sunny\"}"}],"functions": [{"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"]}}]
}'
返回:
{"id": "chatcmpl-123",..."choices": [{"index": 0,"message": {"role": "assistant","content": "The weather in Boston is currently sunny with a temperature of 22 degrees Celsius.",},"finish_reason": "stop"}]
}
2、将自然语言转换为 API 调用或数据库查询
将“本月我的前十个客户是谁?”转换为类似于get_customers_by_revenue(start_date: string, end_date: string, limit: int)的内部API调用,或者将“上个月Acme公司下了多少订单?”转换为使用sql_query(query: string)的SQL查询。
3、从文本中提取结构化数据
可以定义一个名为extract_people_data(people: [{name: string, birthday: string, location: string}])的函数,用来提取出在维基百科文章中提到的所有人物。
functions 参数实际上就类似于用户要指定的 Agent。
注,这里可以是不止一个function,function 是一个对象,还可以加上名称(name)、描述(description)、参数(parameters)等等。
返回的结果包含了如下结构化的内容:
function_call:调用的函数名,和用户传入的函数名称一致
arguments:JSON格式的参数值,包含了用户调用函数需要的参数名称和值。
比如说:
"function_call": { "name": "get_current_weather", "arguments": "{ \"location\": \"Boston, MA\"}" }
升级后,简化了 agent 的操作,避免了以前在 Prompt 中去描述要提取信息的名称、参数等等。
通过 /v1/chat/completions 端点中的新API参数 functions 和 function_call 可以实现函数调用功能。开发者可以通过 JSON Schema 向模型描述函数,并可选择性地要求其调用特定函数。
同时 OpenAI 也提醒了这样做可能带来的风险:
“自从 ChatGPT 插件的 Alpha 版发布以来,我们对于使工具和语言模型安全地协同工作有了很多了解。然而,仍然存在一些开放的研究问题。例如,一个概念验证漏洞展示了不受信任的工具输出中的数据如何指示模型执行意外操作。我们正在努力减轻这些和其他风险。开发者可以通过仅使用来自可信工具的信息,并在执行具有现实影响的操作(例如发送电子邮件、在线发布或购买)之前,包含用户确认步骤来保护他们的应用程序。”
新的模型
GPT-4
gpt-4-0613 包含了一个经过更新和改进的模型,具备函数调用功能。
gpt-4-32k-0613 包含了与 gpt-4-0613 相同的改进,还具有更长的上下文长度,以更好地理解更大的文本。
GPT-3.5 Turbo
gpt-3.5-turbo-0613 具备与 GPT-4 相同的函数调用功能,以及通过系统消息实现更可靠的控制响应的能力。这两个功能使得开发者能够更有效地引导模型的回复。
gpt-3.5-turbo-16k 提供了比 gpt-3.5-turbo 更长4倍的上下文长度,价格为原价的两倍:输入标记每千个0.003美元,输出标记每千个0.004美元。16k上下文意味着该模型现在可以在单个请求中支持约20页的文本。
模型弃用
OpenAI 将开始升级和弃用在三月份宣布的 gpt-4 和 gpt-3.5-turbo 的初始版本。使用稳定模型名称(gpt-3.5-turbo、gpt-4和gpt-4-32k)的应用程序将在6月27日自动升级到上述新模型。为了比较不同版本的模型性能,OpenAI 的 Evals 库支持公开和私有评估,以展示模型变化对带来的影响。
需要更多过渡时间的开发者可以在API请求的 'model' 参数中指定 gpt-3.5-turbo-0301、gpt-4-0314 或 gpt-4-32k-0314 来继续使用旧模型。这些旧模型将在9月13日之后无法访问。