ChatGPT 6 月 13 日的发布里面的 Function Call 的功能,把自然语言的世界和现在已经有的编程语言的世界打通了。虽然最终我认为整个世界将会是自然语言的世界,但是毕竟现在所有的计算机系统都还是代码和 API 的世界。从存量的角度来说,这是和现有系统兼容的最好的办法。
这件事情让我想起了《星球大战》里面的一对可爱的机器人。金黄色人型的有点傻的 C3PO,精通礼仪和协议,会各种语言;还有一个 R2-D2,就是那个矮矮的圆圆的,是宇航技工机器人(Astromesh Droid),精通计算和与计算机系统用“嘀嘟嘟嘟”的声音通信。他们两个搭配在一起工作,倒是完美:R2-D2 负责干活,获取信息,C3PO 负责翻译成人的语言。这个合作关系,就如同现在的 ChatGPT 和 API 的关系一样。
Function call 简单的说,就是把原来 ChatGPT 的 API 中 completetions 的调用,从原来只支持 messages(messages里面又可以指定 system,user,assistant 三个角色),扩展到还可以提供 functions。ChatGPT 会根据 functions 里面每个 function 描述里面「字面」的意思,通过简单的逻辑判断用户的问题用这个函数是否可以回答。如果可以的话,把用户的问题中间可以作为参数的部分提取出来,并且返回一个结构化的函数调用数据结构。
代码的世界再通过严格的 JSON 格式定义的函数调用方法调用函数,然后再把结果返还给 ChatGPT。ChatGPT 根据函数的结果,再继续回答用户的问题。
比如我自己的机器人的 functions 是这么写的:
functions = [
{
"name": "get_articles",
"description": "Get List of articles",
"parameters": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"description": "The starting point of index of articles",
},
"end": {
"type": "integer",
"description": "The ending point of index of articles",
},
},
"required": [],
},
},
{
"name": "read",
"description": "Get value from database",
"parameters": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The key to store the value ",
},
},
"required": ["key"],
},
},
{
"name": "save",
"description": "Save value to the database",
"parameters": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The key to store the value ",
},
"value": {
"type": "string",
"description": "The value to store the value ",
},
},
"required": ["key", "value"],
},
},
{
"name": "run_node",
"description": "Run node.js code",
"parameters": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "The node.js code I want to use to evaluate",
},
},
"required": ["code"],
},
}
]
其中包括获取以前的文章的函数,通用的保存和读取的函数,以及执行 Node.js 代码的函数。
如果我问:
User: 最近的5篇文章是什么?
ChatGPT 会回答:
Function: {'name': 'get_articles', 'arguments': '{\n "start": 0,\n "end": 5\n}'}fda
它把参数都准备好了。这个是在 GPT-3 里面就很成熟的功能,只不过这样子更加稳定可控了。
如果问:
User: 现在几点了
ChatGPT 会把凡是用 Node.js 的代码可以回答的问题都转变成 Node.js 的调用:
Function: {'name': 'run_node', 'arguments': '{\n "code": "new Date().toLocaleTimeString()"\n}'}
这些问题包括时间,算数等等。我们就可以把 Node.js 系统的世界和 ChatGPT 的自然语言的世界联系在了一起。(不过一定要注意,这个例子的安全隐患和太平洋那么大。如果让他返回系统的信息,以及删除一些文件,它也会开心的照做,并且真的能做到。)
接下来基于这个连接器应该有非常多有趣的应用。虽然这件事情以前用 LangChain 或者自己直接写代码也可以实现。但很多事情都是,如果在最简单的地方再简单一点的效果比在很复杂的地方简化很多还大。
随着 Function Call 的支持,ChatGPT API 里面的角色(role)参数,也从三种扩充到了四种:
- system
- assistant
- user
- function
这四种,恰恰对应于自然世界的四样东西:system 相当于上帝或者大自然(机器人就是那样被创造的,所拥有的角色就如同是被上帝设定的);assistant 就是服务用户的机器人;user 就是和机器人交互的人类;而function 则代表着这个世界,是用户和机器人之外的第三方。机器通过函数从中获取信息,也通过函数改变它的状态。
这个 C3PO 和 R2-D2 的合作,我们既可以看作 ChatGPT 有了调用物理世界的能力,也可以看成是所有的计算机函数接口都有了人类语言的能力。