公司动态
搜索推荐系统召回技术:从双塔模型到向量索引的工程实践
1. 搜索推荐系统中的召回从海量到精准的第一步在信息爆炸的时代无论是打开购物软件、内容平台还是搜索引擎我们早已习惯了“千人千面”的个性化体验。这背后搜索推荐系统功不可没。但你是否想过面对动辄数亿的商品、文章或视频系统是如何在毫秒之间从浩如烟海的候选池中为你筛选出那几十个可能感兴趣的内容的这个至关重要的“海选”环节就是召回。如果把整个搜索推荐系统比作一场大型招聘会那么召回就是负责从成千上万的求职者候选物品中快速筛选出几十份与岗位用户需求初步匹配的简历。后续的排序阶段则像是面试官对这些简历进行精细打分和排序最终决定录用谁。召回的核心目标不是追求极致的精准而是追求高效率下的高覆盖——确保所有可能相关的物品都被“捞”出来不能有遗漏即保证召回率同时又要控制数量为后续精排留出计算资源。可以说召回的质量直接决定了整个系统效果的天花板如果召回阶段漏掉了用户真正想要的东西那么后续排序再强大也无济于事。这篇文章我将结合自己在一线构建大规模推荐系统的实战经验为你深度拆解召回系统的技术内核。我们会从核心设计思路聊起剖析双塔、向量化等主流召回模型并深入到SDM、MIND等前沿序列召回模型的实战细节最后分享那些在真实业务场景中踩过的坑和调优心得。无论你是刚入门推荐系统的新手还是希望深化对召回环节理解的中高级工程师相信都能从中获得可直接复用的干货。2. 召回系统的核心架构与设计哲学2.1 召回的本质效率与覆盖的平衡艺术召回任务的定义非常明确给定一个用户及其上下文从规模为NN通常巨大从百万到百亿级别的全量物品库中快速检索出规模为KK通常在几百到几千的候选子集交给后续的排序阶段。这里有几个关键约束延迟要求极严通常需要在10-50毫秒内完成。资源有限不能动用过于复杂的模型因为要对全库每一个物品都算一遍分是不现实的。目标复合不仅要找回用户明确表达兴趣的物品搜索召回还要发掘用户潜在的兴趣推荐召回同时还要兼顾新颖性、多样性等生态指标。因此召回系统的设计哲学就是在计算效率、内存开销和召回效果之间寻找最佳平衡点。一个经典的召回系统架构通常是多路并行的每一路召回采用不同的策略或模型从不同角度“打捞”候选集最后合并去重。常见的召回通路包括基于热度的召回直接返回当前最热门的物品。保证基础的体验和内容消费效率。基于标签/分类的召回利用用户历史行为物品的标签、分类召回同标签/分类的其他物品。简单有效可解释性强。基于协同过滤的召回包括Item-CF喜欢A的用户也喜欢B和User-CF与你相似的用户喜欢什么。这是经典的推荐算法在召回阶段依然生命力顽强。基于向量化模型的召回这是当前的主流和核心将用户和物品都映射到同一个低维向量空间通过向量相似度如内积、余弦相似度进行快速检索。我们熟知的双塔模型就是其典型代表。2.2 核心评估指标召回率与精确率的博弈在谈论召回效果时我们最关注两个指标召回率 (Recall)和精确率 (Precision)但两者在召回阶段存在天然的矛盾。召回率系统成功找出的相关物品占所有相关物品的比例。Recall TP / (TP FN)。召回率越高说明“漏网之鱼”越少。精确率系统找出的物品中真正相关的物品所占的比例。Precision TP / (TP FP)。精确率越高说明“滥竽充数”的越少。在召回阶段我们通常更优先保障召回率。原因很简单召回是排序的上游如果相关物品根本没被召回召回率低排序模型再厉害也无力回天。而召回了部分不相关物品精确率低则可以交给后续的排序模型去过滤和重排。当然这并不意味着可以无限制地牺牲精确率来换召回率因为召回数量K过大会极大增加排序层的计算压力。因此实践中我们常看RecallK在Top K个结果中的召回率这个指标并通过多路召回互补来在整体上达到一个理想的平衡。注意离线评估时我们通常用用户点击、转化等行为作为“相关”的定义。但要注意正样本稀疏和曝光偏差问题这需要设计科学的负采样和评估框架这是另一个深水区话题。2.3 系统级挑战索引、吞吐与更新除了算法模型工程实现是召回系统的另一大生命线。主要挑战包括向量索引技术当物品向量达到千万甚至亿级时暴力计算相似度是不可能的。必须借助近似最近邻搜索ANN索引如Facebook的Faiss、Google的ScaNN、或HNSWHierarchical Navigable Small World等。这些索引能在损失可接受精度的前提下将检索复杂度从O(N)降至O(logN)甚至更低。高吞吐与低延迟线上服务需要应对每秒数万甚至数十万的查询请求。这要求向量检索服务必须高度优化包括内存加载、批量查询、缓存策略等。模型与索引的更新物品是实时上架下架的用户兴趣也在不断变化。因此物品向量需要支持近实时更新用户向量则需要能根据最新行为实时计算或刷新。这涉及到在线推理系统与向量索引的协同更新流程。3. 主流召回模型技术深度剖析3.1 基石模型双塔结构的精髓与实战细节双塔模型是召回领域的“基本功”其思想简洁而强大构建两个神经网络“塔”分别对用户特征和物品特征进行编码输出固定维度的向量如64维、128维通过计算两个向量的内积或余弦相似度作为匹配分数。3.1.1 模型结构与特征处理用户塔的输入通常包括用户静态特征性别、年龄、地域、用户动态特征近期点击/搜索序列的聚合统计、上下文特征时间、地点、设备。物品塔的输入包括物品静态特征标题、类目、标签、物品动态特征实时点击率、销量。这些特征经过Embedding层将离散ID类特征映射为稠密向量和若干层全连接网络DNN进行融合和抽象最终输出代表用户兴趣和物品属性的向量。3.1.2 训练目标与负采样技术双塔模型通常采用对比学习的思想进行训练目标是让正样本用户点击/购买的物品的用户-物品向量相似度尽可能高负样本的相似度尽可能低。损失函数常用交叉熵损失或Pairwise Hinge Loss。这里最大的学问在于负采样。如果只用曝光未点击作为负样本会严重偏向于已曝光物品模型学不到区分全库物品的能力。因此必须进行全局负采样。常用策略有随机负采样从全库中随机抽取物品作为负样本。简单但可能采到“简单负样本”用户根本不可能感兴趣的导致模型学习动力不足。Batch内负采样在一个训练Batch内将其他样本的正样本物品作为当前样本的负样本。效率高但可能导致采样偏差。Hard负采样专门采样那些模型容易判错、或与正样本相似的物品作为负样本如同一作者的其他文章、相似标题的商品。这能极大提升模型的分辨能力是提升召回效果的关键技巧。实践中往往采用“随机负样本 少量Hard负样本”的混合策略。3.1.3 实操心得与陷阱塔的对称与不对称用户塔和物品塔不一定非要深度对称。物品特征相对稳定塔可以设计得深一些以提取更丰富语义用户特征变化快塔可以设计得浅一些以利于实时计算。甚至可以物品塔离线计算好用户塔在线实时计算。归一化的魔力对输出的用户/物品向量进行L2归一化将内积计算转化为余弦相似度。这不仅能稳定训练还能直接使用高效的余弦相似度ANN索引。温度系数在计算相似度用于Softmax时引入一个温度系数τ通常小于1可以拉大正负样本的分数差距使学习目标更清晰。线上服务化物品向量可以提前计算好并构建ANN索引。用户向量则需要在线实时推理得到。这里要注意用户特征如最近行为序列的实时拼接与处理效率。3.2 序列建模进阶SDM与MIND模型解析传统的双塔模型对用户兴趣的刻画多是静态或简单聚合的忽略了用户行为序列中蕴含的动态、多兴趣、有顺序的复杂模式。SDM和MIND正是为了解决这些问题而提出的代表性序列召回模型。3.2.1 SDM捕捉短期会话兴趣与长期稳定兴趣SDMShort-term and Long-term Preference Modeling的核心思想是将用户兴趣明确划分为短期会话兴趣和长期稳定兴趣。短期兴趣建模针对用户最近一次会话例如一小时内的连续行为使用GRU或Transformer等序列模型进行编码捕捉用户在当前上下文下的即时、连贯的意图。例如用户连续搜索“篮球鞋”、“运动袜”、“护膝”短期兴趣明显指向“篮球运动装备采购”。长期兴趣建模针对用户过去较长时间如几周的行为序列通过注意力机制等方式提炼出用户稳定、泛化的兴趣偏好。例如用户长期关注数码产品、户外运动。兴趣融合门设计一个门控网络动态地融合短期兴趣和长期兴趣生成最终的用户兴趣向量。这个门控网络会根据当前上下文如搜索词决定更依赖短期信号还是长期信号。实战要点实现SDM时如何定义“会话”是关键。可以基于时间间隔如超过30分钟无行为则视为会话结束或业务逻辑来切割。短期兴趣的序列不宜过长通常取最近的10-20个行为。3.2.2 MIND应对用户兴趣的多样性MINDMulti-Interest Network with Dynamic Routing的创新在于它认为一个用户向量不足以表达用户可能同时存在的多个兴趣点。例如一个用户可能既喜欢“编程教程”又喜欢“美食探店”。动态路由兴趣胶囊MIND利用胶囊网络Capsule Network中的动态路由机制将用户的历史行为序列自动聚类成多个兴趣胶囊。每个胶囊是一个向量代表用户的一个独立兴趣维度。多兴趣召回线上服务时用这多个兴趣胶囊分别去物品向量库中进行检索最后将各路的Top-K结果合并。这样能显著提升召回结果的多样性避免只召回最主流兴趣相关的物品。标签感知注意力在计算用户多兴趣向量时可以引入目标物品的标签信息进行注意力计算实现“兴趣-目标”的软对齐使得召回更精准。踩坑记录MIND模型训练相对复杂动态路由过程需要精心调试超参如迭代次数、胶囊数量。胶囊数量K是一个重要超参设置过少无法充分表达多样兴趣设置过多则可能导致兴趣分散和过拟合通常需要根据业务数据分布通过实验确定。3.3 向量索引选型与优化Faiss与HNSW实战模型产出向量后必须依靠高效的ANN索引才能实现毫秒级检索。Faiss是目前最流行的开源库而HNSW是其内部一种性能优异的图索引算法。3.3.1 索引类型选择IVFx Flat先对全量向量进行聚类如聚类成4096个簇检索时先找到距离查询向量最近的n个簇然后在这些簇内的所有向量中进行精确搜索。在精度和速度之间取得了很好的平衡是最常用的索引之一。HNSW基于可导航小世界图的索引具有极高的检索速度和不错的精度尤其适合超高维向量。但构建索引较慢内存消耗较大。IVFx PQ在IVF的基础上加入乘积量化PQ对向量进行压缩可以极大减少内存占用适合海量向量十亿级别的场景但会损失一部分精度。3.3.2 参数调优经验以IVF4096, Flat索引为例关键参数是nprobe搜索的簇数量。nprobe越大搜索的簇越多召回精度越高但耗时也越长。这是一个需要权衡的折中参数。离线调参在测试集上绘制不同nprobe下的RecallK曲线和耗时曲线根据业务对延迟的要求如P99延迟20ms来确定nprobe的值。内存与精度平衡使用PQ时需要选择子量化器的数量m和每个子向量的比特数nbits。m越大、nbits越大精度越高但内存也越大。通常需要做压缩-精度实验来选定。索引训练数据构建索引时使用的向量样本要有代表性最好使用全量物品向量或者均匀采样的大量子集。不能用过少或偏差大的数据训练索引否则检索质量会下降。4. 多路召回策略融合与线上服务架构4.1 策略设计如何组织多路召回单一召回模型总有局限工业级系统一定是“多路召回融合并流”。常见的召回通路组合如下召回通路核心逻辑优势劣势常用技术热度召回全局/分维度实时热度排序保障流行度解决冷启动稳定性高个性化弱容易导致马太效应实时点击/销量统计标签召回用户历史行为物品标签扩展可解释性强精准直达垂直领域兴趣泛化能力弱依赖标签质量标签体系倒排索引协同过滤召回Item-CF / User-CF挖掘群体行为规律发现潜在关联稀疏性、冷启动问题实时性差矩阵计算近邻搜索向量召回双塔、SDM、MIND等模型泛化能力强能捕捉深层次语义关联模型训练复杂依赖大量数据深度学习模型ANN索引实时行为召回基于用户最近几次点击/搜索捕捉即时兴趣响应极其迅速结果波动大长期兴趣缺失实时流处理Redis缓存设计时需要根据业务阶段和资源进行取舍。初期可以热度、标签为主中期加入协同过滤和双塔向量召回在数据量和算力充足后再引入SDM/MIND等复杂序列模型和实时召回。4.2 融合与去重从多路结果到统一候选集各路召回会返回一个有序的候选ID列表。融合策略至关重要加权分数融合如果各路召回能输出一个有物理意义的分数如相似度、热度分可以按预设权重进行加权求和然后全局排序取Top。难点在于不同路的分数分布和尺度不同需要归一化如Min-Max Z-Score。按优先级截断融合为每一路召回设定一个优先级和召回数量。例如第一优先级是实时行为召回取Top50第二优先级是向量召回取Top300第三优先级是热度召回取Top100。然后按优先级顺序合并并去重。穿插混排在最终列表中按一定比例穿插来自不同路的结果。例如每3个结果中1个来自向量召回1个来自协同过滤1个来自热度召回。这有助于保证结果的多样性。去重是融合后必须的步骤简单的根据ID去重即可。更高级的做法是进行内容层面的去重例如利用物品标题或内容的Embedding进行聚类从同一类中只选取最代表性的一个这能有效避免结果同质化。4.3 线上服务架构与性能优化一个典型的召回服务线上架构分为离线、近线和在线三个部分离线层负责训练召回模型双塔、MIND等生成全量物品向量并构建/更新ANN索引。通常以天或小时为周期调度。近线层负责处理用户实时行为更新用户实时兴趣向量如SDM的短期兴趣或更新实时热度榜。通常使用Flink等流处理框架延迟在秒到分钟级。在线层接收用户请求实时拼接用户特征调用用户塔模型或从缓存读取得到用户向量同时可能融合近线层计算的实时兴趣向量。然后查询ANN索引和多路召回策略进行融合、去重后返回给排序层。性能优化关键点向量查询批处理在线服务将多个用户请求的向量查询批量发送给Faiss索引能极大提升吞吐量。多级缓存用户向量、热门物品的向量、热度榜结果等都可以进行缓存。缓存策略如LRU、TTL需要精心设计。降级与兜底当某路召回特别是复杂的模型召回超时或失败时要有自动降级策略如直接返回热度召回保证服务可用性。监控与告警密切监控各通路召回量、延迟、召回率通过线上埋点抽样计算等核心指标设置异常告警。5. 效果评估、迭代调优与常见问题排查5.1 离线评估与线上A/B测试召回模型的迭代离不开科学的评估体系。离线评估核心指标RecallK,PrecisionK,Hit RateK。在固定的测试集上看模型能找回多少用户真实交互过的物品。仿真环境构建一个离线仿真系统模拟线上多路召回和简单排序如CTR预估值排序最终看端到端的CTR、CVR等业务指标。这比单看召回指标更接近真实效果。多样性/新颖性评估计算召回结果中类目、标签的分布熵或统计长尾物品的占比确保系统不会越来越“窄”。线上A/B测试离线指标好不代表线上效果好。必须通过A/B实验进行最终验证。实验时通常以整体业务目标如人均点击、留存、GMV作为核心评估指标同时观察召回相关指标如召回结果的点击率作为分析辅助。5.2 经典问题排查手册在召回系统运营中你会反复遇到一些典型问题以下是快速排查思路问题现象可能原因排查方向与解决方案召回结果同质化严重1. 负样本太简单模型区分能力不足。2. 热度召回权重过高。3. 向量模型兴趣提取单一如未用MIND。1. 引入Hard负采样增强模型判别力。2. 调整多路召回融合权重降低热度占比。3. 尝试引入MIND等多兴趣模型。4. 在融合后加入基于内容的去重模块。新物品/冷门物品永远无法被召回1. 向量召回依赖模型新物品向量训练不充分。2. 热度/协同过滤召回天然排斥冷门物品。1. 设立“新物品召回”通路基于内容标签、属性进行匹配。2. 在向量召回中对新物品进行特征平滑或使用默认向量。3. 在融合策略中为冷门物品设置保底流量或探索机制。线上效果波动大1. 实时行为召回通路不稳定。2. 模型或索引更新导致向量分布突变。3. 缓存失效或污染。1. 监控实时召回通路的输入数据质量和输出稳定性。2. 模型/索引更新采用灰度发布对比前后向量相似度分布。3. 检查缓存命中率和过期策略排查异常热点请求。离线评估指标高线上A/B测试不涨甚至跌1. 离线评估存在偏差如仅用曝光样本。2. 模型过拟合学到了数据中的虚假模式。3. 召回结果与排序模型不匹配。1. 改进离线评估使用更科学的全局负采样和更仿真的链路。2. 增加正则化使用更广泛的训练数据。3. 进行“召回-排序”联合分析看排序模型是否无法正确处理新召回的内容类型。服务延迟飙升1. ANN索引参数nprobe设置过大。2. 某路召回策略复杂度激增如序列过长。3. 依赖的外部服务如特征服务超时。1. 动态调整nprobe或在流量高峰时降级。2. 对输入参数如序列长度进行限流和截断。3. 设置调用超时和降级逻辑加强依赖服务监控。5.3 迭代调优的核心心法召回系统的优化是一个持续的过程我的经验是抓住三个关键循环数据循环确保训练数据的质量和代表性。持续清洗数据设计更合理的负采样策略尤其是Hard负样本的挖掘是提升模型效果性价比最高的方式。模型循环从简单的双塔开始逐步引入更复杂的特征如交叉特征、序列特征、更先进的模型结构如SDM、MIND。每次升级都要做严谨的离线评估和线上A/B实验。系统循环不断优化索引参数、缓存策略、服务架构。监控线上表现定位瓶颈。例如发现实时兴趣召回效果显著就应考虑投入资源优化其实时计算和更新链路。最后我想分享一点最深的体会召回系统没有“银弹”。最好的召回系统一定是深刻理解自身业务特性后的定制化方案。内容平台需要深度理解文本语义电商平台需要精准匹配商品属性与用户意图短视频平台则需要捕捉极强的即时兴趣和视觉特征。理解你的数据定义清楚你的“相关性”然后选择或设计最适合的技术路径去实现它这才是召回系统成功的本质。在这个过程中保持对基础原理的清晰认知对线上指标的敏锐观察以及对新技术的开放尝试才能让你的召回系统持续进化稳稳托住整个搜索推荐体验的基石。