一、搜索引擎的的链路

简单流程如下,一般都包括query理解,召回,粗排,精排,重排。

关于搜索引擎链路_搜索引擎

二、query理解,查询词处理

对于进来的query需要有很多道工序做处理。才能让搜索引擎的效果更好、更智能。

关于搜索引擎链路_搜索引擎_02

2.1 分词

 分词是query理解中必不可少的环节。

 TODO : 这里待分享一些方法。

关于搜索引擎链路_倒排索引_03

2.2 词权重

词权重,做的事情是,找到query中最关键的点,和非关键的点。从而能够在召回过程中,影响排序。

例如query为“冬季卫衣推荐”,其中重要的是“冬季” 和“卫衣”,其中不重要的是“推荐”。如果不做词权重这个事情,那么“推荐”这个词,和“冬季”“卫衣”,同等重要,很可能干扰排序的结果,召回不相关的内容。

词权重,特别对于长尾的query,特别是在根据关键词的召回过程中(例如:BM25),会特别有用。能够帮助我们找到更相关的结果。

做法:这里分享一个做法。也是利用NLP中的词性标注,然后根据词性来判别权重。

关于搜索引擎链路_倒排索引_04

2.3  类目识别,分类

对内容有一个分类,这是非常重要的事情。就像平常生活中,我们把袜子,体恤,短裤都分开方,这样在用的时候可以很好的找。否则在一堆杂乱的的东西中,想要找到想要的,是南辕北辙的事情,费时费力。

做法:这里实际上是对应NLP中的分类任务

关于搜索引擎链路_搜索引擎_05

2.4 意图识别

时效性意图:例如,query中带有“今天”,“近一周”等等。在召回的过程中,需要考虑文档的年龄。

地域性意图。

我觉得意图识别是query理解中,很重要的一个步骤,做不好会让搜索引擎感觉很笨。做好了会让用户觉得它很聪明,很智能。

关于搜索引擎链路_权重_06

2.5 查询词改写 

这里其实包括了同义词。

关于搜索引擎链路_搜索引擎_07

2.6 query改写

关于把一个query改变成另外一个query的做法,这里有一些研究。

用十篇论文聊聊关于使用LLM做query Rewrite的问题_hyde+prf

2.7 纠错

纠正query中的错误,可以给用户更好的体验。帮助用户找到想要的内容。

三、召回 

目前分为两种。在机器学习火热之前,基本上是用关键词做召回的(Bm25)。机器学习能力越来越强,可以做语义召回,例如DSSM双塔模型,做语义检索。

3.1 BM25召回

这里,对物料数据做预处理(入库),例如建立倒排索引。然后把query的关键词和倒排索引做匹配好计算,找到最匹配的文档。这里可以使用elasticsearch来做。

关于搜索引擎链路_倒排索引_08

3.2  语义召回(向量召回)

双塔模型,一个模型把文档转为向量,一个模型把query转为向量。其中文档的向量是离线计算的(因为这是已知的)。而query是实时计算的(因为这是未知的)。

有很多现成的embedding模型,可以做这件事情。基本上不用自己训练或者微调。例如有BGE,m3e等等

关于搜索引擎链路_权重_09

 3.3 KV召回

对于一些特殊的场景。我们可以做一些缓存。例如微博中的热搜,又或者是抖音上的爆火视频。这些并不需要都去做计算,可以提前用query和内容做缓存。更快的做响应。

关于搜索引擎链路_搜索引擎_10

四、排序

在召回阶段,可能会有一个排序。但是它为了计算速度,通常会较弱。一般都要把召回的内容,重新做一个排序。通常的做法是,使用模型来计算查询词和文档的相关性。  

关于搜索引擎链路_搜索引擎_11

排序可能也有多层,分为粗排和精排(粗排和精排的区别是使用的特征量不同,粗排追求速度,特征维度更少。精排更关注效果,特征更多,耗时可能更长)。先计算各个维度的分数。然后把这些各个维度的分数做融合计算。针对不同的场景,侧重点不同。以后的关注相关性,有的关注个性化。

关于搜索引擎链路_搜索引擎_12