查看原文
其他

ChatGPT 更新:大杀器!函数调用示范

黄勇 技术人生黄勇 2023-11-10

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 openaiimport jsonImport osopenai.api_key = os.getenv("OPENAI_API_KEY")
// 此函数为固定返回相同天气的示例的函数,实际应用中替换成你需要调用的外部APIdef 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())


整个用户交互及程序的流程如下:

  1. 用户问一个问题,例如“波士顿现在的天气怎么样?”

  2. 这个问题被发送给GPT模型,并告知其有一个可以调用的函数get_current_weather。

  3. GPT模型确定它需要调用这个函数来回答用户的问题,所以它返回一个“函数调用”的请求,指定要调用的函数名称和参数。

  4. 代码中的运行会查找对应的函数(在这个例子中是get_current_weather),并用GPT模型指定的参数调用它。

  5. 函数返回天气信息,这个信息被发送回GPT模型。

  6. GPT模型使用这个天气信息来生成一个回答,例如“波士顿现在的天气是晴朗的,温度是72度”。

也有朋友问:它实际应用场景是什么样的?

问了一下 ChatGPT:

填充模板:可以将特定的信息填充到预定义的模板中,生成个性化的文本,如生成定制化的邮件、通知或报告。  

条件逻辑:用于在生成的文本中实现条件分支和逻辑判断,根据特定条件生成不同的文本输出,增强了文本的灵活性和可定制性。  

变量和状态管理:可以引入变量和状态管理,使得文本可以跟踪和操作特定的信息,实现更加复杂的任务和交互。  

上下文控制:可以在生成文本的过程中引入上下文信息,控制模型对上下文的理解和应答,提高文本的连贯性和一致性。  

多模态输入和输出:可以实现多模态数据(如文本、图像、视频等)的输入和输出,更加丰富和多样化的文本生成和理解任务。

ChatGPT


官方给了三个应用场景举例:

  1. 创建聊天机器人通过调用外部工具来回答问题

  2. 将自然语言转换为 API 调用或数据库查询

  3. 从文本中提取结构化数据


我的回答是:例子里只是列举了一个查询天气状况的情况。实际上它有很多场景可以扩展。

chatGPT 模型本质还是一个通用AI模型,它的能力大多数表现文字和图片方面。其次它的知识需要训练,无法做到实时更新数据。虽然它有接近人类的逻辑推理能力,可以根据已知信息来推导问题答案。

应用场景的落地可以往两个方面扩展:

一、实时性的信息获取和加工。例如新闻,天气,交通状况,售票情况,停车位情况,航班情况,考试分数查询等等;

二、垂直领域的能力。例如调用别的人工智能机器人:阿尔法围棋(AlphaGo) 来陪你下棋,调用运输机器人帮你把货物运到目的地,调用专门法律政策类型的智能助手(这类方面问题因为安全和政策的原因,GPT的输出被限制了)帮你查询和准备资料等等。



关注我,领取九大类别,数百篇 AI 学习资源。

一起学习 ChatAI,掌握 AI 工具,不被时代淘汰。

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存