ChatGPT 的 Function Call 如同 C3PO 和 R2-D2 聯手
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 有了調用物理世界的能力,也可以看成是所有的計算機函數接口都有了人類語言的能力。