天天看點

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

作者:木偶奇迹

用了個把月的ChatGPT,真覺得挺友善的,查資料什麼的都能直接出結果,隻是每次要用的時候,還需要登入官網比較麻煩,正好最近提供了3.5版本的接口,就想着能不能直接裝到自己的手機上,這樣就友善很多了。

于是趁這兩天不怎麼忙,抽空研究了一下,也踩了幾個坑,總算是用上了,下面把相關的步驟分享出來,希望對大家有所幫助。

這裡需要幾個前置條件:

1、機場。這是必須的,當然能上ChatGPT,這個不是問題。

2、有一定程式設計基礎。不用很熟練,能寫Hello就差不多了。

3、有一台群晖nas。之是以選群晖是因為它有全平台的Chat聊天用戶端,并且有對外的接口,這樣就不需要再寫一個用戶端,友善省事,當然你也可以接到自己的系統裡。

下面開始正文

一、代碼部分

因為ChatGPT接口已經不能直接通路了,是以要将ChatGPT的接口通過代理映射成本地的接口,這樣做的好處就是隻需要設定一次代理,就可以在所有終端直接調用,免去了配置上的麻煩。

1、編寫GPT接口調用方法

打開OpenAI官網,找到接口調用示例代碼

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

通過這個示例可以看出,調用接口需要傳入兩個參數,model以及messages,messages是一個數組,數組内的每組資料需要兩個參數 role 和 content,然後在請求頭添加 Content-Type: application/json 以及Bearer認證就行。根據這些資訊,編寫一個接口請求方法,我用的是.NET6,别的語言大同小異。

static async Task<ChatModel> SendRequest(string apiUrl, string apiKey, string inputText)
        {
            var requestBody = new
            {
                model = apiModel,
                temperature = apiTemperature,
                messages = new[] { new { role = "user", content = inputText } }
            };
            var requestBodyJson = JsonConvert.SerializeObject(requestBody);
            var requestContent = new StringContent(requestBodyJson, Encoding.UTF8, "application/json");
            //設定代理
            var webProxy = new WebProxy
            {
                Address = new Uri(#34;socks5://{proxyAddress}:{proxyPort}")
            };
            var proxyHttpClientHandler = new HttpClientHandler
            {
                Proxy = webProxy,
                UseProxy = true
            };
            HttpClient httpClient;
            httpClient = new HttpClient(proxyHttpClientHandler);
            // 發送API請求
            httpClient.DefaultRequestHeaders.Add("Authorization", #34;Bearer {apiKey}");
            var response = await httpClient.PostAsync(apiUrl, requestContent);
            var responseContent = await response.Content.ReadAsStringAsync();
            // 解析API響應并傳回輸出文本
            var responseObject = JsonConvert.DeserializeObject<ChatModel>(responseContent);
            return responseObject ?? new ChatModel();
        }           

這裡解釋一下,如果不對HttpClient設定代理,他就會走直連的形式,而且還不會走本地代理,我就在這上面折騰了好久,調試的時候明明可以用的,但是部署之後就不行了,還以為是代理出了問題,後面才想起需要這樣設定。這一步需要特别注意,這是調用GPT接口的關鍵。

ChatModel實體類,根據GPT接口傳回的字段來寫就行。這樣就擁有了一個可以通路GPT接口的方法,然後再寫一個接口來調用這個方法。

因為我是要接到我的群晖Chat上面,是以這個接口需要根據群晖Chat的要求來編寫,如果你是要接到自己的系統裡面就按自己的需求來寫就行。

2、編寫Chat機器人調用接口

打開群晖的幫助文檔,找到 Synology Chat -> 在Synology Chat中使用整合功能 -> 機器人。

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

根據文檔說明可以知道需要寫一個接收的接口跟一個傳出方法才能跟他對接上,我也試過隻寫一個對接傳出的接口,發現是不行的,因為機器人的傳出不像webhook傳出一樣能接收響應,是以還要專門寫一個方法來将消息發送到群晖Chat。

接收的接口需要接收6 個參數,還是編寫一個實體類來接收。

public class MessageModel
    {
        public string token { get; set; }
        public string user_id { get; set; }
        public string username { get; set; } 
        public string post_id { get; set; } 
        public string timestamp { get; set; } 
        public string text { get; set; } 
    }
           

有了實體類就可以通過接口來接收群晖Chat傳過來的參數,然後調用前面寫的通路GPT接口方法,并得到傳回資料responseModel,再調用SendToRobot方法将需要的結果發送到Chat上面。

[HttpPost]
public async Task Post([FromForm] MessageModel model)
        {
            ChatModel responseModel = await SendRequest(apiUrl,apiKey, model.text);
            await SendToRobot(chatUrl, model.user_id, responseModel.choices[0].message.content);
        }

private async Task SendToRobot (string chatUrl ,string user_id, string msg)
        {
            var requestBody = new { text = msg, user_ids = "[]" };
            var requestBodyJson = "payload=" + JsonConvert.SerializeObject(requestBody);
            requestBodyJson = requestBodyJson.Replace("\"[]\"", "[" + user_id + "]");
            var requestContent = new StringContent(requestBodyJson, Encoding.UTF8, "application/json");

            using var httpClient = new HttpClient();
            var response = await httpClient.PostAsync(chatUrl, requestContent);
            var responseContent = await response.Content.ReadAsStringAsync();
        }
           

關于SendToRobot這個方法,看一下官方的文檔說明

您可以通過 POST request 中的 payload 參數來配置設定接收者和消息。例如:

payload={"text": "First line of message to post in the channel.\nAlso you can have a second line of message.", "user_ids": [5] }

文檔裡說了,通過payload參數來配置設定接收者的消息,是以在發送過去的資料裡面要包含user_ids,還有就是text消息内容了,最少要包含這兩個字段。

這裡有兩個坑

第一是payload作為參數,是不能放到json裡面進行格式化的,不然會讀取不了,隻能對payload的值進行json格式化。

第二是參數user_ids的值 [5] 不是字元串形式的,類似于數字值的形式,在最終發送的資料裡不能加引号。

由于本人才疏學淺,不知道這個是什麼寫法,是以在這這兩個坑上面也折騰了好長時間。

到這裡程式設計的部分就結束了,接下來就是把程式部署到伺服器上。

二、部署部分

為了友善省事,我這裡選擇把項目直接部署到群晖Docker上,Docker部署也很簡單,這裡大概說一下操作步驟。

右擊項目檔案,選擇 添加Docker支援 ,目标OS為linux

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

添加了Docker支援後,直接把整個項目檔案上傳到群晖的檔案夾裡面,這裡要注意,是上傳項目檔案,而不是上傳釋出後的檔案。

上傳完成後使用終端連接配接群晖,擷取root權限,并定位到剛剛上傳的項目檔案夾裡,運作以下指令:

Docker build -t chatgpt .           

稍等一會,看到界面有提示如下成功的字樣就可以了,如果遇到中途釋出失敗,再運作一次指令就好。

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

關閉終端,進入群晖背景Docker管理界面,找到剛剛釋出的chatgpt映像,點選啟動,在端口設定那裡把本地端口填上,避免重新開機的時候端口改變。

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

至此,部署的工作就完成了,然後就是配置Chat的機器人。

三、配置Chat機器人

打開Chat聊天界面,點選右上角的頭像,選擇整合,在彈出的整合界面選擇機器人->建立機器人。

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

這裡的傳出URL填寫項目部署後的接口位址,傳入URL就是前面寫的SendToRobot用到的ChatUrl,是以這個位址要配置到項目裡再釋出,或者也可以通過環境變量的形式來擷取。

這個填完後點确定,在左側的機器人那裡點選添加機器人會話,選擇剛剛添加的機器人,然後就可以愉快的聊天了。

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書
手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

當然,除了能接入群晖Chat之外,還能接到自己的系統裡面。

手把手教你将ChatGPT裝到群晖chat上,打造個人專屬秘書

以上就是将ChatGPT接入群晖Chat的全部内容了,希望對你有所幫助。

繼續閱讀