頂部注意:該項目不太好。
基於變壓器的對話框模型更好,我們建議使用它們代替基於RNN的Cakechat。請參閱,例如https://github.com/microsoft/dialogpt
Cakechat是能夠通過對話表達情緒的聊天機器人的後端。

Cakechat建立在Keras和Tensorflow上。
該代碼是靈活的,可以通過任意的分類變量來調節模型的響應。例如,您可以訓練自己的基於角色的神經對話模型[1]或創建情感聊天機[2] 。

模型:
單詞嵌入層:
解碼
指標:
如果您熟悉Docker,這是運行預先訓練的CakeChat模型作為服務器的最簡單方法。您可能需要使用sudo運行以下命令。
CPU版本:
docker pull lukalabs/cakechat:latest &&
docker run --name cakechat-server -p 127.0.0.1:8080:8080 -it lukalabs/cakechat:latest bash -c "python bin/cakechat_server.py"
GPU版本:
docker pull lukalabs/cakechat-gpu:latest &&
nvidia-docker run --name cakechat-gpu-server -p 127.0.0.1:8080:8080 -it lukalabs/cakechat-gpu:latest bash -c "CUDA_VISIBLE_DEVICES=0 python bin/cakechat_server.py"
就是這樣!現在,通過在主機計算機上運行以下命令來測試您的Cakechat服務器:
python tools/test_api.py -f localhost -p 8080 -c "hi!" -c "hi, how are you?" -c "good!" -e "joy"
響應可能看起來像這樣:
{'response': "I'm fine!"}
Docker是設置環境並安裝所有依賴性培訓和測試的最簡單方法。
注意:我們強烈建議使用支持GPU的環境進行培訓Cakechat模型。可以在GPU和CPU上進行推斷。
安裝Docker。
從Dockerhub汲取僅CPU的Docker映像:
docker pull lukalabs/cakechat:latest
docker run --name <YOUR_CONTAINER_NAME> -it lukalabs/cakechat:latest
安裝NVIDIA-DOCKER以進行GPU支持。
從Dockerhub拉出啟用GPU的Docker映像:
docker pull lukalabs/cakechat-gpu:latest
nvidia-docker run --name <YOUR_CONTAINER_NAME> -it cakechat-gpu:latest
就是這樣!現在,您可以訓練模型並與之聊天。有關更多說明,請參見下面的相應部分。
如果您不想處理Docker,則可以手動安裝所有要求:
pip install -r requirements.txt -r requirements-local.txt
NB:
我們建議在VirtualEnv中安裝要求,以防止與系統軟件包混亂。
您可以通過運行python tools/fetch.py下載我們的預訓練模型權重。
預訓練模型的參數如下:
該模型在具有約5000萬個對話框(11GB的文本數據)的預處理Twitter語料庫上進行了培訓。為了清理語料庫,我們刪除了
我們使用情緒分類器將每種話語用以下5種情感之一標記: "neutral", "joy", "anger", "sadness", "fear" ,並在訓練過程中使用了這些標籤。用您可以使用的情緒來標記自己的語料庫,例如DeepMoji工具。
不幸的是,由於Twitter的隱私政策,我們不允許我們提供數據集。您可以在可用的任何文本對話數據集上訓練對話框模型,可以在此處找到現有的對話數據集的概念:https://breakend.github.io/dialogdatasets/
培訓數據應該是一個TXT文件,其中每行是有效的JSON對象,代表對話框的列表。請參閱我們的虛擬火車數據集以查看必要的文件結構。培訓前,用您的數據替換此虛擬語料庫。
有兩個選擇:
第一種方法不太限制:您可以使用所需的任何培訓數據並設置模型的任何配置參數。但是,您應該知道,您需要足夠的火車數據(至少約50MB),一個或多個GPU和足夠的耐心(天)才能獲得好模型的回复。
第二種方法受到預訓練模型的配置參數的選擇限制 - 有關完整列表,請參見cakechat/config.py 。如果默認參數適合您的任務,則應該是一個不錯的選擇。
通過運行python tools/fetch.py從Amazon S3獲取預訓練的模型。
將您的培訓文本語料庫放入data/corpora_processed/train_processed_dialogs.txt 。確保您的數據集足夠大,否則您的模型風險超過數據,結果將很差。
運行python tools/train.py 。
results/nn_models中查找預訓練的模型權重,從配置參數集推斷出完整的路徑。-i參數指定文件的路徑,例如, python tools/train.py -i results/nn_models/my_saved_weights/model.current 。CUDA_VISIBLE_DEVICES=<GPU_ID>環境變量(如NVIDIA-SMI命令的輸出)。例如, CUDA_VISIBLE_DEVICES=0 python tools/train.py將在第0- gpu上運行火車過程。-s在訓練數據的第一個n樣本的子集上訓練模型,以加快調試預處理的速度。例如,運行python tools/train.py -s 1000來訓練前1000個樣品。訓練有素的模型的權重將其保存到results/nn_models/ 。
將您的培訓文本語料庫放入data/corpora_processed/train_processed_dialogs.txt 。
在cakechat/config.py中設置培訓參數。有關更多詳細信息,請參見配置設置說明。
考慮運行PYTHONHASHSEED=42 python tools/prepare_index_files.py以使用培訓語料庫中的令牌和條件構建索引文件。確保設置PYTHONHASHSEED環境變量,否則,您可能會獲得腳本不同啟動的不同索引文件。警告:此腳本覆蓋原始令牌索引文件數據data/tokens_index/t_idx_processed_dialogs.json和data/conditions_index/c_idx_processed_dialogs.json 。您只能運行此腳本,以防您的語料庫足夠大,可以包含您希望模型理解的所有單詞。否則,請考慮如上所述對預訓練的模型進行微調。如果您弄亂了索引文件並想要獲取默認版本,請刪除您的副本並運行python tools/fetch.py 。
考慮運行python tools/train_w2v.py來構建培訓語料庫的W2V嵌入。警告:此腳本覆蓋存儲在data/w2v_models中的原始W2V權重。您只能運行此腳本,以防您的語料庫足夠大,可以包含您希望模型理解的所有單詞。否則,請考慮如上所述對預訓練的模型進行微調。如果您弄亂了W2V文件並想要獲取默認版本,請刪除文件複製並運行python tools/fetch.py 。
運行python tools/train.py 。
CUDA_VISIBLE_DEVICES=<GPU_ID>環境變量(如NVIDIA-SMI命令的輸出)。例如, CUDA_VISIBLE_DEVICES=0 python tools/train.py將在第0- gpu上運行火車過程。-s在訓練數據的第一個n樣本的子集上訓練模型,以加快調試預處理的速度。例如,運行python tools/train.py -s 1000來訓練前1000個樣品。您還可以設置IS_DEV=1來啟用“開發模式”。它使用減少數量的模型參數(降低隱藏層尺寸,令牌序列的輸入和輸出大小等)並執行冗長的記錄。有關DEV參數的完整列表,請參閱cakechat/config.py的底線。
訓練有素的模型的權重將其保存到results/nn_models/ 。
啟用GPU的Docker容器支持使用HOROVOD在多個GPU上的分佈式火車。
例如,運行python tools/distributed_train.py -g 0 1開始在0和1 GPU上訓練。
在培訓期間,以下數據集用於驗證指標計算:
data/corpora_processed/val_processed_dialogs.txt (虛擬示例,用數據替換) - 對於上下文敏感數據集data/quality/context_free_validation_set.txt - 用於無上下文驗證數據集data/quality/context_free_questions.txt - 用於生成用於記錄和計算不同的響應的響應data/quality/context_free_test_set.txt - 用於計算訓練模型的指標,例如排名指標將指標存儲到cakechat/results/tensorboard ,可以使用張板可視化。如果您從提供的CPU或啟用GPU的Docker映像運行Docker容器,則Tensorboard Server應自動啟動並在http://localhost:6006上使用。在瀏覽器中打開此鏈接以查看培訓圖。
如果您手動安裝要求,請首先從CakeChat root Directory運行以下命令:
mkdir -p results/tensorboard && tensorboard --logdir=results/tensorboard 2>results/tensorboard/err.log &
之後,繼續訪問http://localhost:6006 。
您可以運行以下工具來評估訓練有素的測試數據模型(虛擬示例,用數據替換):
tools/quality/ranking_quality.py - 計算對話模型的排名指標tools/quality/prediction_distinctness.py - 計算對話框模型的不同計量tools/quality/condition_quality.py - 根據條件值計算不同數據子集的指標tools/generate_predictions.py - 評估模型。在給定的對話框上下文集合中生成對話模型的預測,然後計算指標。請注意,如果要使用“*reranking”預測模式, data/nn_models目錄中應該具有反向模型tools/generate_predictions_for_condition.py - 生成給定條件值的預測運行一個服務器,該服務器使用給定的輸入消息處理HTTP-重新要求,並從模型中返迴響應消息:
python bin/cakechat_server.py
指定CUDA_VISIBLE_DEVICES=<GPU_ID>環境變量可在某個GPU上運行服務器。
如果要使用我們的預訓練模型,請不要忘記在啟動服務器之前運行python tools/fetch.py 。
為確保一切正常,請在以下對話中測試模型
- 嗨,埃迪,怎麼了?
- 不多,你呢?
- 很好,謝謝。你明天要去電影嗎?
通過運行命令:
python tools/test_api.py -f 127.0.0.1 -p 8080
-c "Hi, Eddie, what's up?"
-c "Not much, what about you?"
-c "Fine, thanks. Are you going to the movies tomorrow?"
例如,您應該得到一個有意義的答案,例如:
{'response': "Of course!"}
JSON參數為:
| 範圍 | 類型 | 描述 |
|---|---|---|
| 情境 | 字符串列表 | 對話歷史記錄中先前消息的列表(使用最多3) |
| 情感 | 弦,枚舉之一 | {'中性','憤怒,“歡樂”,“恐懼”,“悲傷”}之一。一種情緒來調節反應。可選參數,如果未指定,則使用“中性” |
POST /cakechat_api/v1/actions/get_response
data: {
'context': ['Hello', 'Hi!', 'How are you?'],
'emotion': 'joy'
}
200 OK
{
'response': 'I'm fine!'
}
我們建議在生產規模上使用Gunicorn為模型的API服務。
安裝槍支: pip install gunicorn
運行一個服務器,該服務器使用輸入消息處理HTTP-queries並返回模型的響應消息:
cd bin && gunicorn cakechat_server:app -w 1 -b 127.0.0.1:8080 --timeout 2000
您可以將CakeChat模型作為電報機器人運行:
python tools/telegram_bot.py --token <YOUR_BOT_TOKEN>並在電報上與之聊天。 cakechat/dialog_model/ - 包含計算圖,培訓過程和其他模型實用程序cakechat/dialog_model/inference/ - 響應生成算法cakechat/dialog_model/quality/ - 指標計算和記錄的代碼cakechat/utils/ - 用於文本處理的實用程序,W2V培訓等。cakechat/api/ - 運行HTTP服務器的功能:API配置,錯誤處理tools/ - 用於培訓,測試和評估模型的腳本bin/cakechat_server.py - 運行一個HTTP服務器,該服務器返回給定對話框上下文和情感的響應消息。有關詳細信息,請參見運行部分。tools/train.py - 在數據上訓練模型。您可以使用--reverse選項來訓練“* - reranking”響應生成算法中使用的反向模型,以進行更準確的預測。tools/prepare_index_files.py - 為最常用的令牌和條件準備索引。在從頭開始訓練模型之前,請使用此腳本。tools/quality/ranking_quality.py - 計算對話框模型的排名指標。tools/quality/prediction_distinctness.py - 計算對話框模型的不同計量。tools/quality/condition_quality.py - 根據條件值計算不同數據子集的指標。tools/generate_predictions.py - 評估模型。在給定的對話框上下文集合中生成對話模型的預測,然後計算指標。請注意,如果要使用“* - reranking”預測模式, results/nn_models目錄中應該具有反向模型。tools/generate_predictions_for_condition.py - 生成給定條件值的預測。tools/test_api.py - 示例代碼將請求發送到運行的HTTP-Server。tools/fetch.py - 下載與之關聯的預訓練模型和索引文件。tools/telegram_bot.py - 在訓練有素的模型上運行電報機器人。cakechat/config.py中定義了網絡體系結構,培訓,預測和記錄步驟的所有配置參數。 http-server中使用的一些推理參數在cakechat/api/config.py中定義。
網絡架構和大小
HIDDEN_LAYER_DIMENSION是定義復發層中隱藏單元數量的主要參數。WORD_EMBEDDING_DIMENSION和CONDITION_EMBEDDING_DIMENSION定義每個令牌/條件被映射到的隱藏單元數量。tokens_index目錄中字典中的令牌數定義的。解碼算法:
PREDICTION_MODE_FOR_TESTS定義瞭如何生成模型的響應。選項如下:DEFAULT_TEMPERATURE參數來控制溫度值。SAMPLES_NUM_FOR_RERANKING和MMI_REVERSE_MODEL_SCORE_WEIGHT參數來調整此模式。請注意,還有其他參數會影響響應生成過程。請參閱REPETITION_PENALIZE_COEFFICIENT , NON_PENALIZABLE_TOKENS , MAX_PREDICTIONS_LENGTH 。
通過在數據集條目中提供其他條件標籤,您可以構建以下模型:
要利用這些額外的條件,請參閱培訓模型的部分。只需將培訓集中的“條件”字段設置為以下一個:角色ID ,情感或主題標籤,更新索引文件並開始培訓。
Cakechat由Replika團隊開發和維護:
Nicolas Ivanov,Michael Khalman,Nikita Smetanin,Artem Rodichev和Denis Fedorenko。
Oleg Akbarov,Alexander Kuznetsov和Vladimir Chernosvitov的演示。
可以在此處跟踪所有問題和功能請求 - GitHub問題。
©2019 Luka,Inc。根據Apache許可證獲得許可,版本2.0。有關更多詳細信息,請參見許可證文件。