项目介绍
项目地址:
nocoolsandwich/iamQAgithub.com这个项目是参照的DrQA想法搭建了一个中文的百科问答系统,通过该项目你可以使用上BERT和W2V(词向量搜索),NER(命名实体识别)等NLP模型方法去搭建你的中文问答系统。
涉及技术
NLP:BERT,ALBERT,NER,W2V
服务系统:torchserver,flask
除了NLP方法,本项目还涉及torchserve部署和flask后端,不过这些技术细节你都暂时不需要太了解,只需要通过readme的步骤即可搭建好你的中文问答系统,如果你想深入学习可以看项目源码。接下来我们各个模块深入讲解。
项目框架
本项目框架
回答的流程:做entity link我们先NER识别出周星星,结果知识库没有周星星这个词条,然后W2V发现周星星就是周星驰,接着我们得到周星驰的词条,把问题和文档喂给bert,bert回答到是李小龙。这就是整个流程。出发之前我们先看下前辈DrQA。
先看一下QrQA这个项目的框架,这个是facebook团队在ACL 2017发表的,那时候BERT还没出生,这篇论文的主要贡献之一就是做了一个还可以的阅读理解模型,用的是sequence模型。
DrQA回答问题流程:
问题 》 retriever(索引问题相关文档) 》 reader(从文档抽取精确答案) 》 回答
DrQA用的是ES文档搜索,当时我试了一下效果比较差,特别在对一些问题是关于某个人的情况,比如问:川普毕业于哪里,搜索会指向文章里面有很多“川普”这两个字的文档,而不会指向川普的词条。我突然想到,可能是我对每条文档没有足够的拆分,如果文档拆分的颗粒度细一些可能不会出现这个问题。
对QrQA改造
对于上述问题document retriever很难指向实体文档,所以我换成了entity linking的方法,使用了NER和W2V的方法,同事针对阅读理解更换成中文数据集的BERT,具体可以看下列表格
NLP模块
NER
NER使用的是CCKS2016 KBQA的问题数据构造,这样我们可以更容易识别出问题中的实体,具体是参照这个项目:
997261095/bert-kbqagithub.com我在项目基础把模型载入更换成了hugging face的transformers,他也是pytorch写的,并且提供了更加友好的模型下载方式,这样可以的更换模型来进行实验。具体的代码修改我们只要关注到tokenizer和model,以及model的输出部分的调整。实体识别F1和准确率都是98%以上。
W2V
直接使用了这个项目训练好的W2V,使用的是综合语料的结果。
Embedding/Chinese-Word-Vectorsgithub.comREADER
参考项目,
CLUEbenchmarkgithub.com这是一个非常棒的中文GLUE(General Language Understanding Evaluation)项目,他叫CLUEbenchmark,基本包含所有的中文GLUE项目的benchmark。我们用的就是里面的CMRC2018baseline,中文阅读理解比较出名的数据集就是CMRC2018了,他是类SQuAD数据集,用于中文阅读理解问题。
关于reader的模型结果:
ALBERT_base在dev的EM有66%,结果是稍微优于CLUEbenchmark的dev得分,这与使用的预训练模型在数据集和超参数等细节造成的。几个点的出入而已。值得注意的是test的得分,因为我没有在test上测试过,但是可以从他们的实验结果中得知我的模型在test的EM应该也在70%这样。
部署模块
torchserve
torchserve可以参考我这个文章,torchserve是给torch做模型部署的。
Nozhihu:torchserve模型部署与CMRC2018问答系统部署zhuanlan.zhihu.com前端交互
直接套用这个框架,改一改后端获取数据的方法就好了,改成从torchserve请求,得到访问结果。
drqa-webuigithub.com成果展示
这里贴几张,大家可以通过项目iamQA搭建,同时扩展你的知识库让系统懂更多,你也可以改进你的文档索引器,不一定使用Entity Linking的形式,使用ES对大量文档的索引是一个方法,也可以用深度匹配的形式,或者把知识库换成FAQ,做一个FAQ问答系统,套用上torchserve和前端。
nocoolsandwich/iamQAgithub.com