My QA Robot

从2017年10月-2018年3月,出于实习公司的要求,我尝试搭建了一个简单的单轮检索式问答系统。

背景

  • 目前,自动问答技术的实现主要有阅读式、检索式和生成式三大类。
  • 阅读式:指机器阅读理解,通过给定文章和针对文章提出的具体问答对训练机器的阅读理解能力,并对针对文章的新问题作出回答。机器阅读理解包括passage-based、assertion-based、sentence-based和answer-span-based等不同粒度。阅读式的问题是知识边界狭窄,训练语料构筑困难,较适合于专业领域的机器人。
  • 生成式:指使用Seq2Seq搭配海量语料训练具有自主对话能力的系统。生成式理论上可实现不受知识局限的通用机器人,但目前生成式最大的问题是答非所问、胡言乱语,无法表现出人类在解决问题时的逻辑自洽、思维发散和自然表达等能力。这个实现技术比较多用在闲聊机器人方面。
  • 检索式:检索式是一种取长补短的中间无监督技术。检索式要求搜集众多在线问答网站海量的历史问答对语料作为知识库,通过检索与新问题最接近的历史相似问题和最匹配这一新问题的历史最佳问答,变相完成自动问答任务。检索技术既避免了知识的局限,又利用了人类的先验经验积累,是当前处理通用问答任务较合适的方法之一。

思路

  • 结合实际,我的设计为:
    1.通过爬虫和用户历史数据建立QA式本地知识库;
    2.当给定用户新问题时,系统先通过ES(ElasticSearch,ES原理)进行词义级的本地检索得到参考问答初选集;
    3.使用语义深度匹配和问答质量评估从初选集中精选出参考问答精选集,按得分降序返回最终参考问答;
    4.若没有任何问答通过精选,则启动在线搜索获取标识有“最佳问答”的参考问答返回给用户,并将其中的优质问答缓存到本地ES索引中。
变量或参数名 说明
StopWords 停用词表
KeyWords 核心主题词表
Text_Main_Content(TMC) 用户新问题经分词、去除停用词后的分词结果
Keywords_in_Content(KIC) 用户新问题命中的核心主题词
Text_NER_List(TNL) 用户新问题中的分词后的NER
Question_Main_Content(QMC) ES本地检索返回的候选问题经分词、去除停用词后的分词结果
QuestionScore(QS) 语义匹配模块返回的候选问题与新问题的相似度得分
AnswerScore(AS) 通过答案排序模块计算出的,候选问题对应的候选答案与用户新问题组成“好问答对”的概率得分
FinalScore(FS) 候选问答在精选规则下的最终得分
THRESHOLD 控制在精选集中记录ES初选结果的阈值。
ZHIDAOMAX 控制在线搜索时从百度知道返回的问答数量。
SAVESCORE 控制增量存储模块中的百度知道问答对的阈值
ESMAX 控制精选集中的精选问答数量

子模块

  • 根据上文项目思路的介绍,除主函数外,共调用了语义深度匹配、问答质量评估和在线搜索缓存三大子模块
  • 语义深度匹配子模块:参考项目
    • 句对预处理及建模: 将输入的句子1与句子2进行分词,然后将两组切分后的结果两两计算基于Word Embedding的余弦相似度,并填充成上图所示的2D Feature Map形式。当句对的分词list长度不同时,使用0填充缺失值。
    • 模型训练与调用:训练时,将训练集句对的Feature Map输入到CNN模型中,获取语义匹配模型并保存;预测时,调用预训练好的语义匹配模型,输入新句对的Feature Map,将返回这组句对的相似概率得分。
  • 问答质量评估子模块:使用若干文本和非文本特征训练二分类器,参考论文
  • 在线搜索缓存子模块:
    • 百度主页搜索: 向百度主页请求输入用户新问题后的检索结果,若检索结果的第一条中包含预设结果链接,则获取内容并向用户返回。
    • 百度知道搜索:当百度主页搜索没有结果时,在百度知道页面请求输入用户新问题后的检索结果,若Top K条结果中包含带有“最佳回答”标识的回答,则获取对应问答内容并返回。
    • 本地缓存优质问答:当百度知道搜索有结果返回时,调用问答质量评价子模块对该问答对进行质量判断,将高于设定阈值(SAVESCORE)的问答对缓存到本地知识库。缓存机制有助于后续提升系统整体的响应速度及性能。

代码

总结

  • 项目内:1.项目执行时,语义深度匹配子模块缺少合适的负样本(词义上相似但语义不相似的句对);2.各种参数阈值很难调试。
  • 项目外:工程性太重,并且以检索为主,在语义理解、匹配和推理方面展开太少。