ChatGPT 是什麼?
我們需要一些基礎知識來瞭解 ChatGPT 什麼。ChatGPT 中的 GPT,即「Generative Pre-trained Transformer」,是一種基於深度學習的自然語言處理技術。它能夠自動生成文本,並且根據先前的輸入生成相應的輸出。通過使用 GPT,我們可以將人工智慧應用到自然語言處理中,例如聊天機器人就是 Chat 聊天的意思。
接下來,我們將介紹如何建立類似於 ChatGPT 的 Line 免費聊天機器人,我們需要使用Google App Script 編寫一個簡單的程式,以便在Line中使用GPT。
5 個步驟開始,跟著我一起實作 ChatGPT !
在開始之前,我們需要進行一些準備工作。
首先,請確保你擁有一個Google帳號、OpenAI 帳號、LINE 帳號
還會需要有一個 Google App Script專案,我們將在這個專案中撰寫LINE 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 設置 LINEBOT Messaging API
章節重點:你需要註冊一個LINE開發者帳號並建立一個LINE Messaging API項目。透過這個項目,你可以獲取LINEBOT的Channel Access Token以及LINE@好友並把這個機器人加為好友,這些資訊將用於後續與LINE平台進行 Webhook通信。
到 https://developers.line.biz/zh-hant/services/messaging-api/ ,我們選擇 為訊息溝通用的 Messaging API,按下開始體驗登入
接著建立一組新的 Create a new channel,資料輸入可以參考如下
建立好之後會如下圖,我們點選右邊區塊剛新增的 chatGPT
進入後,切換到 Messaging API settings 取得 line@ 就可以先把這個機器人加入好友
加入好友之後,再將頁面往下滑一點,會有兩個部分需要設定
- Webhook URL (這個步驟先跳過,因為我們還沒有寫程式產出這個網址,文章後方會再回來設定)
- Auto-reply message,我們先一起設定這個 (下圖步驟說明),先按下 Auto-reply message 右邊的 Edit
(Allow bot to join group chats,是可以讓這個機器是否允許加入到LINE群組的設定,有需要可以自行設定哦)
此時會跳出另外一個網頁視窗,我們要使用Webhook的方式進行,請將這設定改成如下圖,設定完成後就可以先關閉這個分頁
在最下方有個 Channel access token 按下 Issue 申請一組,然後將這組複製起來放到剛剛記事本中,如 (Channel access token:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)
Step 3 撰寫 Google App Script程式碼
章節重點:連線到 https://script.google.com/home 建立一個新的專案命名為 GPT_BOT ,並且完成程式碼
程式架構
∟ doPost().gs 當有人和LINEBOT說話時自動會被觸發
∟ chatGPT_api().gs 負責GPT的串接
∟ pushLineBotMessage().gs 負責LINEBOT訊息回覆
doPost().gs 負責接收訊息和處理回覆的主要函式,
doPost 是 Google Apps Script 中的一種特殊函式,用於處理 HTTP POST 請求。當你在自定義的 Google Apps Script 網頁應用程式中收到 POST 請求時,doPost 函式會自動被執行。你可以在這個函式中編寫程式碼來處理接收到的資料。
doPost 函式有以下的特點:
- 它接收一個
e
參數,代表請求的資訊。你可以使用e
參數來存取請求的資料,例如 POST 的內容、請求的標頭等等。 - doPost 函式必須回傳一個回應物件,該物件包含回應的內容和標頭。
// doPost().gs 程式碼範例
Line_Bot_Token = "將您的Channel access token 輸入在此";
Line_Bot_API = "https://api.line.me/v2/bot/message/reply";
ChatGPT_Access_Token = "將您的ChatGPT API KEY 輸入在此";
Ask_Key_Word = "請問:"
function doPost(e) {
var oPostData = JSON.parse(e.postData.contents); //取得 Bot 收到的資訊
var sReplyToken = oPostData.events[0].replyToken
var sUserMsgText = oPostData.events[0].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
}
pushLineBotMessage(sResponse, sReplyToken);
}
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
}),
})
}
pushLineBotMessage().gs 負責LINEBOT訊息回覆
在主程式 doPost() 中 pushLineBotMessage(sResponse, sReplyToken) 呼叫用到這個函式,下方程式碼無須調整
function pushLineBotMessage(sMsg, sReplyToken){
var linePayload = {
'replyToken': sReplyToken,
'messages': [
{
'type': 'text',
'text': sMsg
}
]
};
var lineOptions = {
'method': 'post',
'headers': {
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ' + Line_Bot_Token
},
'payload': JSON.stringify(linePayload)
};
UrlFetchApp.fetch(Line_Bot_API, lineOptions); // 把訊息送出
}
Step 4 部署 Google Apps Script 程式碼, 設定webhook 在 LINE官方帳號上
章節重點:成功部屬取得 Google Apps Script 的 Webhook URL (網頁應用程式網址),再回到 LINE官方帳號上設定 Webhook URL, (Use Webhook 一定要打開, Auto-reply messages 要關閉)
當以上三支程式碼都準備好時,請點選右上角的部屬 > 新增部署作業,會跳出一個視窗
齒輪設定打開,我們要使用「網頁應用程式」
設定的選擇如下圖
然後按部屬之後,就會取得一串網址,這個網址就是我們接著要貼到 LINE 官方網站的 Webhook
回到我們的 LINE 官方帳號 https://developers.line.biz/console/
找到 Webhook URL 按 Edit 把剛剛的網址貼上按下 Update 即可
然後我們可以再確認一下是否有成功接上,按下 Verify 驗證一下我們的後台程式是否有通,有跳出「Success」表示成功
最後,我們再將 Use webhook 開啟,就恭喜你已經完成了!
Step 5 測試與延伸方向
測試
現在你就可以打開 LINE 和你的機器人對話,可以看到我們的 LINE 機器人已經會回覆訊息了
延伸方向
結合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
上方的文章內容和程式碼已經有做更新! 可以再試試看囉
中文參考資料:
英文參考資料:
延伸閱讀:MySQL MariaDB 資料庫比較? 如何安裝 MySQL MariaDB 資料庫在Linux?
延伸閱讀:MobaXterm 教學比 Putty 更強大方便好操作的 Windows 免費 SSH Client 軟體
Безопасность при установке Winline
請問一下如果照著步驟做但是不會回的話怎麼辦呢
可能是 ChatGPT API KEY 已經到期囉
到 https://platform.openai.com/account/api-keys 檢查看看日期
成功了,感謝大大,想進一步請問可以串接做好的Custom GPTs嗎?
太好了恭喜你~
你可以在 doPost()
呼叫ChatGPT API
前或後加上自己需要的邏輯看你想要怎麼跟 GPT 溝通
您好
我也想了解跟他一樣的問題
自定義的Chatgpt工具
可以串接到LINE帳號 整合成一支類似客服的程式
加入到與客戶的LINE群組中
讓客戶標記後 可以開始進行問題查詢與回覆嗎?
另外也想了解一下大大您的Email或聯絡方式
想在請教您一下 並詢問您相關合作可能 謝謝
您好,
可以將需求說明清楚我評估後會做一個回覆
信箱:liedward0122@gmail.com
奇怪我也是寫完發現不會說話,程式碼的部分都照抄,key應該也沒打錯,實在找不到錯誤在哪
hi, 程式碼的部分問題應該是比較少, 因為我也是直接複製提供出來的
我建議先檢每個步驟的章節重點 是否都正確
Use Webhook 一定要打開, Auto-reply messages 要關閉
hi感謝分享
我也是照著做但是沒有回應QQ
Line_Bot_Token = “將您的Channel access token 輸入在此”;
ChatGPT_Access_Token = “將您的ChatGPT API KEY 輸入在此”;
這個 token 可以檢查一下哦
hello, 呼叫方式更新 2024-03-09更新已經有補充在文章最下方囉,可以試試看有問題一起討論 🙂
感謝教學
分享一下,剛剛也遇到前幾則留言的情況,openAI的API Key沒有正常運作
除了綁定信用卡之外,要先進設定 Setting > Billing 點選 “Buy Credits”
還要儲值5美元,之後就可以正常使用囉
感謝你的分享!
照著做也嘗試綁定及儲值 結果也是不會回應,只有回應請輸入問題相關詞,但無法呼叫gpt
QQ
hello, 呼叫方式更新 2024-03-09更新已經有補充在文章最下方囉,可以試試看有問題一起討論 🙂
chatGPT 的呼叫方式已改變, 上面出現無回應的情況應該都是相同問題.
hello, 呼叫方式更新 2024-03-09更新已經有補充在文章最下方囉,可以試試看有問題一起討論 🙂
感謝教學與分享。全部設定好後一開始 LINE 都沒反應,但不知為何過了約十幾分鐘後,突然就可以按照程式碼的設定回應了!有兩個問題想進一步請教: 1. doPost().gs 程式碼中,請問 Ask_Key_Word = “請問: ” 的定義和 sResponse = ‘如果想問問題的話,請開頭請用 ‘ + Ask_Key_Word + ‘再接著問題內容即可哦!’ 回應的字詞 是可以自己更改的嗎?比如改成像這樣Ask_Key_Word = “請問” ; sResponse = ‘如果要諮詢的話,開頭請用 ‘ + Ask_Key_Word + ‘再接著問題內容即可’+ ‘例如:請問普拿疼是什麼藥?’ 2. chatGPT_api().gs 程式碼中, “model”: “gpt-3.5-turbo” 可以改成 “model”: “gpt-4-0613” 之類的其他 model 嗎?如果您可以回覆,真的非常感謝。
1. 回應的字詞 是可以自己更改的嗎? Ans: 是的,你的理解沒錯
2. model 當然是可以自行調整的喔, 測試出屬於最適合自己的 model 來用
文章內容都只是拋磚引玉, 有幫助到你我很開心
請問如何讓Bot回覆更完整內容? 試做是成功了但話都講一半XD
剛摸了下,好像改max_tokens就行了
沒錯!