相信作为编程人员或AI应用的每一位关注者,都苦于之前的知识只能到2021年,而且我们作为开发者大多数人其实都希望能通过给写更多的通用能力,非常眼馋的插件能力。
天下苦秦久矣,今将举大计!期待百年之大变局!
似乎听到了大家的心声,终于可以通过API来实现插件能力了,无疑给的应用插上了翅膀。
实现插件能力的基础就是本次的主角- Call,让我们一起揭开其神秘面纱吧!
什么是 Call
Call是GPT API中的一项新能力。它可以让开发者在调用GPT-4和GPT-3.5-turbo模型时,可以根据用户的提示检测需不需要调用用户提供的函数,通过描述函数能让模型智能的输出包含调用这些函数所需参数的JSON对象。这是一种更可靠地将 GPT 的功能与外部工具和 API 相连接的新方法。函数调用使开发者能够更可靠地从模型中获得结构化数据。通俗点讲,能把自然语言的世界和现在的机器世界打通了,虽然整个世界最终的走向将会是自然语言的世界,但现在所有的计算机系统都还是代码的世界, Call将两个世界完美的搭配了起来。
通过插件体系的建立,不仅可以获取最新的新闻,还可以查询天气、酒店等信息,规划旅行及电商下单等,使得在更多领域发挥有更多的用武之地。
Call本质
Call的本质就是把原来 API中的调用,从原来只支持(三种角色:、user、),扩展到了还可以提供。
会根据里面每个单独的描述的意思,进行简单的逻辑判断用户的问题用某个函数回答是否合适。如果可以它将会把用户的问题中间可以作为参数的部分提出出来,并返回一个结构化的函数调用数据结构。代码世界再通过严格的JSON格式定义的函数调用方法调用函数,将最终结果返回给,根据返回的信息继续回答用户的问题。通俗地讲就是我们每次调用的时候告诉它我们有哪些函数,函数的能力是什么,参数是什么。它会更具我们的描述判断要不要调用某个函数,换句话说,就是教AI模型怎么样和外面的系统进行交互!这样我们就可以实现所有的计算机函数接口都有了人类语言的能力!
Call的四种角色
举个例子
将查询如“今天的天气如何?”转换为像 `(: )` 这样的函数调用
将“某段时间前十位客户是谁?”转换为内部 API 调用,如 `(: , : , limit: int)`,或者将“公司上个月下了多少订单?”转换为使用 (query: ) 的 SQL 查询。
定义一个`(name: , : )` 的函数,提取在维基百科文章中提到的所有人物。
这些例子通过我们的 /v1/chat/ 端点中的新 API 参数 和 得以实现,开发者可以通过 JSON 描述函数,并可选择要求模型调用特定函数。
一句话解释就是:我们可以把自己的函数集成到里了
帮我们能解决什么问题
本质上就是插件!插件功能相当于给增加了一个武器库,开发者可以随意给它安装武器提升它的能力。其主要帮我们解决了如下两个重点问题:
问他是什么?由于训练集是截止2021年(目前最新版的已更新至2023年04月)的,他会回答不知道。但是有了 ,我们就可以写一个函数集成谷歌/百度搜索API,给GPT加上联网能力,这样就借助搜索引擎的能力支持了数据的动态更新。
问他今天天气如何?由于数据集是离线的,无法满足获取实时天气的需求。但是有了 ,我们可以编写一个函数来调用天气获取的API,从而获取实时天气信息,然后再与大模型的对话能力进行自然语言交互。
如何使用
与普通chat对话的区别是增加了两个额外参数
“`
# 普通代码
# 注意新版的 SDK中函数已经发生了更新
= [
{“role”: “user”, “”: “Hello stone!”}
= ..( # 历史版本的函数调用方式
model=”gpt-3.5-turbo”,
=
# 新版中
= .(
model=”gpt-3.5-turbo”,
=[
{“role”: “user”, “”: “Hello stone!”}
],
#
= ..(
model=”gpt-3.5-turbo”,
=,
# 增加额外两个参数
=,
=”auto”, # auto is , but we'll be
“`
实时天气查询实践
调用流程
1. 定义函数
定义本地函数实现从API拉取,这里直接写一个简单对参数输出进行模拟。
然后按照的文档要求格式定义的接口函数的json参数。
“`
# 1.1 定义模拟获取天气的本地函数
def (, unit):
# 可以对接第三方应用系统的API
f”It's 0 {unit} in {}”
“`
2. 第一次调用接口
返回大模型分析出的函数名称和参数。
“`
(
id='-',
=[
(
='',
index=0,
=e(
=None, role='',
=(
='{n “”: “Xian”,n “unit”: “”n}',
name=''
),
=None
))
],
=,
model='gpt-3.5-turbo-0613',
='',
=None,
usage=(
=25,
=89,
=114
“`
3. 调用本地函数
获取返回值,进行本地方法调用
4. 第二次调用接口
将第一次接口的返回值与本地函数调用的接口拼装起来,然后再次调用接口。
“`
e(
='The in Xian today is 0 .',
role='',
=None,
=None
“`
完整实战代码
“`
# .py
json
. = '' # 这里需要替换成自己的密钥
# 1. 定义函数
# 1.1 定义模拟获取天气的本地函数
def (, unit):
# Call the API
f”It's 0 {unit} in {}”
# 1.2 定义函数字典方便调用
= {
“”: ,
# 1.3 定义chat接口需要的函数
= [
“name”: “”,
“”: “Get the in a given “,
“”: {
“type”: “”,
“”: {
“”: {
“type”: “”,
“”: “The city and state, e.g. , Xian”,
},
“unit”: {“type”: “”, “enum”: [“”, “”]},
},
“”: [“”],
},
# 2. 第一次调用chat接口,返回的是函数调用的提示
= [
{“role”: “user”, “”: “What's the like in Xian today with ?”}]
= .(
model=”gpt-3.5-turbo”,
=,
=,
=”auto”, # auto is , but we'll be
print()
# 3. 从结果接口的结果中获取函数调用的参数 进行本地函数调用
# 3.1 获取函数调用的参数
= .[0].
= ..name
= json.loads(..)
# 3.2 调用本地函数
= .get()(**)
# 3.3 将本地函数的结果作为chat接口的输入
.()
.({
“role”: “”,
“name”: ,
“”: ,
})
# 4. 第二次调用chat接口,返回的是chat的最终结果
= .(
model=”gpt-3.5-turbo”,
=,
print(.[0].)
“`
最终输出
It's 0 degrees Celsius in Xian
参考文献
* [ Chat API官方文档]()
* [ ]()
准备工作
准备自己的账号(感谢关注,如有问题或者其他问题欢迎一起学习探讨!)
323AI导航网发布