在上一篇<基于FAQ的智能问答(二):召回篇>中已经介绍了,给定一个用户的query如何从知识库中快速准确的召回一小批相关的问题,本篇将继续介绍如何对这一小批问题进行精排,最终构建出answer返回给用户。
任务描述
给定一个用户的问题q,和一批召回的问题d,对每个d进行相关性的打分计算,并根据相关性进行评价。同时根据top1打分的不同,客户端执行不同的操作:(1) 如果top1的评分"很高",则直接将答案返回给用户 (2) 如果top1的评分"较高",则进行问题的推荐 (3) 如果top1的评分"较低",则提示无法回答。
评价指标
模型结构
数据构建
对于智能问答场景的精排模型,构建的数据集结构如下:
数据集中的一个例子
所以通过这种方法,可以构建一个大规模的通用领域的弱标签的排序数据集,从而训练出一个通用的排序模型。
模型上线
在模型的预测阶段,给定q与d,可直接计算出q与d的相似度。所以给定一组d,就可根据相似度返回有序的结果。
整个精排模块在进行模型蒸馏以后,部署在k8s的cpu集群上(web API + Tensenflow-Serving),单个pod在batch size=20,max_seq_len = 64的场景下,响应时间为100ms. 满足线上的需求。
玄学阈值:在精排部分我们需要界定出top1的结果是否为正样本,即能不能直接作为答案返给用户;同时top1 - top5中哪些可以作为推荐问进行推荐
最简单的方案是卡一个阈值,例如相似度大于0.85,就认为是正样本,可以直接把知识库中的答案返回给用户;相似度小于0.85但是大于0.1,就认为可以作为推荐问;最后如果top1的相似度小于0.1,就认为无法解答。具体的阈值可以在测试集上进行搜索,保障在测试集上的准确率能够达到95%,同时召回率能够达到80%。(95%与80%来源于业务的指标要求,可调整)。
但是这种方案需要小心翼翼,在实际的场景往往很难很好的去卡这个阈值。
不过从产品实际上来考虑,真的要对边界抱有执念吗?对于原本应该直接回答的query,没有直接回答,而是把非常相关的top1结果进行了推荐,其实也没问题,不会牺牲特别大的用户体验;同时对于原本就没有答案的样本,而也将top1的结果进行推荐(因为有一点的相关性),也不会牺牲用户体验,反而也在引导用户。所以“尽可能的多推荐”,从产品上是合适的。