目前有两种典型的方法:一是基于检索的模型,二是基于 Seq2Seq 的生成式模型。检索回复答案可控但无法处理长尾问题, Seq2Seq则难以保证一致性和合理性。
阿里小蜜首先采用检索模型从 QA 知识库中找出候选答案集合,然后利用带注意力的 Seq2Seq 模型对候选答案进行排序,如果第一候选的得分超过某个阈值,则作为最终答案输出,否则利用生成模型生成答案。
通常 Chatbot 包括两个部分:IR 模块和生成模块。针对用户的问题,IR 模块从 QA 知识库中检索到对应的答案,生成模块再用预训练好的 Seq2Seq 模型生成最终的答案。问题是,对于一些长问句或复杂问句往往无法在 QA 知识库中检索到匹配的条目,并且生成模块也经常生成不匹配或无意义的答案。
方法:将 IR 和生成模块聚合在一起,用一个 Seq2Seq 模型来对搜索结果做评估,从而达到优化的效果。
-
QA知识库
从在线的真人用户服务 log 里提取问答对作为 QA 知识库。过滤掉不包含相关关键词的 QA,最后得到 9164834 个问答对。 -
IR模块
利用倒排索引的方法将每个单词隐射到包含这个单词的一组问句中,并且对这些单词的同义词也做了索引,然后利用 BM25 算法来计算搜索到的问句和输入问句的相似度,取最相似问句的答案。 -
生成模型
生成模型是一个 attentive seq2seq 的结构。 采用了一个 GRU,由 question 生成 answer,计算生成单词的概率。
其中加了 context 向量,他是由图中的 α 求得的,α 表示的是当前步的输入单词,和上一步的生成单词之间的匹配度,用了一个 alignment 模型计算。
要注意,对于各个 QA 长度不等的情况,采用了 bucketing 和 padding 机制。另外用了 softmax 来随机采样词汇表中的单词,而不使用整个词汇表,从而加速了训练过程。还是用了 beam search decoder,每次维护 top-k 个输出,来取代一次一个输出的贪心搜索。 -
rerank 模块
使用的模型和上面是一样的,根据输入问题来为候选答案打分,使用平均概率作为评分函数:
【揭秘阿里小蜜:基于检索模型和生成模型相结合的聊天引擎】
https://blog.csdn.net/uwr44uouqcnsuqb60zk2/article/details/78849003
【基于检索的聊天机器人的实现】
https://blog.csdn.net/Irving_zhang/article/details/78788929
【该作者的其他优秀博客】
https://blog.csdn.net/irving_zhang?t=1
网友评论