我们如何教Yandex回答问题并每天为用户节省2万小时



当我们在搜索栏中输入查询时,我们正在寻找信息,而不是链接。而且,通常我们需要简短的句子或众所周知的事实。例如,[ 截锥体的体积公式 ]在所有站点上都相同-不需要链接,只需给出答案即可。

没有人能以事实(信息性)答案使任何人惊讶,但是很少有人知道他们的形成方式,它们之间的差异以及最近在这一领域发生的事情。我叫安东·伊万诺夫(Anton Ivanov)。今天,与我的同事Mikhail Ageev矿工我们将在搜索中讲述答案的故事,并分享一些我们之前从未讨论过的细节。希望对您有所帮助。

互联网的历史就是简化信息搜索的历史。曾几何时,人们访问在线目录来查找答案,其中按主题对网站链接进行了分组。随着时间的流逝,搜索引擎出现了,他们学会了如何通过关键字搜索站点。快速搜索信息的需求刺激了技术的发展:单词搜索逐渐演变为按意义搜索,当答案可以在关键词交集为零的页面上找到时。但是即使在这种情况下,我也必须单击链接。人们一直梦想着更多。

首要事实


现在,很难记住Yandex的事实答案是如何开始的。我们可以说解决方案是巫师的一种特殊格式,它假定文本响应简短且没有交互性(与响应请求[ 我的IP地址 ]或[ 浅绿色 ] 相反)。如您所知,实现这种格式并不困难。主要问题不同:从哪里获得答案?



我们从最简单的技术方法开始。特殊人员(评估员)分析了最受欢迎的查询,并选择了您可以找到简短答案的查询。这种查询的经典示例是[ 一只苍蝇有多少只爪子 ]。



这样,可以仅覆盖最受欢迎的查询,而忽略其他查询的长尾。在某种程度上,我们借助众包解决了这个问题。

几年前,骗子开始帮助我们补充事实答案的数据库。经常将请求上传到平台,tolokers看到了任务:“您是否可以对此请求给出详尽的答案?如果属实,那就给它。”当然,其他搭便车者检查了答案是否足够,我们在搜寻人员的帮助下发现了错误。顺便说一句,tolokers还帮助我们发现,带有图片的实际答案通常更受用户喜欢,而不仅仅是文本。

独行者的帮助很大,但是即使他们也无助于掩盖低频查询的长尾巴。对于任何手动标记来说,这样的请求太多了:不是成千上万,而是数百万!为了解决这个问题,搜索排名经验对我们很有用。

事实片段


在Yandex搜索中查找内容时,不仅会看到10个链接,而且还会看到标题,描述,图标和其他数据。

我们专注于描述。我们的搜索会自动创建它。为了突出显示最佳文本片段,使用了轻量级的CatBoost模型,该模型估计文本片段和请求的接近程度。事实证明,链接描述有时已经包含事实答案。不利用这一点很奇怪-但不是那么简单。

似乎任务归结为在根据请求找到的所有页面描述中选择“最实际”的描述,但是这种方法不能很好地工作。原因是页面的信息描述并不总是与对人的直接问题的正确答案相吻合。因此,我们的Fact Snippet技术与页面描述同时建立事实,但基于其他参数,因此结果类似于答案。现在,您需要从中选择最优质的答案。

我们已经告诉过在Habré上有关搜索算法“ Palekh”,“ Korolev”和DSSM方法的信息。然后,任务归结为寻找在对页面进行排名时含义相近的文本。实际上,我们比较了两个向量:查询向量和文档文本向量。这些向量在多维空间中越接近,文本的含义就越接近。为了选择最优质的事实,我们做了同样的事情。我们的神经网络模型经过我们已经知道的答案的训练,可以为搜索中找到的页面建立响应向量,并将其与查询向量进行比较。所以我们得到最好的答案。

显然,以这种方式回答所有请求是不值得的:大多数请求不需要事实回答。因此,我们使用另一种模型来丢弃“非事实”请求。

事实片段2.0


上文讨论的所有内容均涉及“经典”事实答案:简短,全面,如百科全书所述。长期以来,这个方向一直是唯一的方向。但是,从更远的角度看,我们进一步看到,一方面存在基于详尽无遗的答案的划分是非常不稳定的,另一方面,对于用户而言是不透明的:他只需要更快地解决问题即可。我超越了通常的事实。因此该项目出现了Fact Snippet 2.0。



为简化起见,事实摘录2.0是相同的事实摘录,但无需查找“综合答案”。实际上,一切都有些复杂。

让我提醒您,事实摘录分为两个阶段。在第一阶段,我们使用简单的模型评估请求的“事实性质”:这是否意味着事实答案。如果是,则在第二阶段我们正在寻找答案,它会出现在搜索结果中。对于Fact Snippet 2.0,我们调整了两个步骤,以找到更多问题的答案。这样的答案并不能声称是完整的百科全书,但仍然有用。

有可能但并非总是有必要为任何请求选择一段文本。有时,找到的文本与查询的相关性不足。有时我们已经从其他来源获得了很好的答案-我们需要决定选择哪个。例如,如果可以显示交互式地图,电话号码和评论,为什么要以文本形式提供组织的地址。我们借助于搅拌机分类器解决了这个问题,Andrei Styskin 已经使Habr的读者熟悉答案不应该是无礼的,侮辱性的。几乎每个这样的合理限制都有其自己的分类器,而使它在运行时在一瞬间运行是另一项追求。

查询改写


它们覆盖了长尾巴的另一部分,但许多“独特”的请求仍然落后。其中很大一部分是我们已经知道的其他查询形式。例如,[ 当长矛改变牙齿时 ]和[什么时候长矛改变牙齿 ]几乎是同一回事。



为了解决这个问题,我们提出了一种机制,该机制可以即时了解传入的请求是另一个请求的别名(意思是相同的),即我们已经拥有的答案。这比独立产生两个事实答案要容易和快捷。

我们接受所有有答案的请求,将它们转换为向量,并将其放入索引k-NN(更确切地说,在其HNSW的优化版本中这样您可以更快地搜索)。接下来,我们构造通过直接重合没有答案的查询向量,并在我们的k-NN中寻找前N个最相似的查询。

接下来,我们遍历此顶部并遍历三元组的katbust分类器:

-用户请求;
-来自k-NN的请求;
-响应来自k-NN的请求。

如果验证者验证者是肯定的,则该请求被视为来自k-NN的请求的别名,我们可以返回已知的答案。

该设计的主要创意部分在于编写分类器的要素。在这里,我们尝试了许多不同的想法。最重要的因素包括:

-查询向量;
-Levenshtein距离;
-逐字嵌入;
-基于每个请求的各种巫师的因素;
-查询词之间的距离。

另外,我将讨论使用BERT神经网络的技巧。我们对别名的搜索时间有相当严格的限制:最长为几毫秒。在当前资源上承受数千RPS负载的情况下,在这样的时间内执行BERT是不可能的。因此,通过我们的BERT模型,我们收集了数以百万计的人工估计值,并在它们上训练了一个更简单的神经网络DSSM,该神经网络在运行时运行非常快。结果,在准确性上有所损失,获得了强的因素。

实际上,可以通过其他方式确定请求的语义接近度。例如,如果两个查询在一个词中彼此不同,请检查这些查询的搜索结果有何不同(请查看顶部的匹配链接数)。如果重复数百万次并取平均结果,则可以很好地估算出如果将一个单词改为另一个单词,查询的含义会发生多少变化。之后,您可以将所有数据添加到一个结构(例如trie)中,并通过广义Levenshtein距离计算查询的接近程度。您可以扩展此方法,不仅可以考虑单词,还可以考虑单词对(但是由于数据的指数增长,因此可以得到更多的trie)。

下一步是什么


根据我们的估计,由于有了事实/信息方面的答案,我们每天为用户节省了2万小时,因为他们不必浏览搜索结果中的链接(这还不包括他们在网站上找到答案所花费的时间)。这很好,但是总有增长的空间。例如,现在我们使用在Internet上找到的文本作为答案,但最终的文本并不总是可以在一个地方或以正确的形式找到。在神经网络的帮助下,可以解决此问题:生成响应,使其与请求匹配,并且不包含不必要的响应。这是我们的搜索神经总结项目,希望我们下次再讨论。

All Articles