/chatbot_simbert

检索类型的微信聊天机器人/问答系统,通过API异步通信,实现在微信上交互,本项目包括模型和工程化部署一体化。包含查天气,知识图谱聊天查询,生成式问答聊天查询,图片识别,多次重复回答等;涉及到命名实体识别,相似匹配(bm25,bool检索,simbert等),bert+seq2seq生成,neo4j知识图谱查询等技术。

Primary LanguagePythonMIT LicenseMIT

chatbot_simbert

检索类型的微信聊天机器人/问答系统,通过API异步通信,实现在微信上交互,可以查询天气、重复问句识别等情况;本项目包括模型和工程化部署一体化。用到SimBert等模型。

描述

各位可以根据自己的需求部署或修改:

问答库如果是任务型的,就是一个任务型聊天机器人,如果闲聊的问答库,那就是闲聊型聊天机器人;

后续也可以添加意图,用来用意图识别的匹配;也可以添加个知识图谱的API...

总之可以添加的模块很多,扩展性非常强大。

品尝方式(使用说明)

准备:

环境准备:安装requirement中的依赖包

下载模型,并放置在code/1.retrieve_match/3.simbert_match/config路径下:

simbert模型:https://github.com/ZhuiyiTechnology/pretrained-models

启动:

1、 启动code/2.API_serve/KG_service.py

2、 启动code/3.wx_project/chat_bot.py(需要扫码登录)

开始邀请朋友和你聊天吧
如果自己有前端展示,不想通过微信来交互,可以启动QAserver,用这个API和你自己的前端做交互即可。

实现思路

整体工程如下,主要有三块:前端、后端、前后端交互;

1、前端直接用微信展示,比较简单,不需要我们做什么;

2、后端采用检索匹配模型的方式,结合粗排和精排;

3、前后端的交互用sanic实现异步通信。

模型部分实现的主要流程如下,初始时有个问答库:

1、先用BM25和Bool检索把问句query和问答库做字词上的粗排,返回topN;

2、将query和粗排得到的topN用SimBert向量化,再将两者做consine相似度计算得到最相似的top1。

意图识别

在此想特地说下意图识别的方式:
常用方式:通过模型实现意图中domain分类,intent分类,以及slot槽的命名实体识别;
大体思路就是识别了用户想要做什么,然后识别出他要做的事情的对象,比如说用户想要“查天气”,所以意图就是查天气,然后我们就需要了解到用户想查的“城市”和“日期”两个槽,我们需要填充这两个槽。
这里我们最先要弄好的是两个分类模型
作者在研究的时候发现一个更好的实现意图识别的方式:通过匹配相似句达到意图识别

实现方式:

1、在问答库中添加某个意图可能的问法
2、通过SimBert精准匹配意图,匹配上则进入该意图的对话管理

优势:

私认为这种方式具有很高的准确性,以及扩展性
1、准确性:如上文所说,常用的意图需要做分类,而分类模型需要有数据支撑才能有比较好的效果;
用匹配的方式,通过相似句子评分,能够很精确的匹配到意图;
2、扩展性:常用的意图分类方式,在新增意图时需要重新训练分类模型;但是如果是匹配的话,无需重新训练分类模型,只需要在库中新增该意图的问法即可!!!非常方便!!!

交流

微信公众号:卓师叔

知乎:学习学习再学习