顶部注意:该项目不太好。
基于变压器的对话框模型更好,我们建议使用它们代替基于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。有关更多详细信息,请参见许可证文件。