ChatGPT 是什麼?
我們需要一些基礎知識來瞭解 ChatGPT 什麼。ChatGPT 中的 GPT,即「Generative Pre-trained Transformer」,是一種基於深度學習的自然語言處理技術。它能夠自動生成文本,並且根據先前的輸入生成相應的輸出。通過使用 GPT,我們可以將人工智慧應用到自然語言處理中,例如聊天機器人就是 Chat 聊天的意思。
接下來,我們將介紹如何建立類似於 ChatGPT 的 Telegram 免費聊天機器人,我們需要使用Google App Script 編寫一個簡單的程式,以便在 Telegram 中使用GPT。
5 個步驟開始,跟著我一起實作 ChatGPT !
在開始之前,我們需要進行一些準備工作。
首先,請確保你擁有一個Google帳號、OpenAI 帳號、Telegram 帳號
還會需要有一個 Google App Script專案,我們將在這個專案中撰寫Telegram BOT的後端程式。
Step1 申請 ChatGPT API KEY
章節重點:為了使用GPT API,我們需要獲取API金鑰。請登入GPT API提供的官方網站並遵循指示進行註冊和創建專案。獲取ChatGPT API KEY後,我們可以在Google App Script中使用它來向GPT API發送請求並獲取智能回答。
到 https://platform.openai.com/account/api-keys 按下 Create new secret key 建立一組 Key,請將這組Key先複製起來放到記事本,如 (ChatGPT API KEY:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
(此步驟圖片已失效,可參見文章最下方) OpenAI 有提供很多範本運用,可以到 https://platform.openai.com/examples 參考,我們本篇文章會運用到的是Q&A,請點選 Open in Playground
(此步驟圖片已失效,可參見文章最下方) 我們需要了解對接的方式,請點 View Code 觀摩一下程式碼的運作方式
右上角的下拉小箭頭,有看到 curl 表示說可以使用 POST 呼叫
https://api.openai.com/v1/chat/completions
(此步驟圖片已失效,可參見文章最下方) 對於我們在撰寫程式的時候方便許多,不用另外安裝套件。
圖中的參數詳細說明 (粗體表是稍後會調整的參數)
- curl:命令列工具,用於在終端中發送HTTP請求。
- -H “Content-Type: application/json”:HTTP標頭參數,指定請求的內容類型為JSON。
- -H “Authorization: Bearer $OPENAI_API_KEY”:HTTP標頭參數,使用Bearer令牌方式進行身份驗證。$OPENAI_API_KEY應該被替換為有效的OpenAI API金鑰。
- -d ‘{…}’:HTTP請求的主體部分,包含JSON格式的請求資料。
- “model”: “text-davinci-003″:GPT模型的名稱或標識符,指定使用的模型版本。在這個例子中,使用的是名為”text-davinci-003″的模型。以下是目前常見的模型
- text-davinci-003:這是OpenAI的GPT-3模型之一,是當前最強大和最全面的模型之一。它具有出色的語言生成能力,能夠產生高質量、流暢且具有上下文連貫性的回答。
- text-davinci-002:這也是GPT-3系列的一個模型,相對於text-davinci-003來說,它的模型容量稍小,但仍然具有強大的語言生成能力。
- text-davinci-001:這是GPT-3系列中較小的模型之一,比較適合用於一般的語言生成任務。它可能在一些更複雜的問題上表現不如前兩個模型。
- “prompt”: “…”:提問的內容,作為GPT模型的輸入。它包含了一系列問題以及一個未完成的問題,模型將繼續該問題的回答。
- “temperature”: 0:溫度參數,用於控制模型生成答案的多樣性。值為0表示生成的答案將非常確定和一致。
- “max_tokens”: 100:生成的回答的最大標記數。這個數字可以根據需要進行調整。
- “top_p”: 1:用於控制模型生成答案的概率分佈。值為1表示模型會考慮所有可能的回答。
- “frequency_penalty”: 0:這個參數用於控制生成回答中重複詞語或短語的程度。較低的值(如0)會允許生成回答中有更多的重複詞語,而較高的值(如1)則會減少回答中的重複詞語。如果您希望回答更加多樣化,可以調高這個值。
- “presence_penalty”: 0:這個參數用於控制生成回答中包含先前給定文本中未提及的詞語或短語的程度。較低的值(如0)會允許生成回答中有更多的新詞語,而較高的值(如1)則會更傾向於生成回答中已經提到的詞語。如果您希望回答更加關聯到先前的內容,可以調高這個值。
- frequency_penalty, presence_penalty 這兩個參數可以用來微調生成回答的多樣性和相關性。較低的懲罰值可以產生更多的重複詞語和新詞語,而較高的懲罰值則會減少這些情況。您可以根據需要調整這些參數,以獲得符合您期望的回答風格和品質。
- “stop”: [“\n”]:停止條件,用於指定生成答案的結束標誌。在這個例子中,當模型生成的答案中包含換行符時,會停止生成。
Step 2 設置 Telegram BOT API
章節重點:在 Telegram 搜尋 @BotFather ,取得 API token
輸入 newbot
以及設定 name
username
最後,看到 Done! 裡面會有一串 Use this token to access the HTTP API: 後面接著那串就是我們要的
Step 3 撰寫 Google App Script程式碼
章節重點:連線到 https://script.google.com/home 建立一個新的專案命名為 GPT_BOT ,並且完成程式碼
程式架構
∟ doPost().gs 當有人和Telegram BOT說話時自動會被觸發
∟ chatGPT_api().gs 負責GPT的串接
∟ pushTelegramBotMessage().gs 負責Telegram訊息回覆
doPost().gs 負責接收訊息和處理回覆的主要函式,
doPost 是 Google Apps Script 中的一種特殊函式,用於處理 HTTP POST 請求。當你在自定義的 Google Apps Script 網頁應用程式中收到 POST 請求時,doPost 函式會自動被執行。你可以在這個函式中編寫程式碼來處理接收到的資料。
doPost 函式有以下的特點:
- 它接收一個
e
參數,代表請求的資訊。你可以使用e
參數來存取請求的資料,例如 POST 的內容、請求的標頭等等。 - doPost 函式必須回傳一個回應物件,該物件包含回應的內容和標頭。
// doPost().gs 程式碼範例
Telegram_Bot_Token = "將您的 access token 輸入在此";
Telegram_Bot_API = "https://api.telegram.org/bot" + Telegram_Bot_Token + "/";
ChatGPT_Access_Token = "將您的ChatGPT API KEY 輸入在此";
Ask_Key_Word = "請問:"
function doPost(e) {
var oPostData = JSON.parse(e.postData.contents); //取得 Bot 收到的資訊
var sClientId = oPostData.message.chat.id;
var sUserMsgText = oPostData.message.text;
// 以下狀況不回覆
if (!sUserMsgText) {return;}
if (sUserMsgText.indexOf(Ask_Key_Word) === -1 ) {
sResponse = '如果想問問題的話,請開頭請用 ' + Ask_Key_Word + '再接著問題內容即可哦!'
}
else{
// 呼叫ChatGPT API
sGPTReceive = chatGPT_api(sUserMsgText.replace(Ask_Key_Word, ""))
sResponse = JSON.parse(sGPTReceive).choices[0].message.content
}
pushTelegramBotMessage(sResponse, sClientId);
}
chatGPT_api().gs 負責GPT的串接
在主程式 doPost() 中 chatGPT_api(sUserMsgText.replace(Ask_Key_Word, “”)) 呼叫用到這個函式,下方程式碼無須調整
// chatGPT_api().gs 範例程式
function chatGPT_api(sMsg) {
return UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', {
'method': 'post',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + ChatGPT_Access_Token,
},
'payload': JSON.stringify({
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": sMsg}],
"temperature": 0.7,
"max_tokens": 150
}),
})
}
pushTelegramBotMessage().gs 負責Telegram BOT訊息回覆
在主程式 doPost() 中 pushTelegramBotMessage(message, clientID) 呼叫用到這個函式,下方程式碼無須調整
//傳送 Telegram 訊息給使用者
function pushTelegramBotMessage(message, clientID) {
var payload = {
"chat_id": clientID,
"text": message,
}
var options = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload)
};
UrlFetchApp.fetch(Telegram_Bot_API + "sendMessage", options);
}
Step 4 部署 Google Apps Script 程式碼, 設定webhook 在 Telegram Bot 上
章節重點:成功部屬取得 Google Apps Script 的 Webhook URL (網頁應用程式網址),並設定 Telegram Bot Webhook URL
當以上三支程式碼都準備好時,請點選右上角的部屬 > 新增部署作業,會跳出一個視窗
齒輪設定打開,我們要使用「網頁應用程式」
設定的選擇如下圖
然後按部屬之後,就會取得一串網址,這個網址就是我們接著要設定 Telegram Bot 的 Webhook
這裡有個方便一點的設定介面 https://telegram-bot-sdk.readme.io/reference/setwebhook
- token: 將您的 access token 輸入進去
- url: 將剛剛google app部屬好的網址輸入進去
兩個欄位都輸入好了之後,按下右邊的 Try it , 如果有回傳 200 就表示設定成功囉!
或者您也可以直接在瀏覽器輸入網址,只要記得再把內容改成您取的的資訊哦
https://api.telegram.org/bot{將您的 access token 輸入在此}/setWebhook?url={將剛剛產出的網址輸入在此}
Step 5 測試與延伸方向
測試
現在你就可以打開 telegram和你的機器人對話,可以看到我們的 telegram 機器人已經會回覆訊息了
延伸方向
結合GPT模型再串接 Google Sheet 當作資料庫直接做儲存與查詢,我們可以開發出智能客服機器人、庫存查詢、團購系統、等等多種的實際運用方法,歡迎一起討論
呼叫方式更新 (2024-03-09更新)
發現越來越多人無法順利呼叫,在今天終於有空可以更新文章了,各位讀者久等了
根據 openai 最新的介接文章 https://platform.openai.com/docs/api-reference/introduction 要修改的地方有
- chatGPT_api().gs 程式碼中的 model 要替換成 “gpt-3.5-turbo”
- chatGPT_api().gs 程式碼中的 messages 的屬性內容更換成陣列才會通
- chatGPT_api().gs 程式碼呼叫的 API 網址也有更換成 https://api.openai.com/v1/chat/completions
- doPost().gs 程式碼中解析 openai 回傳格式調整成 sResponse = JSON.parse(sGPTReceive).choices[0].message.content
上方的文章內容和程式碼已經有做更新! 可以再試試看囉
中文參考資料:
英文參考資料:
延伸閱讀:用 LINE 官方帳號串接 ChatGPT!5 個步驟輕鬆打造 ChatGPT LINEBOT!
延伸閱讀:MobaXterm 教學比 Putty 更強大方便好操作的 Windows 免費 SSH Client 軟體
Hi Edward
謝謝你精闢的分享。
不好意思,部屬的時候遇到一些錯誤,不確定怎麼修改,可以請你指點嗎?
”
TypeError: Cannot read properties of undefined (reading ‘postData’)
doPost @ 程式碼.gs:13
”
Thanks, JH Wu
嗨,很開心能夠幫助到你
根據錯誤的訊息
是指找不到 postData 這個函式,請在檢查看看是不是 postData().gs 這個檔案存不存在,或是檔案中的 function 名稱有錯誤
嗨 Edward
謝謝你的分享。
不好意思,後續測試時遇到一些問題,不確定是哪邊有問題,再麻煩您指點
1. TG上測試時會出現 如果想問問題的話,請開頭請用 請問:再接著問題內容即可哦! 但是包還keyword詢問時會沒有反應
2. 在瀏覽器輸入網址時會顯示 {“ok”:false,”error_code”:404,”description”:”Not Found”}
Thanks, Jenny
hello, 呼叫方式更新 2024-03-09更新已經有補充在文章最下方囉,可以試試看有問題一起討論 🙂