以 NTCIR-14 Short Text Conversation Task (STC-3) 之語料為基礎,整合 GPT2-Chinese 語言模型訓練工具,同時串接 LINE Developer 的 Message API 服務,建立情感對話系統。
- Ubuntu Server 20.04 LTS
- Python 3.10
- CUDA Version: 11.0
- NVIDIA-SMI 450.51.06
- Driver Version: 450.51.06
有使用 Conda 的話,可以透過指令來安裝環境:
# 安裝 conda 環境
$ conda create --name chatbot python=3.10
...
(依安裝提示訊息完成套件安裝流程)
...
# 啟用 conda 環境
$ conda activate chatbot
$ git clone https://github.com/telunyang/gpt2-linebot.git
沒有 Git 執行程式,可以直接 Download Zip,再自行解壓縮,而後進入專案資料夾 gpt2_linebot
$ cd gpt2_linebot
下載連結 存放到專案資料夾當中解壓縮,會有一個獨立的 models 資料夾。
$ pip install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
$ pip install torch==1.7.1+cpu torchvision==0.8.2+cpu torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
$ pip install -r requirements.txt
import torch
print(torch.cuda.is_available())
用來記錄使用者每一次的發話與回覆。
$ python makeDB.py
- 登入 LINE Developers。
- 新增 Provider。
- 新增該 Provider 下的 Channel。
- 選擇 Messaging API。
- 依需求選擇、填寫基本資料,勾選頁面底下兩個「I have read agree to the ...」,按下 Create。
- 選擇先前 Create 的 Channel。
- 到 Basic settings 標籤取得 Channel secret。
- 到 Messaging API 標籤:
- 設定 Webhook URL,並驗證 (verify) 是否請求成功。
- 註: 若需要測試環境,可以選擇 ngrok 工具
- 關閉自動回覆訊息 (Auto-reply messages)。
- 取得 Channel access token (long-lived)。
由於 LINE 的 webhook 需要使用 SSL 才能通過請求,若是在測試階段,本機沒有 SSL,此時我們需要一個暫時的 URI 來填入 Webhook URL。
- 進入 ngrok 首頁。
- 註冊一個帳號,或是使用 GitHub 或 Google 帳號來登入。
- 進入儀表板頁面:
- 在儀表板上方,依作業系統規格來選擇 ngrok 檔案下載,並解壓縮到全域性指令集的資料夾中,或是保留在專案當中。
- 假設 ngrok 沒有執行權限,記得加上:
$ chmod +x ngrok
或$ chmod +x ./ngrok
- 接下來加入 auth token 到 ngrok.yml 當中(直接複製儀表板中的內容貼上也行):
$ ngrok config add-authtoken 24e35K*******************************************
- 註:若是放到專案資料夾下,指令可以改成
$ ./ngrok confi add-authtoken ...
開頭。
專案使用的 port 號為 5005,可依需求調整:
$ ngrok http 5005
或
$ ./ngrok http 5005
注意: 要複製 Forwarding 那一列後面的網址,例如
https://xxxx-xxxx-xxxx-x-xxxx-xxxx-xxxx-xxxx-xxxx.jp.ngrok.io
,之後 Webhook 設定會用到。
- 進入先前建立的 Channel。
- 在 Webhook settings 下面的 Webhook URL 當中,編輯/填寫
https://xxxx-xxxx-xxxx-x-xxxx-xxxx-xxxx-xxxx-xxxx.jp.ngrok.io/callback
,記得後面要加上 /callback,這邊會跟主程式相呼應。 - 按下 Update 來儲存設定。
- 開啟 Use webhook。
回到專案資料夾後,準備執行主程式,建立文字生成服務:
$ python app.py
回到剛才 Message API 的 Webhook 設定,按下 Verify,如果沒有錯誤,則會出現以下結果:
註: 記得加入自己建立的 LINE BOT 喔!!
為了在 LINE BOT 當中可以使用指定回話情緒的選單,需要加入 RichMenu、上傳 RichMenu 圖片,並指定預設的 RichMenu。以下會提供幾個程式,可依需求自行修改內容。
註: 記得先將 config.py 的內容設定好。
$ python 1_addRichMenu.py
正常執行的結果,會輸出:
'{"richMenuId":"RichMenu ID 的值"}'
注意: 之後請將 richMenuId 的值,複製到 2_uploadRichMenuImage.py 和 3_setRichMenu.py 有關 richMenuId 變數當中
將上傳專案資料夾當中的 richmenu.jpg,作為 Rich Menu 的背景圖片。
$ python 2_uploadRichMenuImage.py
正常執行的結果,會輸出:
'{}'
$ python 3_setRichMenu.py
正常執行的結果,會輸出:
'{}'
如果主機沒有 SSL 檔案可以用,臨時需要展示,則建議使用 ngrok,此時啟動服務的程式 app.py,在最底下的主程式區塊當中,就可以使用:
if __name__ == "__main__":
app.run(
threaded=False, # 是否透過多執行緒處理請求
host="0.0.0.0", # 設定 0.0.0.0 會對外開放
port=5005 # 啟用 port 號
)
如果主機當中,已經設置好 SSL 環境,則可以使用:
if __name__ == "__main__":
app.run(
threaded=False, # 是否透過多執行緒處理請求
host="0.0.0.0", # 設定 0.0.0.0 會對外開放
port=5005, # 啟用 port 號
ssl_context=(
'/root/certs/fullchain4.pem',
'/root/certs/privkey4.pem')
# 建立 SSL 證證 for LINE Bot Webhook
)
注意: 使用 ssl_context 設定前,一定要先確認是否同時有 fullchain.pem 與 privkey.pem 這兩個檔案。
- checkGPU.py
- 確認主機 GPU 是否能夠啟用。
- makeDB.py
- 建立 sqlite3 資料庫,記錄每一個使用者的發話與回覆。
- testBert.py
- 測試 coherence 分數預測的模型是否能夠執行。