Openai 的 API 现在可以进行函数调用,真正接入了互联网。这是打算撇弃插件了?
2023年6月13日,openai.com 官方网站进行了新的技术更新,提到了函数调用的新功能。
参考链接:函数调用和其他 API 更新 (openai.com)
具体指导在:GPT – OpenAI API
函数调用
开发人员现在可以将函数描述为 gpt-4-0613
和 gpt-3.5-turbo-0613
,并让模型智能地选择输出包含参数的 JSON 对象来调用这些函数。这是一种将 GPT 的功能与外部工具和 API 更可靠地连接起来的新方法。
这些模型已经过微调,既可以检测何时需要调用函数(取决于用户的输入),又可以使用符合函数签名的 JSON 进行响应。函数调用允许开发人员更可靠地从模型中获取结构化数据。例如,开发人员可以:
- 创建聊天机器人,通过调用外部工具(例如,ChatGPT 插件)来回答问题
将诸如“向 Anya 发送电子邮件以查看她是否想在下周五喝咖啡”之类的查询转换为类似 的函数调用,或将“波士顿的天气怎么样?”转换为 。send_email(to: string, body: string)
get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
- 将自然语言转换为 API 调用或数据库查询
将“本月我的十大客户是谁?”转换为内部 API 调用,例如 ,或将“Acme, Inc. 上个月下了多少订单?”转换为使用 SQL 查询。get_customers_by_revenue(start_date: string, end_date: string, limit: int)
sql_query(query: string)
- 从文本中提取结构化数据
定义一个名为 的函数,以提取维基百科文章中提到的所有人。extract_people_data(people: [{name: string, birthday: string, location: string}])
这些用例由端点中的新 API 参数启用,并且允许开发人员通过 JSON 架构向模型描述函数,并选择性地要求它调用特定函数。开始使用我们的/v1/chat/completionsfunctionsfunction_call
开发人员文档和添加埃瓦尔斯如果您发现函数调用可以改进的情况.
Function calling example 函数调用示例
问题:
1 2 |
What’s the weather like in Boston right now? 波士顿 现在的天气怎么样? |
步骤 1·OpenAI API
1 2 |
Call the model with functions and the user’s input 使用函数和用户的输入调用模型 |
Request 请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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"] } } ] }' |
1 2 3 4 5 |
<strong>注解</strong>,函数的主要功能是获取给定位置的天气情况。 通过自然语言询问,OpenAI, 给出给定地点的城市和州 这里询问的是 Boston 波士顿(美国麻萨诸塞州港市) celsius - 摄氏度, fahrenheit - 华氏温度 最后要求返回 <strong>location</strong> |
Response 响应
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "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" }] } |
1 2 |
<strong>注解</strong>,OpenAI根据提示样例(San Francisco, CA), 返回了 location: Boston, MA, 而这个localtion 是json格式,正好可以给第三方API使用,下面使用的是weatherapi.com 的api |
步骤 2·Third party API
1 2 |
Use the model response to call your API 使用模型响应调用 第三方 API |
Request 请求(请求第三方)
1 2 3 |
curl https://weatherapi.com/... curl http://api.weatherapi.com/v1/current.json?key=<YOUR_API_KEY>&q=Boston,%20MA |
Response 响应(第三方响应)
1 |
{ "temperature": 22, "unit": "celsius", "description": "Sunny" } |
1 |
注解,第三方也返回了json 格式。 |
步骤 3·OpenAI API
1 2 3 |
Send the response back to the model to summarize 将响应发送回模型进行汇总 |
Request 请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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"] } } ] }' |
1 |
<strong>注解:</strong> 用户向 openai api 提供了上下文,包括第三方(function)的返回 |
Response 响应
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "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" }] } |
自然语言的响应
1 2 |
The weather in Boston is currently sunny with a temperature of 22 degrees Celsius. 波士顿的天气目前晴朗,气温为22摄氏度。 |
1 2 3 4 5 6 |
<strong>注解:</strong>到这里,通过自然语言的转换,终于完成自然语言对话。 1.用户把问题和函数功能交给openai; 2.openai 通过 json格式返回能处理的问题(比如,一个模糊的地点,转换为准确的城市和州); 3.用户通过返回的具体答案,调用自己的数据库,或是第三方api,获取json格式的数据; 4.把上下文和返回的json数据汇总给openai; 5.openai 通过自然语言返回用户提出的问题。 |
1 2 |
通过函数这种方法,openai api 就真正连上了互联网,openai的插件功能可能就不香了。 |