智能问答系统中知识库的构建是重中之重。问答库的构建可以分为三个阶段。第一个阶段:人工构建问题-答案对;第二个阶段:自动挖掘问题,人工填写答案;第三个阶段:自动构建问答对。第一个阶段多见于现在的通用问答平台,第二个阶段是目前问答系统落地的主流,特别是针对长尾问题的解决;第三个阶段是问答库构建的高阶。

假设问答对能够自动构建,由于自动化的方案无法保证绝对的正确,因此对于答案的使用,采用推荐的思路,本质上决定权交给人。假设自动化构建的问答库是高准确的,那么就可以不用推荐的思路了。

问题的定义:给定一个问题,基于自动构建的问答库,推荐了N个答案,如何衡量推荐答案的效果呢?

方法论:既然是一个推荐问题,那么理论上就可以采用推荐领域的指标,但是同时要考虑答案推荐场景的特殊性,合理选用的同时,适当改造。

这篇博客主要讨论第一步要思考的问题,哪些推荐领域的指标可以用于答案推荐的场景?

先看下我们要评估的对象吧,数据如下:

问题 推荐答案
你们家发货有点慢啊 (1)亲,我们在催货了;(2)谢谢,亲亲。(3)还没收到货吗?亲亲。
买家咨询打折 (1)您是想要买什么牌子的?(2)亲亲,建议看下商品详情页哦
这件T恤多大码的? (1)亲亲,你是要退货吗?

如何评估推荐系统在答案推荐上的效果?思考的出发点是:从业务指标到模型指标,评估维度从粗到细。业务侧的同学只需要理解业务指标,业务指标也是业务落地的北极星,直观的特点是:简单粗暴。这里,可以定义的一个业务指标是答案采纳率,如下:

给定一个问题,推荐的答案中,是否有可用答案?基于上述数据,可以得到标注结果如下:

问题 推荐答案 是否采纳
你们家发货有点慢啊 (1)亲,我们在催货了;(2)谢谢,亲亲。(3)还没收到货吗?亲亲。
买家咨询打折 (1)您是想要买什么牌子的?(2)亲亲,建议看下商品详情页哦
这件T恤多大码的? (1)亲亲,你是要退货吗?

因此,答案采纳率=2/3。为什么是合理的?想象一个业务同学在审核推荐答案的时候,当推荐答案的数量小于K(其中K是一个很小的数)时,快速浏览一下,就可以选择自己想要的答案了。该指标评估的是:推荐答案到底有没有用?

简单粗暴并不意味着不可用,所有指标的选择依据在于想通过该指标评估系统的具体哪个方面。那么,该指标有什么地方没有考虑到?

(1)给定一个问题和推荐答案列表,采纳1个和采纳多个不一样吧?(如何设计指标呢?)

(2)能否把优质的答案排在靠前的位置,很重要吧?(推荐内容的位置很重要)

这里主要讨论(2),传统的推荐或者搜索系统,返回结果量级大,需要翻页处理,因此最有可能被采纳的结果放在靠前的位置是一个重要的因素,但是对于答案推荐的场景,总共推荐的答案量级非常小,用户第一眼就可以全部浏览完,相比之下,对位置的要求不太严苛,但是绝大多数用户都是从上向下浏览,并且用户习惯默认排在前的答案是优质答案,当结果不符合预期的时候,用户体验就会变差,因此在答案推荐的场景下,对答案位置的考察也是必要的。

这里直接借鉴推荐的三个指标:MAP, MRR和NDCG。

(1)平均准确率(MAP)

为了计算该指标,按照既定格式给上述数据重新打标,假设结果如下:

问题 推荐答案 是否采纳  
  你们家发货有点慢啊 (1)亲,我们在催货了;
    (2)谢谢,亲亲。
    (3)还没收到货吗?亲亲。
  买家咨询打折 (1)您是想要买什么牌子的?
    (2)亲亲,建议看下商品详情页哦
  这件T恤多大码的? (1)亲亲,你是要退货吗?

MAP首先计算每个问题的推荐准确率,其次对所有问题取平均。具体计算过程如下:

P(你们家发货有点慢啊) = (1/1+2/3)/3 = 5 /9,其中1/1表示,前1个位置的采纳率;2/3表示前3个位置的采纳率;因此,这里就是对推荐位置考察的体现,分母的3表示推荐答案总数。

依次类推,可以得到:

P(买家咨询打折)= (1/2)/2 = 1/4

P(这件T恤多大码的?)= 0

则,MAP = (5/9+1/4+0)/3 = 29/108,该值的范围为[0,1],且越大越好。

(2)平均倒数序(MRR)

为了计算该指标,按照既定格式给上述数据重新打标,假设结果如下:

问题 推荐答案 采纳答案序号 倒数
你们家发货有点慢啊 (1)亲,我们在催货了;(2)谢谢,亲亲。(3)还没收到货吗?亲亲。 1 1/1
买家咨询打折 (1)您是想要买什么牌子的?(2)亲亲,建议看下商品详情页哦 2 1/2
这件T恤多大码的? (1)亲亲,你是要退货吗?   0

MRR=(1/1+1/2+0)/3=1/2

标准的MRR计算是从推荐答案中选择一个最佳的答案,当可以选择多个答案的时候,如何计算MRR呢?

(3)NDCG(normalized discounted cumulative gain)

对比(1)中的MAP,对于每个答案,只关心采不采纳,但是更细粒度的评估是这个答案有多好?(用量化的方式表达)

为了计算该指标,按照既定格式给上述数据重新打标,假设结果如下:

问题 推荐答案 有多好?  
  你们家发货有点慢啊 (1)亲,我们在催货了; 5
    (2)谢谢,亲亲。 0
    (3)还没收到货吗?亲亲。 3
  买家咨询打折 (1)您是想要买什么牌子的? 0
    (2)亲亲,建议看下商品详情页哦 4
  这件T恤多大码的? (1)亲亲,你是要退货吗? 0

为了计算NDCG,可以按照CG,DCG,NDCG的计算顺序。

CG(你们家发货有点慢啊) = 5+0+3 = 8

但是CG没有考虑顺序,添加对顺序的考察,计算DCG。这里是一种对顺序的考察:

对有多好?的评分,做变换:(2^评分-1)/log2(位置+1)。那么,可以得到:

DCG(你们家发货有点慢啊) = (2^5-1)/log2(2)+(2^0-1)/log2(3)+(2^3-1)/log2(4)

从上述标注结果可以看到,虽然有的答案排在第三位,但是用户给出的评分确实第二位的。这里可以计算IDCG,其中I表示理想的。和DCG的计算区别在于:需要按照评分从大到小排序后计算DCG。

IDCG(你们家发货有点慢啊) = (2^5-1)/log2(2)+(2^3-1)/log2(3)+(2^0-1)/log2(4)

那么,NDCG = DCG/IDCG,该值的范围为[0,1],且越大越好。当然,NDCG是针对给定一个问题计算的,可以对所有问题取平均。

对上述指标的深入讨论暂不展开,围绕答案推荐场景,综合来看,MAP是一个相对合适的指标。

综上,针对答案推荐,指标选择如下:业务侧采用采纳率;模型侧采用MAP。还有其他的一些想法吗?

参考:怎么理解推荐系统中的NDCG?信息检索中的评价指标,怎么评估工业级推荐系统的效果?