一、搜索引擎的的链路
简单流程如下,一般都包括query理解,召回,粗排,精排,重排。
二、query理解,查询词处理
对于进来的query需要有很多道工序做处理。才能让搜索引擎的效果更好、更智能。
2.1 分词
分词是query理解中必不可少的环节。
TODO : 这里待分享一些方法。
2.2 词权重
词权重,做的事情是,找到query中最关键的点,和非关键的点。从而能够在召回过程中,影响排序。
例如query为“冬季卫衣推荐”,其中重要的是“冬季” 和“卫衣”,其中不重要的是“推荐”。如果不做词权重这个事情,那么“推荐”这个词,和“冬季”“卫衣”,同等重要,很可能干扰排序的结果,召回不相关的内容。
词权重,特别对于长尾的query,特别是在根据关键词的召回过程中(例如:BM25),会特别有用。能够帮助我们找到更相关的结果。
做法:这里分享一个做法。也是利用NLP中的词性标注,然后根据词性来判别权重。
2.3 类目识别,分类
对内容有一个分类,这是非常重要的事情。就像平常生活中,我们把袜子,体恤,短裤都分开方,这样在用的时候可以很好的找。否则在一堆杂乱的的东西中,想要找到想要的,是南辕北辙的事情,费时费力。
做法:这里实际上是对应NLP中的分类任务
2.4 意图识别
时效性意图:例如,query中带有“今天”,“近一周”等等。在召回的过程中,需要考虑文档的年龄。
地域性意图。
我觉得意图识别是query理解中,很重要的一个步骤,做不好会让搜索引擎感觉很笨。做好了会让用户觉得它很聪明,很智能。
2.5 查询词改写
这里其实包括了同义词。
2.6 query改写
关于把一个query改变成另外一个query的做法,这里有一些研究。
用十篇论文聊聊关于使用LLM做query Rewrite的问题_hyde+prf-CSDN博客
2.7 纠错
纠正query中的错误,可以给用户更好的体验。帮助用户找到想要的内容。
三、召回
目前分为两种。在机器学习火热之前,基本上是用关键词做召回的(Bm25)。机器学习能力越来越强,可以做语义召回,例如DSSM双塔模型,做语义检索。
3.1 BM25召回
这里,对物料数据做预处理(入库),例如建立倒排索引。然后把query的关键词和倒排索引做匹配好计算,找到最匹配的文档。这里可以使用elasticsearch来做。
3.2 语义召回(向量召回)
双塔模型,一个模型把文档转为向量,一个模型把query转为向量。其中文档的向量是离线计算的(因为这是已知的)。而query是实时计算的(因为这是未知的)。
有很多现成的embedding模型,可以做这件事情。基本上不用自己训练或者微调。例如有BGE,m3e等等
3.3 KV召回
对于一些特殊的场景。我们可以做一些缓存。例如微博中的热搜,又或者是抖音上的爆火视频。这些并不需要都去做计算,可以提前用query和内容做缓存。更快的做响应。
四、排序
在召回阶段,可能会有一个排序。但是它为了计算速度,通常会较弱。一般都要把召回的内容,重新做一个排序。通常的做法是,使用模型来计算查询词和文档的相关性。
排序可能也有多层,分为粗排和精排(粗排和精排的区别是使用的特征量不同,粗排追求速度,特征维度更少。精排更关注效果,特征更多,耗时可能更长)。先计算各个维度的分数。然后把这些各个维度的分数做融合计算。针对不同的场景,侧重点不同。以后的关注相关性,有的关注个性化。