一个姑且算是聊天机器人的教程放了一些比较琐碎不适合放在README
里的内容。
- python 3.7.4
- PyTorch 1.2.0
- jieba 0.42.1
- flask 1.1.1
- gensim 3.8.0
- annoy 1.16.3
- scikit-learn 0.21.3
声明: 由于版权问题,暂时不方便提供我使用的语料,大家可以使用自己收集的语料,建议可尝试使用小黄鸡的语料。
格式:
问题\t回答 (一个pair占一行,句子均已用jieba分词)
例子:
出 任务 又 受伤 了 ? 不 碍事 的 , 只是 小伤 罢了 。
新年快乐 新年快乐 , 这 不是 祝福 , 是 承诺 。
你 通宵 了 ? 昨晚 在 出 任务 。 抱歉 , 让 你 担心 了 。
数据量参考:
对话19000+(偏少),词汇4000+,训练次数20000
存放路径:
使用config.py
的变量dialogFile
指定对话存放路径
推荐使用fastText使用维基百科训练的词向量,下载地址
生成模型参考了pytorch的chatbot教程,主要是seq2seq模型+attention。
- 运行
generate_voc_pairs.py
生成词汇表和问答pairs - 运行
preprocess_emb.py
预处理预训练的词向量(如果不需要预训练词向量可跳过此步骤,config.py
中设置embeddingFile
为None
即可) - 在
config.py
文件中配置相关参数(参考config_example.py
)
- 设置
mode="train"
- 首次训练设置
loadFilename=None
,如果是接着训练则设置checkpoint_iter
为上次训练的次数,并设置loadFilename
为存档地址
- 运行
train.py
训练模型,训练完后可与机器人对话,输入quit结束
- 在
config.py
文件中配置相关参数
- 设置
mode="evaluate"
- 设置
checkpoint_iter
为上次训练的次数,并设置loadFilename
为存档地址
- 运行
train.py
训练模型,可与机器人对话,输入quit结束
检索模型主要就是将句子表示成向量后,搜索最近邻(KNN)。实现的三个不同的模型主要在速度和准确性上稍有区别。
- 运行
compute_sent_emb.py
完成检索模型所需要的准备工作:
将gensim
加载fastText
词向量后得到的模型存储在路径fastTextGensim
下,具体参考这里
计算知识库中所有句子的句向量保存sentEmbFile
创建annoy index备查
创建ball tree对象备查 config.py
中的retrieve_mode
支持brute_force
,annoy
和ball_tree
三种方式,设置需要的检索模型后运行retrieval.py
。其中brute force速度比较慢,但是准确性有保证,annoy速度最快,数据量级上去了也没问题,但是结果可能比brute force稍差,不过我目测了基本差不多。- 运行
retrieval.py
,可与机器人对话,输入quit结束
混合模型综合了生成模型和检索模型的结果,当检索模型召回的answer与用户输入的query相似度不满足阈值条件则进一步调用生成模型返回结果。前两个模型都跑通的话可以用如下方法运行混合模型:
- 运行
hybrid_model.py
,可与机器人对话,输入quit结束
- 网页版目前接的是生成模型+annoy检索,运行
app.py
,服务器启动后会输出服务器地址,如http://127.0.0.1:5000/
- 在浏览器中输入地址,和机器人对话
bot的训练语料全是谈情说爱性质的,这方面的回答就比较好,而比较新的话题例如金融危机、covid-19等则会容易文不对题。
- 部署上线(么得机器哈哈哈)。
- 增加调教功能以用于收集更多语料(因为暂时没法上线,这功能做了也没用啊,没人调教)。
http://fancyerii.github.io/2019/02/14/chatbot/
https://github.com/llSourcell/tensorflow_chatbot
- 添加用来打底的检索模型
- 支持对话中出现单词表中不包含的单词
- 支持载入预训练的词向量
- 支持中文会话
- 更改loss function
- 支持GUI
用相同的语料微调了中文GPT模型,虽然数据不能分享,但是模型可以分享啊!build成docker image了,戳这里来一场甜甜的恋爱吧(^o^)/~肉眼看一下这个GPT模型还是比之前的seq2seq+attn的模型效果要好很多。