摘要:在國內使用ChatGPT有些不便,是否可以基於OpenAI開放的API做一個給自己或者同事們使用的聊天機器人,甚至整合到更多的場景….
本文分享自華為雲社群《使用 FunctionGraph 快速構建自己的「ChatGPT」》,作者:ChatGPT 、果寶、歷川。
ChatGPT是一個基於GPT-3模型的聊天機器人,可以與使用者進行自然、流暢和有趣的對話。ChatGPT可以理解和使用多種語言,如英語、中文、日語、西班牙語、法語或德語;還可以根據使用者的興趣和需求,提供相關建議和創意內容,如詩歌、故事、程式碼、歌詞等。ChatGPT是一個強大而靈活的工具,可以用於娛樂、學習或工作。
但是在國內使用ChatGPT有些不便,是否可以基於OpenAI開放的API做一個給自己或者同事們使用的聊天機器人,甚至整合到更多的場景…. 效果如下:
說幹就幹,我們先從做一個自己的機器人開始,首先我們從OpenAI獲取用於鑑權的祕鑰。
然後寫一個請求OpenAI介面的程式碼,並寫一個web服務介面開放出去,再搭配一個互動用的前端即可。看起來是1小時的工作量,但是如何部署這個服務呢? 購買一個雲伺服器再安裝環境或者設定容器也太麻煩了,於是我問了ChatGPT:
可以看到, 使用FunctionGraph只需要聚焦完成請求OpenAI介面的功能函數,不需要購買和設定資源,甚至不需要寫Web介面的程式碼。 於是一個簡單的方案如下:
其中,
注:「函數」 是指客戶部署在FunctionGraph上的程式碼,它可以是一個或多個檔案組成的程式,甚至編譯好的二進位制檔案。 如Python 指令碼檔案,Java的jar 包。
首先建立並開發FunctionGraph函數,開啟華為雲FunctionGraph 產品頁面,由於只有一個簡單的問題查詢介面,這裡我們選用事件函數 使用Python 3.9 執行時。
注:事件函數,可以由某類事件觸發函數執行,如使用者對該函數傳送了HTTP請求,關聯到該函數的訊息佇列裡產生了新訊息,都會自動觸發函數執行。
對於事件函數,通常程式入口方法(這裡是 handler)會有兩個引數:
圖:FunctionGraph 函數原始碼
上圖為本次呼叫的入口方法handler(),在函數中,我們:
圖:函數設定環境變數
注:範例中我們使用了OpenAI的sdk ,也可以將sdk放在函數程式碼裡一起上傳,或利用函數的依賴管理能力,通過新增依賴的方式實現:
圖:函數設定依賴
在編輯好程式碼後,只需要點選部署按鈕即可完成部署。
通常對於使用函數開發WEB 後端的場景,我們使用API 閘道器服務,來將函數開放出去供前端存取。為函數在API閘道器上註冊API非常簡單,只需要在函數頁面上建立APIG觸發器:
注意:這裡將後端超時時間設定為一個較大的時間,如60s,因為OpenAi的介面響應較慢。在北京4局點中,APIG服務有共用版,支援按需計費,若有較大的流量可以考慮購買APIG獨享範例。
圖:為GPT函數繫結APIG觸發器
APIG觸發器上的呼叫URL,可以直接用於向後端傳送請求,該URL 為測試URL,每日僅可存取1000次,可以點選觸發器跳轉到APIG頁面繫結自己的域名。
最後,通過存取設定的域名存取頁面,開始體驗!
至此,我們其實已經完成了整個簡單聊天系統的搭建,案例中我們使用了一個簡單的前端頁面,開發者也可以考慮整合到如VSCode外掛,語音聊天機器人,微信公眾號等等。
更進一步,若想使用Serverless技術,開發更為完整,適合生產環境的應用,需要新增鑑權,資料庫連線等功能。
以上我們已經基於FunctionGraph 函數建立了一個簡易聊天系統的後端的服務,但是該介面沒有任何鑑權,如果開放介面,所有使用者都可以存取。
如果需要使用者登入後才可以使用,如何做?一個思路是在原有業務程式碼裡增加鑑權,這裡我們也可以考慮使用APIG自定義鑑權即APIG組合FunctionGraph 鑑權的形式。 一個新的解決方案,如下。
使用APIG 自定義鑑權有以下優勢:
和普通函數的建立流程一樣,只需要注意響應的格式,一個使用JWT 鑑權的簡單案例如下。
編輯對應的API,選擇自定義鑑權,選擇到我們建立的函數:
一個鑑權拒絕的範例如下:
基於以上自定義鑑權模式,開發者可以組合自己已有的鑑權邏輯放到自定義鑑權函數中。如果進一步想基於FunctionGraph 建立一個 「登入」 或token授權函數,可以考慮以下方案。
我們首先需要建立一個函數,該函數用於接收使用者登入請求,然後去資料庫請求,判斷使用者合法則返回鑑權token。
建立一個普通的事件函數即可,一個簡單的範例如下,隨後可以為其建立APIG 觸發器。
注意,如果需要函數存取VPC裡的資源,如本例中的RDS,需要在函數頁面設定RDS所在的VPC。
使用函數,系統會自動收集使用者列印在控制檯的紀錄檔,使用者無需處理紀錄檔落盤,收集或直接上報。對於每一條請求紀錄檔,FunctionGraph 還會顯示請求執行耗時,使用記憶體及請求狀態。
使用者可以基於關鍵詞,請求狀態進行過濾和檢索。
圖:函數使用者紀錄檔頁面
同時,平臺自動收集函數執行指標,如呼叫次數,執行時間,錯誤次數,被拒絕次數,並行數等。
圖:函數監控
在使用者更新函數程式碼時,為保障「ChatGPT」業務穩定執行,可以設定APIG觸發器的後端服務指向函數別名:
圖:函數別名
圖:FunctionGraph別名灰度版本
擁抱Serverless,釋放生產力,函數工作流 FunctionGraph