作者是小红书的算法工程师,基础模型团队的负责人,职责是用机器学习技术提升搜索和推荐。王树森于2011年、2016年获得浙江大学本科、博士学位,博士期间获得微软学者、百度奖学金等荣誉。王树森博士在2016~2018年期间在美国UC Berkeley任博士后,在2018~2021年期间在美国Stevens Institute of Technology任助理教授、博导。在加入小红书之前,王树森博士从事机器学习、数值计算、分布式计算、强化学习等方向的研究,在机器学习顶级会议、期刊上发表30多篇论文。
本章主要概述搜索引擎的关键技术,后面的章节将围绕这些关键技术展开。在讲解技术之前,首先在 1.1 节介绍搜索本书用到的一些基本概念。1.2 节讨论相关性、内容质量、时效性、个性化、地域性,它们是决定用户对搜索结果满意程度的主要因子。1.3 节讲解搜索引擎的链路,即用户搜索一条查询词之后,搜索引擎具体做了哪些计算。
前文讨论过,搜索引擎迭代优化的目标是提升用户对搜索结果的满意度。如果有可靠的指标量化用户满意度,那么我们就可以用这样的指标作为牵引,向着提升指标的方向做策略的优化。根据工业界的实践经验,可以用三大类指标量化用户满意度。2.1 节介绍用户规模与留存指标,它们是业务的核心指标,也叫北极星指标,它们直接与公司的业务发展挂钩。2.2 节介绍一些中间过程指标,包括点击、交互、换词,它们通常与用户体验正相关,但它们不是搜索引擎迭代优化的主要目标。2.3 节介绍人工评估的方法与指标,这是最直接反映用户满意度的评价方法,但也存在不足之处。
搜索引擎的 QP、召回、排序问题大多可以归纳到二分类、多分类、回归、排序这四类机器学习任务。本章 3.1 到 3.4 节分别介绍这四类任务,以及常用的模型和训练方法。
当算法工程师改进了 QP、召回、排序的模型之后,该如何评价新模型是否优于当前模型?我们在 2 章中讨论了最重要的评价指标,这些指标有提升,则可以说明新策略优于旧策略。获得这些指标的前提是将模型部署在线上,要么用 A/B 测试计算新旧模型线上指标的差异,要么用人工评估两种模型的搜索结果页的 GSB。将模型部署在线上做 A/B测试相对比较复杂,而且会对用户产生影响,因此在上线之前需要做离线评估。
搜索引擎中有大量的任务需要用到 BERT 模型,比如 QP(分词、命名实体识别、类目识别)、相关性、内容质量、等等。它们的训练流程非常相似,通常包括 4 个步骤——预训练(pretrain)、后预训练(post pretrain)、精调(fine tune)、蒸馏(distill)。预训练是一个公共服务,训练出的模型供下游所有任务使用。后预训练、精调是针对特定任务做的,需要挖掘和标注任务相关的数据。蒸馏是一种通用技术,在不增加线上推理的机器成本的前提下提升准确率。
相关性指的是查询词 q 与文档 d 之间的关系,如果 d 能满足 q 的需求,则 (q, d) 相关。对用户体验影响最大因子就是相关性,它的重要程度远超内容质量、时效性、地域性、个性化。可以这么说,只要能保证相关性,搜索引擎就算是基本可用。
用户做搜索时,在满足相关性的前提下,用户希望搜索结果是高质量的文档,而非劣质、甚至虚假的内容。内容质量主要有两个维度。第一,EAT 分数,主要取决于文档的来源和作者。EAT 在业界俗称“权威性”,早年的 PageRank 就是一种计算权威性的方法。第二,文字和图片质量,主要取决于文档本身,包括文档的意图、写作水平、图片质量。
时效性一方面是指查询词的时效性意图(即查询词对新内容的需求),另一方面是搜索结果能否满足需求。查询词的时效性意图可以划分为突发时效性、一般时效性、周期时效性这三大类。线上由 QP 模块判别查询词的时效性意图,下游根据查询词意图做承接。不论是查询词意图识别错误,还是召回和排序针对时效性意图的承接不好,都会严重影响用户体验。
用户使用手机 APP 做搜索时,有时会带有搜附近、搜同城的意图。举个例子,用户在小红书上搜“附近的酒店”、“情人节餐厅”、“周边游”、“二手房”,有可能是想看附近或者同城的信息,那么距离的远近、是否同城应当作为召回和排序的依据。假如不对这类查询词做特殊处理,则搜出的结果会严重不符合用户的需求。举个例子,用户在上海,搜“附近的酒店”,搜索结果为“北京前门附近的酒店”,显然不符合用户的需求。
搜索引擎与推荐系统有一大共通之处:在实际将文档给用户曝光之前,就能用模型预估出用户点击、交互文档的概率。工业界将这样的模型称作点击率模型(即便它同时预估交互率、完播率等多个目标)。在推荐系统中,用户 u 的历史行为记录越多,文档 d的曝光、点击、交互次数越多,输入模型的信息就越充分,模型就能越准确地预估 (u, d)的点击率和交互率。搜索引擎用神经网络根据 (u, q, d) 的特征,预估点击率和交互率,作为排序的因子。
搜索引擎的文本召回是以词粒度进行的。举个例子,用户搜索 q =“冬季卫衣推荐”,其中包含“冬季”、“卫衣”、“推荐”这 3 个词,如果文档 d 同时包含这 3 个词,比如 d =“推荐一款冬季穿的卫衣”,则 d 会被召回。当用户搜索 q =“冬季卫衣推荐”,算法如何将它切分成 3 个词?本章讨论分词技术,11.1 节介绍基于词典的分词方法,11.3 节介绍基于深度学习的分词方法,11.2 节介绍新词发现的方法(即如何构造词典)。
上一章讲解了分词技术,它可以将查询词 q 切分成若干个词,用于检索文档。这些词的重要性各不相同。丢掉某些词会导致查询词的语义发生变化,检索到的文档与 q 相关性很低;而丢掉某些词则几乎不影响查询词的语义,检索到的文档仍与 q 具有高相关性。词权重(term weight 或 term necessity)是 QP 链路上的一环,以分词的结果作为输入,用模型给每个词赋予一个权重。词权重的主要用途是召回。在文本召回的海选阶段需要计算 BM25 等分数,命中不同重要性的词,对 BM25 分数的贡献有所不同。在召回结果过少时,根据词权重丢弃一部分词,这样可以在尽量少损失相关性的前提下,大幅增加召回量。词权重还有其他用途,比如在训练召回模型时做数据增强,丢弃核心词生成负样本,丢弃非核心词生成正样本。
搜索引擎中有一套多级类目体系,通常包含数十个一级类目、数百个二级类目、甚至还有三级和四级类目。每篇文档、每条查询词可以属于一个或多个类目。例如查询词q =“冬季卫衣推荐”,一级类目是“时尚”,二级类目是“穿搭”。再例如 q =“狄仁杰”的一级类目是“影视娱乐”和“游戏”,二级类目是“电视”和“手游”,原因是狄仁杰即是电视剧中的人物形象,也是王者荣耀中的游戏角色,有的用户想搜电视剧,有的用户想搜王者荣耀游戏。
意图识别是 QP 最重要的任务之一,不止对下游链路有帮助,甚至可以决定调用哪条下游链路。可以这么说,最容易撬动搜索大盘指标增长的,一个是意图识别,另一个是查询词改写。查询词意图分很多种,本章讨论时效性、地域性、用户名这几种意图。
当搜索引擎功能模块基本就位之后,查询词改写是 QP 模块中撬动大盘指标增长的最有效的手段。基础的改写方法基于词表和规则,高级的改写方法依赖于深度学习模型。15.1 节介绍什么是查询词改写、为什么做查询词改写。15.2 节讲解基于分词的改写,它在链路上位于分词之后,对分词结果做同义词、上下位词替换。15.4 节讲解基于意图的改写,这种改写需要与召回联动,结合起来解决文本召回无法解决的问题。15.3 节详细讲解基于相关性的改写,它对改写和召回联合建模,使原词 q 与改写召回的文档 d 有高相关性。
文本召回是搜索引擎最基础、最重要的召回通道,但也是搜索引擎中最成熟的技术,可供算法工程师发挥的空间不大。本书只简要描述倒排索引的原理,具体技术细节可以参考综述论文〔22〕 和中文教材〔26〕。
随着深度学习技术的发展,向量召回成为搜索引擎中一类重要的召回通道,在召回中占据的配额只略低于文本召回。向量召回与查询词改写起到类似的作用,都可以解决语义鸿沟问题,召回文本不匹配、但是语义匹配的文档。向量召回中需要大量的深度学习、NLP 技术,算法工程师的发挥空间很大,对向量召回的优化可以显著提升主要业务指标。搜索引擎中的向量召回主要分为相关性召回、个性化召回这两类,两者的本质区别是拟合的目标不同,分别是相关性分数和用户点击行为。我们在 17.2 和 17.2 节讲解两类向量召回的方法,在 17.3 节讨论模型的线上推理。
搜索引擎的查询词有头部效应,每天超过 50% 的搜索集中在一两百万条查询词上。设每篇文档 ID 为 96 位二进制码,每条查询词存储 1000 篇文档,一共存储头部 200 万条查询词,那么所需的存储仅为 25GB。如果召回对 RT 的限制宽松,比如允许耗时数十毫秒,那么可以用硬盘存储,几乎没有成本。我们可以用各种方法做离线计算,为每条查询词 q 找到一批相关性、时效性、内容质量综合分数很高的文档 {d},以“q → List⟨d⟩”或类似的形式建立索引,作为召回通道。
如图 19.1 所示,搜索引擎的链路上有三处需要做排序,它们分别是召回截断、粗排、精排。精排的打分量较小,仅有数百,允许在单篇文档上花费很大的计算量。精排给每篇文档打一个分数,这个分数基本决定了文档的最终曝光顺序。粗排的打分量为数千,在单篇文档上花费的计算量必须远小于精排。粗排起到承上启下的作用,从数千候选文档中选出数百,尽量保证用户最想看的文档不会被过滤掉。召回截断的打分量为数万,在线上只能用向量内积这样的简单运算给数万文档打分,从中选出数千送入粗排。
搜索引擎的精排、粗排、召回截断各需要用到一个融合模型,可以是树模型,也可以是线性模型。将融合模型记作 f(x, z; w),其中 x 是非个性化特征,z 是个性化特征,w 是需要学习的参数。本章讲解三种训练融合模型的方法,分别是 pointwise、pairwise、listwise。设每个 batch 的数据包括用户 u、查询词 q、文档 d1, · · · , dk、以及结合教师模型打分和用户行为算出的 y1, · · · , yk。
查询词推荐是搜索的一环,但是与搜索链路相对独立,几乎可以自行闭环。前面章节讲的搜索链路决定在用户搜查询词 q 之后搜索结果页面出什么文档,而查询词推荐在很大程度上影响用户搜什么 q。查询词推荐对搜索引擎的影响很重,大部分的搜索请求来自于推荐的查询词、而非用户完整输入的查询词。
上一章重点讨论了 4 种推词场景——搜前推词、SUG、搜索结果页推词、文档内推词。本章讨论推词的召回方法,其中很多召回方法是多种推词场景共用的。图 22.1 列出4 种推词场景的召回依据。搜前推词是完全基于个性化的推荐,召回的依据是用户的兴趣点。SUG、搜索结果页推词的场景为用户正在输入、或完成输入的查询词 q,q 是召回的依据。文档内推词的场景是当前的文档 d,d 是召回的依据。