分類

展開全部 | 收合全部

分類

展開全部 | 收合全部

【Side Project】(全圖文教學) 用 Python flask 實作 ChatGPT 的 Linebot,並部屬至 Vercel 上 (updated: 2023/12/10)

ChatGPT-Linebot using python flask on vercel

作者註:本專案因為作者我的免費 API 額度已經用完了,然後我現在使用的是 ChatGPT Plus
如果之後要我本人更新可能要等我哪天改用 ChatGPT API 了…
現在最新的版本感謝網友 @willismax 提供的 PR:https://github.com/howarder3/GPT-Linebot-python-flask-on-vercel/pull/17
但同樣的因為我沒有 ChatGPT API 的額度了… 所以也沒辦法測就直接 merge 了,
如果不能動再請大家幫忙發個 Issues/PR,感謝大大們🙏

  • last updated: 2023/10/9
    • 更新說明 by @willismax,與修正的 repo (merged)
    • vercel.json修正,改為第2版
    • 修正單純安裝Flask 2.2.2 會與 Werkzeug 衝突的問題,在 requirements.txt 添加 Werkzeug 2.3.7 (參考stack overflow)

本篇教學無經驗的新手也可學習,無須寫任何程式。
無經驗預計 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
已經改為 GPT-4,與最新的 ChatGPT 相同,只是改為使用 OpenAI API 的方式實現

安裝步驟

主要會有四個地方要去:(這部份不看也沒關係,以下照著做就可以了!)

  • 我的 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_MODELtext-davinci-003請參考 OpenAI 對 model 的敘述
OPENAI_TEMPERATURE0請參考 OpenAI 對 temperature 的敘述
OPENAI_FREQUENCY_PENALTY0請參考 OpenAI 對 frequency_penalty 的敘述
OPENAI_PRESENCE_PENALTY0.6請參考 OpenAI 對 presence_penalty 的敘述
OPENAI_MAX_TOKENS240請參考 OpenAI 對 max_tokens 的敘述
MSG_LIST_LIMIT20prompt 參數往回參照的句數
INIT_LANGUAGEzh決定初始語言,可設置為 “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 推薦的範例。

參考資料

Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
另外,因為定位是「個人的隨手筆記」,有些文章內容「⚠️可能我理解有誤⚠️」或「?只寫到一半?」,如果有發現這樣的情況,歡迎在該文章的最下面留言提醒我!我會儘快修正或補上!感謝大家的建議與幫忙,讓網站能變得更好?

文章: 866

39 則留言

  1. 在這個熱門的 bot 風潮中,有許多人也在提供同類功能。然而,你的文件卻脫穎而出,明顯地領先於其他人。我真的很感謝你對這個領域的貢獻,你真是個專業的作者!

  2. HI,作者您好
    目前還在學習Flask中剛好看到這篇post
    但我進行到step 4-2. 設定環境變數的時候沒有顯示OPENAI_API_KEY、LINE_CHANNEL_SECRET、LINE_CHANNEL_ACCESS_TOKEN的輸入位置
    想請問到這邊的話有什麼建議該接著進行下續的步驟?

  3. 2023-02-14T14:17:46.433Z a3b2b6ee-278d-401d-8e40-aa2d7c3b39d2 Task timed out after 10.01 seconds 請問為什麼複雜的問題會有這樣的情況呢?好像是超時了。謝謝

  4. 不好意思嘗試了幾次都無法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

★留個言吧!內容有誤或想要補充也歡迎與我討論!