摘要:本文摘自葡萄城低代碼產品活字格的資深用戶(格友超哥)所撰寫的文章:
ChatGPT的functions函數使用方
自從OPENAI發佈了最新的GPT引擎gpt-3.5-turbo-0613之後,我就對它的functions參數很感興趣,利用GPT超強的語言理解能力,如果加上函數執行,我們就可以讓AI不再是聊聊天、回答問題了,甚至能夠直接幫我們完成工作任務。剛好今天週末,不如就動手試試,看能否達到我所想的效果。
開始之前,我們先要看一下官方文檔,看看這個functions,是個什麼神奇的參數,只有搞清楚了它的作用和原理,我們才知道如何利用它。
這是官方對Function calling的介紹,我們可以看到,目前支持gpt-3.5-turbo-0613和gpt-4-0613兩種引擎。
再看看functions參數的格式和屬性,我們可以看到,這裏我們向GPT定義了一個名爲"get_current_weather"的函數,並且在description中描述了這個函數的用途,在properties中,我們定義了兩個參數,location和unit,這是向GPT表明,你如果調用這個函數,需要向函數提供兩個參數,並且對兩個參數都進行了描述。
看懂了functions參數,我們大概知道了原理,其實並不複雜,我們通過定義一系列函數,告訴GPT函數是什麼時候用,做什麼用,需要什麼參數才能用等,GPT會根據與用戶的聊天信息自行判斷是否要“執行函數”。
爲什麼要給執行函數打上雙引號呢?事實上GPT肯定是不能直接執行函數的,因爲這只是個普通的HTTP請求,GPT也只是返回一個JSON格式的響應信息,那該如何實現執行函數的呢?
如何讓ChatGPT調用函數
要搞懂這個,我們還得看看GPT給我們返回的數據長什麼樣子。
上面是一個正常的聊天回覆信息,我們看到,message裏面只有role和content兩個屬性,另外還新增了一個屬性 finish_reason ,當它的值爲“stop”,說明此次的對話無需執行函數,也說明GPT並沒有調用函數的打算,接下來我們看看GPT打算調用函數時,會返回什麼?
我們發送“請問北京現在天氣怎麼樣”給GPT,看它的回答。
這裏可以明顯看到,finish_reason的值變成了“function_call”,開發人員通過判斷finish_reason的值,就可以知道GPT是否要調用函數。
這下豁然開朗了,我們通過回覆的內容,弄清楚GPT要調用什麼函數,然後拿到GPT幫我們獲取的參數,直接執行函數就可以了。
使用ChatGPT嵌入
數據庫表和前端設計
下面我們來給活字格裝上AI的翅膀,我們先打開
(訂單數據表)
(表字段)
然後新建一個頁面,製作一個簡單類似搜索的頁面,運行看看效果。
(運行效果)
這個頁面用來與用戶進行自然語言交互,前端我們暫時做到這兒。
後端設計
接下來設計後端,把ChatGPT對接部分做好。
爲了方便使用,我提前將GPT的API封裝成了插件,原理跟上面官方所說一致。
(封裝後的插件)
設置好KEY和消息數據以後,我們利用插件的自動化命令配置好需要ChatGPT的執行的命令。
這裏的每個命令都有一個描述,我們可以用自然語言告訴AI,什麼時候該調用我,AI會自己決定調用哪一個命令,當然光有命令還不行,我們還得讓AI提供參數給我們。
在參數的配置上,我們也有一個“參數說明”,也就是用來告訴GPT,這個參數是什麼意思,GPT會根據用戶的信息,自己來歸納和推測參數內容。
使用ChatGPT查詢訂單
好了,做到這兒,GPT後端部分也已經配置好,現在我們模擬一個場景出來,例如我想讓GPT幫我們查詢訂單數據,我們可以這樣定義:
首先定義一條命令如下,告訴GPT,這個命令是用來按條件查詢多個訂單數據。
(定義命令)
再給命令定義查詢訂單需要用到的一些關鍵參數,有了這些信息,我們後面就可以實現查詢條件,從而根據條件篩選數據。
(參數定義)
判斷GPT返回的function_call.name是不是等於GetOrderData:
(判斷function_call.name)
如果是,就把獲得的參數用來篩選數據:
(篩選數據)
最後把獲取到的數據返回給前端:
(數據返回前端)
最後我們在前端補充一個頁面,用來接收並顯示查詢返回的數據表中的數據。
最終實現的效果:
(查詢2023年6月的採購訂單數據)
可以看到GPT準確的理解了我們的意圖,並且調用了我們預設好的命令,還提供了我們需要的日期、訂單類型等參數。
通過這個簡單的例子,我們可以驗證AI與活字格結合的可行性,那麼我們除了查詢數據,還能不能做點更復雜的事情呢?
使用ChatGPT顯示訂單內容
所以接着我又做了另一個嘗試,讓AI根據我的要求找到某個訂單,並顯示該訂單內容
這個嘗試,我加入了更多的參數,由日期、訂單類型、負責人等,然後修改了邏輯,把命令放到前端頁面來執行。
(前端命令設置)
來看看運行效果:
(打開2023年6月8日超哥採購Iphone的訂單)
看來是完全沒有壓力的,這時候我們初步已經學會怎麼運用GPT的能力,來爲我們完成特定任務了,下面我將繼續完成一個更復雜、更實用的嘗試。
使用ChatGPT發送郵件
我想讓系統理解這樣一句話,並幫我執行。
我是喬布斯,請幫我找出2023年6月份馬斯克經手採購iphone的訂單數據,發送郵件給超哥,並寫一段話禮貌的催促他快點審覈。
我來幫大家理理,想要完成這個任務,我們需要做些?
▪ 讓AI知道我是誰;
▪ 需要找出2023年6月1日到6月30日範圍內,負責人爲"馬斯克"、訂單類型爲"採購訂單"的數據;
▪ 將上面數據導出爲Excel;
▪ 找到超哥的郵箱,並將上面的數據作爲附件;
▪ 編寫一段話作爲郵箱正文;
▪ 尋找系統用戶中一個叫“超哥”的人,並拿到郵箱地址;
▪ 將郵件發送出去並返回。
梳理清楚了,我們就開始做邏輯,同樣配置好命令和參數的描述
然後利用報表模塊,設計一個簡單的報表,綁定訂單數據庫
(報表模塊)
最後做一下導出Excel+發送郵件的命令
(命令執行過程設計)
好了,我們來試試效果,我給大家做了個
總結