评估搜索算法的3个步骤

309 阅读14分钟

构建更智能的搜索产品—评估搜索算法的3个步骤

每个月有超过200万用户访问Shopify的帮助中心,以寻求解决问题的帮助。他们带着不同的动机来到帮助中心:学习如何建立他们的商店,寻找关于如何营销的技巧,或者获得关于解决技术问题的建议。我们的搜索产品通过浮现与用户最相关的内容,帮助用户缩小他们所寻找的内容。算法使搜索产品能够浮现出最合适的结果,但你如何知道它们是否成功地完成了这一使命?

下面,我们将分享我们为评估新的搜索算法而建立的三步框架。从使用Kafka和注释收集数据,到进行离线和在线A/B测试,我们将分享我们如何衡量搜索算法的有效性。

挑战

搜索是一个很难构建的产品。当你输入一个搜索查询时,搜索产品会在其整个文档集合中进行筛选,以找到合适的匹配。这不是一件容易的事,因为搜索产品的集合和匹配结果集可能是广泛的。例如,在Shopify帮助中心的搜索产品中,有成千上万的文章,搜索 "运输 "可能会返回数百条。

我们使用一种我们称之为Vanilla Pagerank的算法来支持我们的搜索。它通过一篇文章在所有搜索查询中的总浏览量来提升结果。问题是,它也会浮出非相关的结果。例如,如果你搜索 "删除折扣",该算法可能更喜欢带有关键词 "删除 "或 "折扣 "的结果,但不一定是关于 "删除折扣 "的结果。

我们一直在努力通过使我们的搜索算法更加智能来改善用户的体验。这就是为什么我们建立了一个新的算法,即特定查询的Pagerank, 其目的是提高包含搜索词的历史搜索中具有高点击频率的结果(一种流行指标)。基本上,它提升了类似搜索中最频繁点击的结果。

挑战在于,对搜索算法的任何改变都可能改善某些查询的结果,但会使其他查询的结果恶化。因此,为了对我们的新算法有信心,我们用数据来评估它对现有算法的影响和性能。我们实施了一个简单的三步框架来评估实验性搜索算法。

1.收集数据

在评估我们的搜索算法之前,我们需要一个 "基础真理 "数据集,告诉我们哪些文章与各种意图有关。对于Shopify的帮助中心搜索,我们使用两个来源。Kafka事件和注释的数据集。

基于事件的数据与Kafka

用户通过输入查询、点击结果或留下反馈与搜索产品互动。通过使用像Kafka这样的消息传递系统,我们在图表化的流中收集所有实时的用户互动,并在ETL管道中对这些事件进行建模。这最终形成了一个搜索事实表,该表根据我们感兴趣的分析行为,汇总了关于搜索会话的事实。 通过拼凑原始Kafka事件生成的搜索事实的简化模型

通过Kafka事件生成的数据,我们可以持续评估我们的在线指标,并看到近乎实时的变化。这有助于我们:

  1. 监测产品变化这可能对用户体验产生不利影响。
  2. 实时将用户分配给A/B测试.我们可以将一些用户的体验设置为由搜索算法A提供,而其他用户则由算法B提供。
  3. 在一个流式管道中摄取互动以便对搜索产品进行实时反馈。

注释

注释是一个强大的工具,用于生成标记的数据集。为了确保Shopify帮助中心的高质量数据集,我们利用Shopify支持团队的专业知识来注释我们的搜索结果与输入查询的相关性。人工注释可以提供高质量和值得信赖的标签,但可能是一个昂贵而缓慢的过程,而且对于所有的搜索问题可能并不可行。另外,点击模型可以使用来自用户交互的数据建立判断。然而,对于Shopify帮助中心来说,人类的判断是首选,因为我们重视我们经验丰富的支持团队的专家评级。

注释的过程很简单:

  1. 一个查询与一个可能代表相对匹配的文档或结果集配对在一起。
  2. 一个注释者判断该文件与问题的相关性,并给这对文件一个评级。
  3. 标签与输入相结合,产生一个有标签的数据集。 注释过程

我们有许多方法来注释搜索结果:

  • 二元评级:给定一个用户的查询和一个文档,注释者可以通过提供一个二进制答案(1=是,0=否)来回答这个问题,这个文档与查询是否相关?
  • 尺度评分:给定一个用户的查询和一个文档,一个评分者可以回答这个问题,这个文档与查询的相关性 如何 这就提供了可以转化为类别的区间数据,其中4或5的评级代表了命中,更低的代表了失误。
  • 排名列表 :给定一个用户的查询和一组文档,评分者可以回答这个问题把文档从与查询最相关的位置排到最不相关的位置。这就提供了排名的数据,其中每个查询-文档对都有一个相关的排名。

你的注释选项的设计取决于你想采用的评价措施。我们使用了标度评级,用一个有字的列表(坏、好、好、大),在每个标签上提供明确的描述,以简化人类的判断。然后,这些标签被量化并用于计算性能分数。例如,当进行 "航运 "的搜索时,我们的特定查询的Pagerank算法可能会返回与查询更相关的文件,其中大多数文件被标记为 "伟大 "或 "良好"。

在注释方面需要注意的一点是数据集的滞后性。我们在Shopify帮助中心的文档集变化很快,所以数据集会随着时间的推移而变得陈旧。如果你的搜索产品是类似的,我们建议定期重新运行注释项目,或者用未见过的数据点来增强用于搜索算法训练的现有数据集。

2.评估离线指标

在收集了我们的数据之后,我们想知道我们的新搜索算法,即特定查询的Pagerank,是否对我们的排名效果产生了积极的影响,而不影响到我们的用户。我们通过运行离线评估来做到这一点,该评估使用来自策划的数据集的相关性评级来判断搜索结果的有效性,然后再启动可能有风险的变化进行生产。通过使用离线指标,我们针对我们的算法变体运行数以千计的历史搜索查询,并使用标签来评估统计措施,告诉我们我们的算法表现如何。这使我们能够快速迭代,因为我们每分钟模拟了数千次搜索。

我们可以使用许多措施,但我们发现平均精度归一化贴现累积收益对我们的利益相关者来说是最有用和最容易接近的。

平均精度

平均精度(MAP)衡量结果列表中每个项目与用户查询的相关性,有一个特定的分界线N。由于查询可能会返回数以千计的结果,而只有少数用户会阅读所有的结果,因此只需要检查返回的前N个结果。前N个数字通常是任意选择的,或者基于分页结果的数量。Precision@N是指在前N个推荐中相关项目的百分比。MAP是通过对我们的数据集中每个查询的AP得分进行平均来计算的。其结果是一个惩罚在相关文件之前返回不相关文件的措施。下面是一个关于如何计算MAP的例子。

MAP计算的例子 归一化的折现累积收益

为了计算MAP,你需要通过确定一个截止分数来分类一个文档是否是一个好的推荐。例如,具有OKGoodGreat标签(即分数大于0)的文档和搜索查询对将被归类为相关。但 ""和 ""的相关度的差异将被忽略。

折扣累积收益(DCG)解决了这个缺点,它保持了非二进制的分数,同时增加了一个对数的减少系数--DCG函数的分母,以惩罚列表中位置较低的推荐项目。DCG是一种衡量排名质量的方法,它考虑到了文档在结果集中的位置。

DCG计算的例子 DCG的一个问题是,搜索结果的长度因提供的查询而不同。这是有问题的,因为一个查询集的结果越多,DCG的得分就越高,即使排名没有意义。归一化贴现累积收益得分(NDCG)解决了这个问题。NDCG的计算方法是用DCG除以可能的最大DCG分数--从排序后的搜索结果中计算出来的分数。

当差异很大时,比较离线指标的数值是很好的。数值越高,算法就越成功。然而,这只告诉我们故事的结局。当结果没有明显差异时,我们从指标比较中得到的洞察力是有限的。因此,了解我们是如何得到结局的,对未来模型的改进和发展也很重要。你通过分解查询的构成来收集这些见解,看一看。

  • 频率:我们的算法返回的结果有多少次比注释数据差?
  • 速度:我们在不同算法中的排名有多大的偏差?
  • 共同点: 了解那些持续对算法性能产生积极影响的查询,并找到这些查询的共性,可以帮助你确定算法的限制。

脱机指标在行动

我们使用MAP和NDCG对评估离线指标进行了深入分析,以评估我们新的针对查询的Pagerank算法的成功。我们发现,我们的新算法更频繁地返回得分较高的文件,并且在两个离线指标中的得分都略高。

3.评估在线指标

接下来,我们想通过观察在线指标来了解我们的用户如何与我们的算法互动。在线指标使用搜索日志来确定真实搜索事件的表现。它们是基于对用户使用搜索产品的行为的理解,通常用于评估A/B测试。

你选择什么样的指标来评估你的算法是否成功,取决于你产品的目标。由于Shopify帮助中心的目标是为寻求我们平台帮助的用户提供相关信息,因此决定成功的指标包括。

  • 用户与搜索结果的互动频率
  • 他们需要滚动多远才能找到最适合他们需求的结果
  • 他们是否不得不联系我们的支持团队来解决他们的问题。

在进行A/B测试时,我们需要定义这些指标,并确定我们期望新的算法如何移动指针。下面是一些常见的在线指标,以及产品成功指标,我们用来评估搜索事件的表现。

  • 点击率(CTR):浮出水面时点击搜索结果的那部分用户。相关的结果应该被点击,所以我们希望有高的点击率。
  • 平均排名:被点击的结果的平均排名。由于我们的目标是让最相关的结果首先浮出水面,并被点击,我们希望有一个低的平均排名。
  • 弃权率:当用户有意向找到帮助,但他们没有与搜索结果互动,没有与我们联系,并且没有再次看到。我们总是期望由于机器人和垃圾信息(是的,搜索产品也会有垃圾信息!)而导致一定程度的放弃,所以我们希望这一点能够适度降低。
  • 偏移:当用户不需要联系支持就能找到他们要找的东西时,我们的搜索就是一个成功。换句话说,用户被转移到了与我们联系。我们希望这个指标是高的,但在现实中,我们希望人们在最适合他们的情况下联系我们,所以偏移是一个有点微妙的指标。

我们使用第一步收集的Kafka数据来计算这些指标,看看我们的搜索产品在不同时间、不同用户群或不同搜索主题之间的成功程度。例如,我们研究不同语言的用户之间的点击率和偏移率。我们还使用A/B测试,将用户分配到我们产品的不同版本,看我们的新版本是否明显优于旧版本。

评估的流程 在线指标 A/B测试搜索类似于你可能熟悉的其他A/B测试。当用户访问帮助中心时,他们会被分配到我们的一个实验组,这决定了他们后续的搜索将由哪种算法来驱动。在多次访问中,我们可以评估我们的指标,以确定哪种算法优于其他算法(例如,算法A的搜索结果的点击率是否明显高于算法B)。

行动中的在线度量

我们进行了一个在线A/B测试,看看我们的新的特定查询的Pagerank算法如何衡量我们现有的算法,一半的搜索用户被分配到A组(由Vanilla Pagerank驱动),一半被分配到B组(由特定查询Pagerank驱动)。我们的结果显示,B组的用户是:

  • 不太可能点击超过第一页的结果
  • 不太可能进行后续搜索
  • 更有可能点击结果
  • 更有可能点击显示的 第一个结果
  • 点击的结果的平均等级较低

基本上,与A组用户相比,B组用户能够以较少的努力找到有用的文章。

结果

在使用我们的评估框架来衡量我们的新算法和我们现有的算法之后,很明显,我们的新算法在对我们的产品有意义的方面超过了前者。我们的指标显示我们的实验是成功的,我们能够用我们新的和改进的特定查询的Pagerank算法取代我们的Vanilla Pagerank算法。

如果你使用这个框架来评估你的搜索算法,重要的是要注意,即使是一个失败的实验也可以帮助你学习和识别新的机会。你的离线或在线测试是否显示了性能的下降?是某个查询子集导致性能下降吗?一些用户是否比其他部分的用户更容易接受这些改变?无论你的分析点是什么,不要害怕深入了解发生了什么。你会想把你的发现记录下来,以备将来的迭代。

评估搜索算法的主要启示

算法是任何搜索产品的秘方。搜索算法的功效对用户的体验有着巨大的影响,因此,拥有正确的程序来评估搜索算法的性能,可以确保你在做决定时考虑到你的用户。

快速总结一下,最重要的收获是:

  • 一个高质量和可靠的标记数据集是关键 对于一个成功的、无偏见的搜索算法的评估。
  • 在线指标提供关于用户行为的宝贵见解 除了算法评估外,即使它们是资源密集型的,实施起来也有风险。
  • 离线指标有助于快速迭代新算法并减轻将新算法投入生产的风险。