如何使用OpenAI推出功能函数调用功能?
使用OpenAI推出功能函数调用功能
北京时间2023年6月14号,openai发布了一则更新公告,总结出来的信息如下。
- 在CHAT API 中新增了函数调用功能。
- 更新并增强了gpt-4和gpt-3.5-turbo的版本。
- gpt-3.5-turbo新增了一个16k上下文版本(相对于标准的4k版本)。
- 最新向量text-embedding-ada-002模型降价75%。
- gpt-3.5-turbo降价25%。
- 宣布了gpt-3.5-turbo-0301和gpt-4-0314模型的停用时间表。
函数调用
代码示例
OpenAI的最新函数调用功能为开发者提供了一种在对话模型中集成自定义函数的方式,从而实现更复杂和有针对性的功能。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import openai
import json
# 定义一个函数,用于获取天气信息
def get_current_weather(location, unit="fahrenheit"):
"""获取给定城市的天气信息"""
weather_info = {
"location": location,
"temperature": "72",
"unit": unit,
"forecast": ["晴朗", "温暖"],
}
return json.dumps(weather_info)
# 第一步,向openai发送消息和定义函数信息
def run_conversation():
openai.api_key = "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"
openai.proxy = "http://127.0.0.1:10809"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": "今天广州的天气怎么样?"}],
functions=[
{
"name": "get_current_weather",
"description": "获取当前地区天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "输入城市和地区",
},
"unit": {"type": "string", "enum": ["摄氏", "华氏"]},
},
"required": ["location"],
},
}
],
function_call="auto",
)
message = response["choices"][0]["message"]
# 第二步,检查模型是否需要调用函数
if message.get("function_call"):
function_name = message["function_call"]["name"]
# 第三步,调用函数
function_response = get_current_weather(
location=message.get("location"),
unit=message.get("unit"),
)
# 第四步,向模型发送函数调用和函数返回值
second_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[
{"role": "user", "content": "今天广州的天气怎么样?"},
message,
{
"role": "function",
"name": function_name,
"content": function_response,
},
],
)
return second_response
print(run_conversation())
# 输出了:今天广州的天气是晴朗的,温度为72°F,温暖舒适。
下面我们详细介绍如何使用该功能。
- 首先,我们定义了一个名为
get_current_weather
的函数,用于获取指定城市的天气信息。该函数接受两个参数,location
表示城市和地区,unit
表示温度单位,默认为华氏温度。函数内部生成了一个天气信息的字典,并使用json.dumps
方法将其转换为JSON格式的字符串进行返回。 - 接下来,我们使用OpenAI提供的Python库进行函数调用。我们首先设置OpenAI的API密钥和代理(可选),确保与OpenAI的服务进行通信。
- 然后,我们使用
openai.ChatCompletion.create
方法发送消息和定义函数信息。其中,model
参数指定了使用的模型版本,这里选择了”gpt-3.5-turbo-0613”。messages
参数用于传递对话的历史记录,我们将用户的问题”今天广州的天气怎么样?”作为对话的起始。在functions
参数中,我们定义了一个函数对象,包括函数的名称、描述和参数信息。函数名称为”get_current_weather”,描述为”获取当前地区天气”。参数信息使用JSON格式进行描述,包括参数类型、属性和是否必需等信息。最后一个参数function_call
设置为”auto”,表示让模型自动确定是否需要调用函数。 - 接下来,我们获取OpenAI返回的回复消息,并检查是否需要调用函数。如果需要调用函数,则根据消息中的函数调用信息获取函数名称。然后,我们根据函数调用信息调用
get_current_weather
函数,并传入对应的参数。注意,我们从消息中获取参数的值,这里是message.get("location")
和message.get("unit")
。 - 接下来,我们将函数调用和返回值作为一条新的消息,再次使用
openai.ChatCompletion.create
方法向模型发送对话历史记录。这次对话历史包括用户的问题、前一次的回复消息和函数调用的返回值。 - 最后,我们打印出第二次调用的返回结果,即获取到的天气信息。
在本示例中,最终的输出结果是:”今天广州的天气是晴朗的,温度为72°F,温暖舒适。”这是通过调用get_current_weather
函数获取到的天气信息。
本作品采用《CC 协议》,转载必须注明作者和本文链接