自ChatGPT 3.5/4 双双升级:更长,更便宜,更开放,更可控发出去之后,有朋友问怎么接入 API。
什么是函数调用?
函数调用指 Chat-GPT 模型会自动逻辑判断后,调用在代码中预先定义好的某个或者多个函数,获得返回的信息后,再用自然语言形式回复用户。
以官方的回答天气情况时,调用天气网站的提供的API来回答用户问题举例。
调用过程两部分:
一、定义函数,
functions = [
{
"name": "get_current_weather",
"description": "获取指定地点的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和州,例如:San Francisco, CA",
},
"unit": {"type": "string", "enum": ["washington", "boston"]},
},
"required": ["location"],
},
}
]
二、发消息给ChatGPT,模型决定要不要调用,调用则把外部API返回信息再发给模型,模型把包括函数返回信息的完整回复返回给用户。
全部完整代码如下:
import openai
import json
Import os
openai.api_key = os.getenv("OPENAI_API_KEY")
// 此函数为固定返回相同天气的示例的函数,实际应用中替换成你需要调用的外部API
def get_current_weather(location, unit="boston"):
"""获取指定地点的当前天气"""
weather_info = {
"location": location,
"temperature": "72",
"unit": unit,
"forecast": ["sunny", "windy"],
}
return json.dumps(weather_info)
def chat(content):
content = "What's the weather like in Boston?"
# 1:将用户的提问和函数定义发送给GPT
messages = [{"role": "user", "content": content}]
functions = [
{
"name": "get_current_weather",
"description": "获取指定地点的当前天气",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和州,例如:San Francisco, CA",
},
"unit": {"type": "string", "enum": ["washington", "boston"]},
},
"required": ["location"],
},
}
]
# 2:获取 GPT 的返回
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto", # 是否调用函数,auto是默认值,可以不指定
)
response_message = response["choices"][0]["message"]
# 3:GPT会判断是否需要调用函数,是则返回调用标记为真。
if response_message.get("function_call"):
# 4:调用函数
available_functions = {
# 此处可以多个函数
"get_current_weather": get_current_weather,
}
function_name = response_message["function_call"]["name"]
fuction_to_call = available_functions[function_name]
function_args = json.loads(response_message["function_call"]["arguments"])
# 5:获得函数返回信息
function_response = fuction_to_call(
location=function_args.get("location"),
unit=function_args.get("unit"),
)
# 6:用返回信息封装助手信息结构体
messages.append(response_message) # 将助手的回复加入对话
messages.append(
{
"role": "function",
"name": function_name,
"content": function_response,
}
)
# 7: 将封装好,包含函数返回信息再发送给GPT,并获得GPT自然语言形式的回答
second_response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
) # 从GPT获取一个新的响应,这个响应可以看到函数的响应
return second_response
# 输出应答
print(run_conversation())
整个用户交互及程序的流程如下:
用户问一个问题,例如“波士顿现在的天气怎么样?”
这个问题被发送给GPT模型,并告知其有一个可以调用的函数get_current_weather。
GPT模型确定它需要调用这个函数来回答用户的问题,所以它返回一个“函数调用”的请求,指定要调用的函数名称和参数。
代码中的运行会查找对应的函数(在这个例子中是get_current_weather),并用GPT模型指定的参数调用它。
函数返回天气信息,这个信息被发送回GPT模型。
GPT模型使用这个天气信息来生成一个回答,例如“波士顿现在的天气是晴朗的,温度是72度”。
也有朋友问:它实际应用场景是什么样的?
问了一下 ChatGPT:
填充模板:可以将特定的信息填充到预定义的模板中,生成个性化的文本,如生成定制化的邮件、通知或报告。
条件逻辑:用于在生成的文本中实现条件分支和逻辑判断,根据特定条件生成不同的文本输出,增强了文本的灵活性和可定制性。
变量和状态管理:可以引入变量和状态管理,使得文本可以跟踪和操作特定的信息,实现更加复杂的任务和交互。
上下文控制:可以在生成文本的过程中引入上下文信息,控制模型对上下文的理解和应答,提高文本的连贯性和一致性。
多模态输入和输出:可以实现多模态数据(如文本、图像、视频等)的输入和输出,更加丰富和多样化的文本生成和理解任务。
ChatGPT
官方给了三个应用场景举例:
创建聊天机器人通过调用外部工具来回答问题
将自然语言转换为 API 调用或数据库查询
从文本中提取结构化数据
我的回答是:例子里只是列举了一个查询天气状况的情况。实际上它有很多场景可以扩展。
chatGPT 模型本质还是一个通用AI模型,它的能力大多数表现文字和图片方面。其次它的知识需要训练,无法做到实时更新数据。虽然它有接近人类的逻辑推理能力,可以根据已知信息来推导问题答案。
应用场景的落地可以往两个方面扩展:
一、实时性的信息获取和加工。例如新闻,天气,交通状况,售票情况,停车位情况,航班情况,考试分数查询等等;
二、垂直领域的能力。例如调用别的人工智能机器人:阿尔法围棋(AlphaGo) 来陪你下棋,调用运输机器人帮你把货物运到目的地,调用专门法律政策类型的智能助手(这类方面问题因为安全和政策的原因,GPT的输出被限制了)帮你查询和准备资料等等。
关注我,领取九大类别,数百篇 AI 学习资源。
一起学习 ChatAI,掌握 AI 工具,不被时代淘汰。