GPT-Linebot using python flask on vercel
本篇教學無經驗的新手也可學習,無須寫任何程式。
無經驗預計 15 ~ 20 分鐘都可以完成。老手最快可能 5 分鐘就搞定
- 這是使用 python flask 套件撰寫的 gpt-linebot
- 不需寫 code,只需去網頁設定一些內容,新手 15 分鐘內也能建立自己的 gpt-linebot
- Why flask? 簡單好用,且支援 vercel
- Why vercel? 免費!!!免費額度就很夠一般使用,是 heroku 不再免費後的好選擇
註:ChatGPT 與 gpt 是同樣任務的模型,而目前透過 API 只能使用到 GPT-3 (本程式使用的方法)
而非 ChatGPT 使用的 GPT-3.5
安裝步驟
主要會有四個地方要去:(這部份不看也沒關係,以下照著做就可以了!)
- 我的 github repo:透過 python 串接 openai 的 API,並透過 linebot sdk 提供簡單的訊息回復
- openai:申請 OpenAI 的 API KEY
- line developer:創建機器人
- vercel:提供訊息回復,雖然是 serverless 但已經很符合我們的需求
step 1. 至 github fork 專案
去我這個專案的 github repo
按下面的按鈕,
fork 一份檔案到自己的帳號底下,等等我們會使用到
可以的話,旁邊的 Star 也幫我按一下,是對創作者最大的鼓勵!
step 2. 申請 OpenAI 的 API KEY
可以直接去這裡,一直往下拉,找到這個按鈕,並生成一個 API KEY
請務必複製下來,這個 KEY 我們取名為 OPENAI_API_KEY
step 3. 去 line developer 建立一個新的機器人
這邊熟悉的人動作應該超快,可以略過,
以下教學是針對完全沒經驗的新手
我們先到 line developer 的首頁註冊一下,
註冊完後,點選 Messaging API。
step 3-1. 創建新的 channel
第一次使用要創建一個新的 provider 與 channel,
一個 provider 可以有很多 channel,
「而一個 channel 對應的就是一個 chatbot」,
這邊以下都照自己想要的名字跟事實填就好。
step 3-2. 在 Basic Settings 的分頁,取得 LINE_CHANNEL_SECRET
在 Basic Settings 的分頁,往下找到 channel secret
請務必複製下來,這個 KEY 我們取名為 LINE_CHANNEL_SECRET
step 3-3. 在 Messaging API 的分頁,進行一些機器人初始設定 (並加機器人好友)
再來我們去上方,選擇 Messaging API 的分頁,
我們先關閉一些可能會吵的東西 (預設的自動回復之類的),
這邊可以順便掃一下 QR code 或透過 line ID ,加機器人的 line 好友!
我自己是設定如下:
- 允許加入群組要注意使用 openai 額度可能會超快
- 「自動回復訊息必關!!!」,那是 line 的自動回復,不是我們要的
- 歡迎訊息也可以關,這邊我是開著
step 3-4. 在 Messaging API 的分頁,取得 LINE_CHANNEL_ACCESS_TOKEN
最後,在 Messaging API 的分頁的最下面,
找到 channel access token,點選右邊發行,並把他記下來。
請務必複製下來,這個 KEY 我們取名為 LINE_CHANNEL_ACCESS_TOKEN
請不要把這金鑰分享給別人,別人可能會拿去作壞事!!!
然後這邊網頁先不要關,等等還會用到!!!!
step 4. 去 vercel 設定相關的環境變數,完成啟動機器人!
step 4-1. 新增 project
去 vercel 首頁,add new project
Import Git Repository,選擇你剛剛 fork 的專案 import
step 4-2. 設定環境變數
選擇「Environment Variables」,把我們剛剛紀錄的 OPENAI_API_KEY、LINE_CHANNEL_SECRET、LINE_CHANNEL_ACCESS_TOKEN 都設定至環境變數,
按下 Deploy 等待一下就完成囉!
- 完成後我們可以看到會有以下的三個環境變數
step 4-3. deploy 完成後,可以簡單確認是否有成功
去部屬完成的 vercel 頁面,紅框處可以拿到我們要用的網址,
把這個網址複製下來,等等要用
這個網址我們也可以點開,應該會出現我們在程式預先寫好的 Hello, World! (應該是一個只有 Hello, World! 的網頁)
我們可以藉此確定程式有正常的被 Deploy
step 5. 設定 webhook
回到 line developer 的 Messaging API 分頁,
將剛剛 step 4-3. 的網址填入,並在後面加上 「/webhook」,例如下圖
可以用 Verify 看看有沒有問題,通常應該會是寫「Success」
- 「記得開啟下面的使用 Use webhook 」
完成圖範例
此 linebot 的其他一些內建功能
機器人「說話開關」
這個本來是我除錯用的,因為有時候回復一些怪東西會很吵,
意外得到好評,所以這個功能就被保留下來
- 輸入「說話」:機器人開啟說話模式,預設是開啟的
- 輸入「閉嘴」:機器人暫停說話模式 (但一段時間會自動再起動),閉嘴後將不會對任何對話有反應。輸入「說話」可再次開啟對話。
其他環境參數功能
參考自 memochou1993/gpt-ai-assistant 的作法,下列參數也可藉由設定 vercel 的環境變數來作調控。
環境變數名稱 | 預設值 | 說明 |
---|---|---|
OPENAI_MODEL | text-davinci-003 | 請參考 OpenAI 對 model 的敘述 |
OPENAI_TEMPERATURE | 0 | 請參考 OpenAI 對 temperature 的敘述 |
OPENAI_FREQUENCY_PENALTY | 0 | 請參考 OpenAI 對 frequency_penalty 的敘述 |
OPENAI_PRESENCE_PENALTY | 0.6 | 請參考 OpenAI 對 presence_penalty 的敘述 |
OPENAI_MAX_TOKENS | 240 | 請參考 OpenAI 對 max_tokens 的敘述 |
MSG_LIST_LIMIT | 20 | prompt 參數往回參照的句數 |
INIT_LANGUAGE | zh | 決定初始語言,可設置為 “zh” 或 “en” |
TODO List & Future Work
目前基本功能都已經有了,然後我比較忙可能沒空一直更新QQ
還有很多可以優化的地方,歡迎提供 PR!
- (已調整完成) 回復文字感覺不是很順 (可能需要研究一下 API 使用方法)
- (已調整完成) 記憶功能
…
目前算法是「紀錄使用者與 AI 的前20句對話」,嘗試推論出下一句話應該要說什麼。以達成延續話題的效果。
靈感來源
- 感謝 memochou1993/gpt-ai-assistant 提供的 node.js 版本串接 vercel 示範,讓我有了想把 python linebot 也串進 vercel 的靈感,(目前感覺下來,免費又好用(?))
- 感謝 Lanznx/HealthLineBot 給了一個很好的 python Django 範例,然而我不會 Django XD,vercel 官方文件好像也沒有提到這部份,總之後來就改成了 flask 版本,也符合 linebot 推薦的範例。
參考資料
- Line 官方提供的 python flask 製作 linebot 的 sample code line/line-bot-sdk-python
- Vercel 官方提供的 python runtime Flask 範例 Deploy an example with Flask
在這個熱門的 bot 風潮中,有許多人也在提供同類功能。然而,你的文件卻脫穎而出,明顯地領先於其他人。我真的很感謝你對這個領域的貢獻,你真是個專業的作者!
非常感謝你的鼓勵!我會繼續加油的!
HI,作者您好
目前還在學習Flask中剛好看到這篇post
但我進行到step 4-2. 設定環境變數的時候沒有顯示OPENAI_API_KEY、LINE_CHANNEL_SECRET、LINE_CHANNEL_ACCESS_TOKEN的輸入位置
想請問到這邊的話有什麼建議該接著進行下續的步驟?
先找看看Environment Variables, 點開後不論是您提到的文字與其對應的值,都需要手動輸入哦~
感謝您的回覆=)
對的,我是點開Environment Variables後找不到OPENAI_API_KEY、LINE_CHANNEL_SECRET、LINE_CHANNEL_ACCESS_TOKEN這三個設定的欄位
想請問這邊是有遺漏了什麼步驟嗎?
可行了,謝謝您的分享(((Star已送出
恭喜你找到了XD!!!
您好 我想請教一下 我在Line輸入後他沒有回應的解法是什麼呢
沒有回應的話,這問題有很多可能性,
首先可以再確認一下上面的步驟有沒有漏作的部分~
如果還不行,你照以下步驟試試看,我比較能排除一些可能性
1. 在 Vercel 那邊的視窗點選旁邊的 function
2. 進到視窗後
回到 line 視窗與他對話,我想要看 Vercel 那邊跳出的訊息
(可能需要把圖片寄信給我 [email protected], 這裡不能上傳圖片)
我需要看 Vercel 顯示的內容比較能確定是什麼問題~
重作兩次了 還是不行
function 的話 他一直在跑 Awaiting new requests…
進到視窗後 vercel是有成功執行
如果是照您目前的的敘述, 我猜可能是串接 line 與 vercel 那一段沒有串接成功
Vercel 在您發出 line 訊息的時候,應該會有對應的一些訊息跳出,
可以先從檢查 line 與 vercel 這兩個部分的設定都再檢查一下 (打錯字或漏步驟之類的)
thanks. I will check later tonight… ❤️
haha.. 失禮了。回錯欄位。
[…] 本文同步更新至我的個人網站:【Side Project】(全圖文教學) 用 Python flask 實作類似 ChatGPT 的 Linebot,並部屬至… […]
感謝分享!
請問按照文章設定完後,AI不會回覆是因為chatGPT現在是關閉狀態嗎?
正常來說應該是能直接使用的哦
目前這邊有詢問過的其他網友,聽到的問題大部分都是有曾經使用過其他 OpenAI 的服務
如果不是的話可以再檢查看看流程,找不到問題的話可以再留言~
謝謝!
2023-02-14T14:17:46.433Z a3b2b6ee-278d-401d-8e40-aa2d7c3b39d2 Task timed out after 10.01 seconds 請問為什麼複雜的問題會有這樣的情況呢?好像是超時了。謝謝
免費版的vercel 會有10秒的回覆timeout
只能付費升級或是免費將就用了
然後他計算的時間應該是生產回覆的時間
例如我要求他生產1000字的文章這種
免費版那是一定會timeout的XD
原來是這樣,非常感謝您。那請問有沒有可以部署在自己的linux服務器上的辦法呢?
一定可以的 把 python 服務器那邊的設定直接改到自己的 server 就行
我之前有小玩一下,但我自己專業不在這,所以研究到一半就沒繼續研究了哈哈哈
網路上還有其他的相關文章例如部屬至 AWS GCP 類似的都可以參考看看
應該都有機會可以幫上忙
非常感谢
不好意思嘗試了幾次都無法deploy成功
This Serverless Function has crashed.
Your connection is working correctly.
Vercel is working correctly.
500: INTERNAL_SERVER_ERROR
Code: FUNCTION_INVOCATION_FAILED
有加裝了 checklyhq, 得到的Error如下:
stack: Error: expect(received).toBeLessThan(expected)
Expected: < 400
Received: 500
at BaseHandler.apply (/var/task/src/2022-10/node_modules/vm2/lib/bridge.js:479:11)
at /tmp/1j0inkalexlh9n0/script.js:17:31
message: expect(received).toBeLessThan(expected)
Expected: < 400
Received: 500
不知該如何處置.. 可否請教該如何修正?.. Orz
出現 500的話是服務商的問題,可能隔一陣子再試看看
官方那邊可能有點狀況🤔
thanks a lot,.,
可以了。
只是真正的問題開始了。
我將Line Bot設定為如下:
Allow bot to join group chats
Enabled
Auto-reply messages
Disabled
Greeting messages
Enabled
+
Manual chat + AI response messages
Webhook >> OK
但是結果還是只出現.. LINE預設的回覆。
請問要從何下手確認才是 ? 謝謝您。
你上面寫的AI是line 的AI ,不是chatgpt的 AI
可能再檢查看看步驟上面有沒有設定錯誤(?
thanks. I will check later tonight… ❤️
您好,我也是在deploy後遇到500錯誤訊息如下,請問也可能是服務商有問題要等它嘛QQ?
This Serverless Function has crashed.
Your connection is working correctly.
Vercel is working correctly.
500: INTERNAL_SERVER_ERROR
Code: FUNCTION_INVOCATION_FAILED
ID: hkg1::8zl77-1695713740322-db6f613c41e5
重新再試一次OK了。 感謝。
讚👍
不好意思擱置了一陣子… ^^’
由於我使用舊的Line Messenger , 已建置了些簡單對話..所以我嘗試關了回應的message…如圖: https://www.dropbox.com/s/kltfi6fkb4jg0hv/Screenshot%202023-05-19%20at%209.46.46.jpg?dl=0
但是就是無法跑出 chatgpt.. 請問該如何修正..?..
因為有將近3000人的official account..想拿來運用..所以才會產生這些問題… 麻煩您.. thanks.
有點看不懂你的問題, 不好意思😇
您好,參考您的教學已經部署成功了! 請問該如何把模型改成 gpt-3.5-turbo
要改模型的話 需要去 chatgpt.py 這支程式裡面改 model 的參數,
另外 gpt-3.5-turbo 這個是網頁版的模型名字, 實際上使用的模型名稱不會是這個哦!
您好,我在測試時也出現了500的錯誤,想請問一下目前有解決的辦法嗎
500 表示伺服器錯誤, 不是你這邊的問題, 隔一段時間再重試看看