← 返回个人主页
READING NOTE / BLOG个人博客

电商首页多路召回实践:从新品曝光不足到召回、排序与保量协同

Castle Zeng个人博客

给新品加了扶持权重,曝光却还是上不去。这是我在一次电商流量扶持项目中遇到的问题,也是这篇文章的起点。

最初,我们已经有了动态调节权重的机制:曝光落后于目标,就提高扶持力度。但沿推荐链路往前排查后才发现,一部分商品根本没有进入候选集。商品没有被召回,后面的排序模型就没有机会给它打分,再高的扶持权重也无从生效。

这次经历让我重新审视多路召回。它要解决的,是在有限的计算和延迟预算里,为不同类型的商品、不同状态的用户准备足够好的候选。模型只是其中一环,配额、过滤、融合和下游衔接同样重要。

1. 项目背景:曝光扶持为什么卡在了召回

我此前所在的平台兼具潮流电商和生活社区属性。按当时项目中的业务口径,日活跃用户数(DAU)接近千万、年商品交易总额(GMV)接近千亿;2026 年以来,相关规模指标出现了 15% 以上的下滑。在这个背景下,我参与了 CTO 牵头的流量扶持项目,担任算法侧负责人,统筹电商 Tab 下的商品推荐和搜索,二者流量占比约为 40% 和 60%。这些数字用于交代当时的项目背景。

运营希望扶持新品、降价品、热门品和活动品。算法侧的任务,是在 GMV、点击率(CTR)和曝光到成交转化率(CTCVR)不显著下降的前提下,让这些商品获得有效曝光,进而服务于月活跃用户数(MAU)的增长目标。这里讨论的是自然流量分配,不涉及广告竞价。

当时我已经实现了基于 PID 的流量控制。PID 可以理解为一个持续纠偏的调节器:根据累计曝光目标与实际曝光的差距,动态调整扶持系数,再用 weight × rankScore 改变商品的排序竞争力。它关注的不只是当前差距,也可以利用历史累计偏差及偏差变化趋势来调节力度。

但首页瀑布流中,部分商品、尤其是新品的曝光仍持续落后。主链路虽然已有 DSSM 双塔召回和基于协同过滤的 I2I 召回,热门兜底、新品冷启动、长尾覆盖和多兴趣扩展却明显不足,路与路之间也缺少有效的配额协同。

问题由此变得明确:流控能够调节已有候选的竞争力,却不能补回上游遗漏的候选。 优化范围需要从单独调权重,扩展到召回、排序、重排和流控的整体配合。

一件商品从“在库”到“被看到”,要经过什么

推荐系统通常不会对全量商品逐个运行最复杂的模型。它会先用成本较低的方法找出一批可能合适的商品,这一步叫“召回”;再逐步缩小范围,把更多计算投入到有希望曝光的商品上。

环节 可以怎样理解 本文关注的问题
召回 准备参赛名单 新品、长尾、不同兴趣是否有入场机会
粗排与精排 逐轮筛选和比较 候选对当前用户的价值如何
重排 组织最终展示列表 类目、店铺、多样性和业务约束如何兼顾
PID / 流控 按累计进度调整力度 曝光是否跟上目标,调整是否伤害整体质量

图 1|召回到曝光的协同关系。本文绘制;箭头表达职责与反馈,不代表系统的全部实现细节。

文中会反复出现三个词:U2I 是“用户找商品”,I2I 是“从一个商品找关联商品”,TopK 是“取排名靠前的 K 个候选”。Embedding(向量表征)则是把用户或商品编码成一组数字,方便计算相似性。历史点击过、用来发起 I2I 检索的商品,通常称为 trigger,也就是触发商品。

下文先复盘缺口和短期方案,再展开各路职责、配额设计与评估方式。后半部分给出的是建设思路和实验起始配置,并不意味着这些召回路都已在该项目中完成上线,也不代表已有统一的正向实验结论。

2. 有商品可推,为什么还是召回不到

项目中期,相关业务品池的累计规模约占商品总量的 10%。这个占比看起来并不小,但“池里有商品”和“当前请求能召回这些商品”是两回事。排查时,我把问题分成了四类:

  • 业务品池覆盖不足。前期新品、促销品等只占全量商品的一小部分,主召回按预测相关性取 TopK 时,很容易排在截断线之外;即便是更容易入围的热门老品,也会因为与用户画像、历史交互不匹配而落选。因此,仅配置业务品池还不够,还需要检索入口和合理配额。这里的“落选”也要和库存、风控等硬过滤区分开,两者的解决方式不同。
  • 目标人群的有效兴趣信号不足。 项目的扶持流量框定在“当月未购用户”,这类用户包含低活跃用户和浏览活跃但尚未成交的用户,前者可能缺少有效历史行为,后者则可能处于比较、观望或兴趣迁移阶段,都属于很难“猜你喜欢”的场景。
  • 新品的交互信号与索引更新不足。 新品缺少点击、加购和购买反馈,依赖交互训练的召回难以立即给出可靠的向量表征;新品可能得不到合适的匹配分,也可能尚未进入可用索引。内容或价格特征接入、item 向量更新和索引入库的延迟,又会进一步压缩可检索供给。
  • DSSM 召回的类目集中。在这次排查中,DSSM 的候选存在同类目集中的现象。这不是双塔模型必然具备的性质,但单向量表征可能被最强兴趣主导,同类目交互占优、训练样本偏差与统一 TopK 又进一步放大了这种集中。I2I 召回路也主要针对用户近期交互的相近商品,多路并集后难以拓展兴趣覆盖。

召回配额与曝光目标分属不同层次。召回 K 个新品,意味着这些商品获得了进入排序的资格;它们能否最终曝光,仍取决于粗排、精排和重排中的竞争结果。因此,召回层负责补齐候选覆盖,排序加权和重排约束负责调节竞争与页面结构,PID 等流量控制机制负责跟踪跨时段的累计曝光目标。

过去排查页面多样性问题时,我经常先看最后的重排:是不是类目打散不够,店铺上限太松?这次往前追了一层,才意识到候选本身就可能很单一。假如进入重排的几乎全是运动鞋,再好的打散策略也变不出数码和家居商品。多样性会影响用户是否疲劳、是否继续浏览,不能只在最终展示阶段补救。

原来用“分组赛跑”理解这个问题很直观:不同年龄组、不同项目各有合适的参赛者,如果只按一种标准选出少数人,名单就容易被某一类选手占满。多路召回相当于从不同组别选出候选;不过进入名单之后,仍要接受与当前用户需求相匹配的统一评估。

3. 临时增加一条旁路,为什么仍然不够

短期方案是在主链路旁增加一条指定品池的召回路,并将召回的商品直接送入精排打分环节,此后这些保量商品的精排分会经过加权,再进行重排。这样每增加一个品池,就要搭建一条新的召回链路,并且给品池内的商品配置用来 I2I、U2I 检索的向量表征,为了取 TopK 还要上线一个轻量的打分模型。

这条旁路没有纳入主链路统一的监控和维护,增加品池时又要重复配置,因此开发和排障都很繁琐。为了简化实现,我们一度只保留了 I2I 向量召回。它解决了一部分入口问题,却也把历史行为和向量覆盖的限制带了进来。

具体流程是:配置 item 向量表(item_id、embedding、模型版本及更新时间),将指定品池中符合资格的商品建立或挂接到 ANN 索引;线上从用户近期行为中选择 trigger 商品,查询其向量,在业务品池内进行 I2I 检索;汇总、去重和过滤后,再用轻量模型打分取 TopK,送往后续排序。

这里的 ANN 是近似最近邻检索,可以理解为在大量向量中快速寻找相近向量的方法。向量表保存“商品对应哪组数字”,ANN 索引解决“如何快速找到相似商品”,两者不是同一个概念。trigger 可以来自用户历史中的池外商品,但必须能取得同一向量空间、同一模型版本下的向量。

这条业务旁路仅使用向量相似度 I2I,因此候选覆盖受 trigger 和向量表示共同限制:trigger 集中于某一类目时,召回结果也容易集中;缺少有效 trigger 时可能空召回;新品向量质量不足时会漏召;有价格优势的活动品也未必与历史商品相似。后续轻量模型只能在这批候选中选优,无法恢复 I2I 未检索到的商品。旁路 TopK 因而只是 I2I 候选集内的最优结果,而非整个业务品池的最优结果。

对规模较小的品池,池内检索通常比“全库近邻检索后再过滤”更能保住有效候选量;索引暂不支持池内过滤时,则需要有上限的过召回与补量。

除覆盖限制外,旁路直送还改变了候选进入排序的方式。轻量模型决定了谁能进入精排,其优化目标与精排目标不一致时,可能提前淘汰后续模型认为更好的候选。这里需要区分两类问题:如果所有候选进入精排后都重新打分,轻量模型原始分的量级并不会自动污染最终比较;只有在原始分被直接混排或参与加权时,才会额外产生分数不可比的问题。旁路插入位置、跳过的筛选以及流量配额,同样会影响曝光质量。

当时的 A/B 实验中,GMV、CTCVR 和 CTR 均出现下跌,说明当时的扶持方案付出了整体效率代价,但不能单凭一次实验断定是哪一项机制导致下跌。候选质量、I2I 漏召、筛选目标不一致,以及是否存在原始分混用,都需要分别核查。

长期建设的重点因此是为业务品池补齐内容、分组热门和受控探索入口,再将候选纳入首页统一排序,由带质量护栏的重排与 PID 协同完成累计曝光目标。

4. 配置召回路,先看每一路补什么缺口

首页瀑布流需要同时承接用户已有兴趣和发现潜在需求。连续翻页又进一步要求系统结合长短期历史、当前会话和已曝光记录,在相关性、候选新鲜度与业务扶持之间分配有限的排序容量。多路召回的配置,正是对这些需求的分工与协调。

下文围绕电商首页瀑布流,讨论各召回路的候选范围、必要性、技术选型、TopK 配额及过滤汇总方式。统计热度、Swing 和 SimRank 的核心公式用于解释其排序依据与选型差异,完整训练和索引实现不在本文范围内。配置方案沿六个维度展开:

  1. 候选范围:各路覆盖的商品及其对应的供给缺口;
  2. 互补关系:信号差异与跨路独有贡献;
  3. 技术选型:数据条件、收益空间与工程成本;
  4. 候选预算:总容量、路间配额与用户分桶;
  5. 链路衔接:资格过滤、去重、融合与统一排序;
  6. 效果评估:覆盖、相关性、漏斗贡献与线上净收益。

匹配形式与信号来源,是两种分类维度

召回系统可以从两个维度描述。U2I、I2I、X2I 描述“拿什么去找商品”,其中 X 可以是类目、场景等条件;统计、协同过滤、表征学习、业务策略与探索描述“依据什么证据找到商品”。例如,同样从一双鞋发起 I2I,既可以按共同点击找关联,也可以按图片或属性找相似商品。按信号来源划分,更便于明确各路职责、识别覆盖缺口并分配预算。下表采用这一分类方式:

类型 代表召回路 主要能力 典型短板
统计兜底召回 全局热门、用户分组热门、类目热门 冷启动、稳定覆盖、低延迟兜底 个性化弱、容易放大头部效应
协同过滤召回 ItemCF(PAI 组件:ETrec)、Swing、SimRank 利用共现和群体行为发现关联 依赖交互数据,对新品和稀疏用户不友好
表征学习召回 DSSM/双塔、MIND、序列向量、内容/多模态向量、图向量 语义泛化、长短期兴趣、多兴趣和高阶关系 训练与索引成本较高,需处理样本偏差和向量时效性
业务策略召回 新品、活动品、促销品、高效品、治理或增长品池 为业务候选提供受控入口 配额过大或绕过排序会伤害效率
探索实验召回 不确定性探索、长尾探索、跨域召回、生成式召回 PoC 获取新反馈、验证新范式 风险和不确定性高,必须有预算与护栏

信号来源与技术实现可以交叉。例如,Swing 属于协同过滤方法,同时利用用户—商品二部图中的共现结构;图网络学习出的向量既可支持 I2I,也可支持 U2I。系统配置关注的是候选来源的差异与互补,而非要求每个算法只属于一个标签。

5. 八类召回能力,按缺口逐步建设

下面的八类能力是一张检查覆盖缺口的地图,不是要求每个系统都同时维护八条独立服务。一条路可以承担多个职责;两条路如果长期返回相同候选,也不必为了分类完整而各占一份预算。

图 2|从覆盖缺口到召回能力。本文绘制;工程上可以合并实现,也可以按用户群只启用其中一部分。

1. 统计召回:分层热门与稳定兜底

统计召回主要提供全站热门、用户分组内热门,以及用户多个潜在兴趣类目中的热门商品。首页瀑布流根据画像和历史选择这些榜单;无可靠兴趣时优先使用履约区域和生命周期等可确定信息。

统计召回不要求用户有丰富的个人历史,适合首页新用户、低活跃用户以及其他召回路不足时兜底。相比全局热门,按履约区域、价格带、生命周期及可靠兴趣偏好组织的榜单能提供轻量个性化;分组越细,样本越少,必须设置样本门槛和回退层级。

统计热度用于筛选近期获得有效正向反馈的商品,质量与可售资格单独过滤;榜单内部还应限制店铺、品牌和类目集中度。热度公式负责度量近期行为强度,候选多样性由配额、过滤和排序共同控制。

热度分:行为越有价值、越新,贡献越大

热度分采用“行为加权 + 时间衰减”的计算方式:先累计各类有效行为的衰减贡献,再按行为价值加权汇总。全局榜与分组榜使用相同口径,以用户集合 g 区分统计范围。以下权重、窗口与门槛构成一套用于 A/B 实验的起始配置,最终数值由业务数据验证。

Xb(i,g,t)=∑e∈Eb(i,g)0≤t−te≤168h2−t−te48 hX_b(i,g,t)=\sum_{\substack{e\in E_b(i,g)\\0\le t-t_e\le168\,\mathrm{h}}}2^{-\frac{t-t_e}{48\,\mathrm{h}}}
Hot⁡(i,g,t)=ln⁡ ⁣(1+Xclick+2Xfavorite+3Xcart+6Xpaid)\operatorname{Hot}(i,g,t)=\ln\!\left(1+X_{\mathrm{click}}+2X_{\mathrm{favorite}}+3X_{\mathrm{cart}}+6X_{\mathrm{paid}}\right)

式中,E 表示有效行为事件集合,下标 b 区分点击、收藏、加购和支付,i 表示商品,g 表示用户分组,tₑ 表示事件发生时间;全局榜的 g 包含全部用户。各类 X 为对应行为的衰减累计量,热度汇总式省略了共同的商品、分组和时间参数。

四类行为权重依次为 1、2、3、6,曝光不计分,以免把系统分配的机会再次放大为热门优势。支付只统计已支付且未取消的有效订单,退款按数据回补规则修正。行为经异常流量清洗后,按“用户×商品×行为类型×自然日”最多计一次。

同一用户的不同类型行为可分别贡献分数,权重表达行为价值,而非转化概率。

一组可以手算的热度示例

统计窗口取最近 7 天,每小时刷新,时间半衰期取 48 小时,对应的指数衰减率约为每小时 0.01444。单个事件经过 24、48、96 小时后的贡献分别约为 0.707、0.5、0.25。半衰期越短,榜单越敏感于近期趋势;越长,则越稳定。活动期可用 12 或 24 小时作为对照,日常可比较 24、48、72 小时。

自然对数变换用于压缩分值范围,保持原有热度排序,头部集中仍需通过候选配额和分布约束处理。

例如,同一统计桶中的某商品在 24 小时前产生 100 次有效点击、10 次收藏、20 次加购和 5 次支付。按上述权重汇总,未衰减行为分为 210;乘以约 0.707 的衰减因子后为 148.5,再加 1 取自然对数,热度分约为 5.01。不同分组的样本量不同,热度分仅用于各榜内部排序;跨榜候选通过配额与统一粗排比较价值。

图 3|48 小时半衰期的含义。本文绘制;这是公式示意,不是线上实验结果。

分层榜单:细分优先,不足时逐层回退

统计路总配额应随用户状态调整:对兴趣信号充分的用户保留较小兜底预算,对缺少有效历史的用户提高预算;同一统计路内部再按以下规则给细分榜、上级榜和全局榜分配名额。

统计路通过分层榜单和候选配额实现轻量个性化。系统依据可靠的历史偏好、履约区域与价格带选择细分榜,画像缺失或样本不足时逐层回退。分组只组合少量有效维度,以控制稀疏小桶的数量。

一套起始层级是:“区域×生命周期×价格带”细分用户榜 → “区域×生命周期”上级榜 → 区域榜 → 全局榜。类目热门可以作为另一组候选子榜:对用户近期多个兴趣类目分别取数,每个类目限额后并入统计路,防止再次被单一类目占满。

榜单可靠性由样本量、新鲜度和商品资格共同约束。起始配置可要求细分榜最近 7 天至少覆盖 500 个有效活跃用户、2,000 次有效正向行为,且更新时间距当前不超过 2 小时;商品至少具有 100 次有效曝光、5 次有效点击,并满足可售、履约和质量条件。未达标的榜单回退至上级,尚未积累足够样本的新品则由内容、业务和探索路提供候选入口。

假设统计路预算 K=200:先从通过门槛的细分榜取 140 个、上级榜取 40 个、全局榜取 20 个。按细分 → 上级 → 全局依次过滤、去重和占用统计路名额;若细分榜只剩 90 个有效商品,缺少的 50 个先向上级榜补,再向全局榜补,总量仍不超过 200。同一商品多榜命中时只占一个位置,但保留所有来源。该顺序保证细分榜的候选进入机会,最终曝光仍由首页统一排序决定。跨路融合还需记录统计路去重后的保留量,并按总体预算补足,不能把路内 140 个误当成曝光保底。

监控:榜单有结果,还要看结果走到了哪里

监控体系覆盖四个层面。供给与服务:各层榜单命中率、空榜率、过滤后填充率、上级或全局回退比例、榜单年龄和 P95/P99 延迟。候选分布:独有候选数、与 DSSM 及协同路的重合率、最大类目占比、店铺集中度和商品覆盖率。排序漏斗:原始取数、有效去重、粗排与精排入围、真实曝光各阶段的数量和转化比例。业务效果:按用户活跃度与榜单层级观察 CTR、CTCVR、每千次曝光 GMV、负反馈率、浏览深度和复访。

实现上,每次请求记录 request_id、user_bucket、page_no、recall_source、group_key、fallback_level、榜单版本、路内名次和各阶段过滤原因;曝光、点击、支付日志通过请求与商品标识关联。多路命中商品保留来源集合,并固定多触点或排他归因口径,避免重复计成交。细分榜用户与全局兜底用户的基础活跃度不同,不能直接用两者 CTR 高低证明优先级正确;应在同一用户分桶内随机比较“细分优先”和“全局优先”,观察整体及目标人群的净收益。

2. 协同过滤召回:补足稳定、可解释的行为关联

协同过滤主要提供与用户历史点击、收藏、加购、购买商品高共现的商品,也可以从相似用户群的共同偏好中生成候选。

协同过滤直接利用真实交互,能够捕捉“看了 A 的人也看了 B”这类稳定关系。它与内容相似召回互补:两个商品的标题和图片可能不像,却可能在真实购买路径中互为替代品或搭配品。

协同过滤的主要差异在于关联证据的构造:ItemCF 从商品共现建立直接关联,Swing 通过用户对加权抑制部分共现噪声,SimRank 则通过递归传播寻找间接联系。这些方法共享行为数据,却在覆盖范围、抗噪能力和计算成本上各有取舍。

首页瀑布流通常以 ItemCF 建立行为关联基线,进一步比较 Swing 在抗噪和候选增量上的收益;SimRank 则适合在高阶联系具有明显独有贡献时作为补充。上线顺序以同等预算下的增量收益为依据,无须同时部署全部方法。

ItemCF 与 ETrec:从直接共现建立关联

阿里云 PAI 将其基于物品的协同过滤组件命名为 ETrec(etrec)。该组件输入用户—商品交互,输出每个商品的相似商品 TopN,支持 wbcosine、asymcosine 和 jaccard 等相似度类型。因此,ETrec 是 ItemCF 的一种平台实现名称。PAI-Rec 的“ETrec U2I”配置在此基础上,用用户历史商品展开 I2I 关联表并汇总为用户级候选。

来源:阿里云 ETrec 组件文档

Swing:同样的共现,证据分量也有差别

Swing 将同时交互过两个商品的用户对作为关联证据。记 U(i) 为与商品 i 有有效交互的用户集合,I(u) 为用户 u 的交互商品集合。为说明它如何抑制部分共现噪声,本文保留下面这一带活跃度权重、可选候选归一化的表达。它是解释机制的公式,具体产品版本是否采用完全相同的归一化流程,应以实现为准:

w(u)=(∣I(u)∣+α1)−βw(u)=\left(\lvert I(u)\rvert+\alpha_1\right)^{-\beta}
sim⁡(i,j)=1Nj∑u∈U(i)∩U(j)∑v∈U(i)∩U(j)v≠uw(u)w(v)α2+∣I(u)∩I(v)∣\operatorname{sim}(i,j)=\frac{1}{N_j}\sum_{u\in U(i)\cap U(j)}\sum_{\substack{v\in U(i)\cap U(j)\\v\ne u}}\frac{w(u)w(v)}{\alpha_2+\lvert I(u)\cap I(v)\rvert}

两个用户都交互过 i 和 j,才构成一次用户对证据。用户交互商品越多,w 越小;两人的共同商品越多,分母越大,避免同一高度重合人群反复贡献过强的关联。该形式按有序用户对求和;若实现改为无序对,只会在其他条件相同时少一个整体倍数,但离线阈值和线上分数口径必须保持一致。

阿里云中文工具文档的命令示例使用 α₁=5、α₂=1、β=0.3;这些示例值不应直接视为所有实现的默认值。上式中的 Nⱼ 是可选的候选侧归一化因子,不做该项修正时取 1。工具文档还提供了商品近期热度输入,但这不等于确认其内部恰好按上式直接相除。

候选侧归一化可能使两个方向的相似度不同。

在用户活跃度权重相同时,共同商品数为 2 和 20 的用户对,在 α₂=1 时分别贡献 1/3 和 1/21 的关联权重,前者为后者的 7 倍。这种设计降低了高重合用户对的影响;长尾覆盖仍取决于交互证据,零交互新品则需要其他召回路承接。

首页在线使用时,从多组历史 trigger 查表,再按 trigger 权重和时效性汇总到商品,统一去重并取本路 TopK。离线每个 trigger 保留的 TopN 和线上每个用户的 TopK 是两种预算;前者过小会让后者无从补量。

来源:阿里云 Swing 工具文档(中文)

SimRank:沿关系图寻找间接联系

ItemCF 主要看直接共现,Swing 调整这些共现证据的权重;SimRank 则进一步追问:两个商品没有被同一批用户买过,它们是否仍可能有关联?

它的出发点是“相似的人会接触相似的物品,而相似的物品又会吸引相似的人”。用户—商品二部图,就是只在用户和商品之间连接交互边的图。在这张图上,用户相似度由交互商品的相似度决定,商品相似度又由交互用户的相似度决定。下式中,s 的下标 U、I 分别表示用户与商品相似度,上标 k 表示迭代轮次;两式分别用于不同用户和不同商品:

sU(k+1)(u,v)=CU∣I(u)∣ ∣I(v)∣∑a∈I(u)∑b∈I(v)sI(k)(a,b),u≠vs_U^{(k+1)}(u,v)=\frac{C_U}{\lvert I(u)\rvert\,\lvert I(v)\rvert}\sum_{a\in I(u)}\sum_{b\in I(v)}s_I^{(k)}(a,b),\quad u\ne v
sI(k+1)(i,j)=CI∣U(i)∣ ∣U(j)∣∑u∈U(i)∑v∈U(j)sU(k)(u,v),i≠js_I^{(k+1)}(i,j)=\frac{C_I}{\lvert U(i)\rvert\,\lvert U(j)\rvert}\sum_{u\in U(i)}\sum_{v\in U(j)}s_U^{(k)}(u,v),\quad i\ne j

SimRank 以同一节点相似度为 1、不同节点相似度为 0 初始化,并在迭代中保持对角线为 1。任一邻居集合为空时,对应的非对角相似度取 0。两个传播系数 Cᵤ、Cᵢ 均取 0 到 1 之间的值,用于控制间接关系的影响;原论文展示过两者均取 0.8 的设置。工程实验可以暂从 5 轮迭代起步,再检查收敛情况、增量收益与计算预算;5 轮是这里的实验起点,不是对所有图都充分的结论。传播衰减作用于图中的关系深度,与热门榜中的行为时间衰减不同。

当商品 i、j 没有共同用户,但各自用户曾交互过相似商品时,多轮传播仍可能建立两者的间接联系。工程上可离线计算并保留商品相似 TopN,再由用户历史展开为在线候选。精确计算涉及较大的相似度矩阵和邻居对求和,通常需要预计算、候选剪枝或近似算法来控制成本,并以相对 Swing、图向量的独有贡献评估收益。完全孤立的新品仍由内容或业务路补充。

来源:Jeh 与 Widom,SimRank 原论文第 4.3、4.4 节:SimRank 原论文

UserCF:哪些场景值得维护用户近邻

UserCF 先寻找行为相似的用户,再从邻居交互过、当前用户尚未交互的商品中生成候选。对于用户兴趣变化快、购买行为稀疏的首页瀑布流,ItemCF/Swing、双塔与多兴趣召回通常更适合作为基础组合。UserCF 的配置取舍主要涉及维护成本、邻居稳定性、冷启动与跨路增量。

维护成本与更新时效。 用户规模大、行为更新频繁时,用户近邻的维护与候选展开会产生较高开销。ItemCF 的商品关联表可被多个用户复用,线上通过少量 trigger 查表,较容易控制响应延迟。两者的实际成本仍取决于用户数、商品数、交互密度和更新频率;商品库极大且变化快时,ItemCF 也需要相应的成本优化。

邻居稳定性。 电商购买相对低频,用户又可能同时存在跨类目和阶段性需求,共同购买某个热门商品只能提供有限的相似证据。行为稀疏时,近邻更容易随少量交互发生变化。区分点击、加购与购买,结合热门抑制和时间窗,可以改善近邻质量,但收益仍需通过线上实验验证。

冷启动覆盖。 UserCF 依赖邻居已有交互,零交互新品难以通过这一路获得候选资格;没有历史的新用户也缺乏可靠近邻。内容召回和分层热门因此仍是必要的补充。

跨路增量。 UserCF 与 ItemCF、双塔可能命中大量相同商品,其价值需要在相同候选容量和延迟预算下衡量。独有有效候选、排序入围与 A/B 净收益,比单路召回数量更能决定是否值得维护这一路。

综合上述约束,本文方案将 UserCF 作为补充选项,而非默认基础路。用户群稳定、交互密集、社群偏好明显,或平台已有高效用户近邻服务时,其收益空间更大。Amazon 的 Item-to-Item 工程总结也体现了物品关联复用的价值;具体选择仍取决于平台自身的数据结构和实验结果。

来源:Amazon 的推荐算法工程回顾

首页瀑布流从用户历史中选取多个 trigger,按最近点击、高意图行为和长期兴趣分组设权重;限制单 trigger 的展开数,给不同兴趣类目留子配额,避免一次点击占满整路 TopK。翻页时结合本次会话的已曝光商品、已召回缓存与最新行为去重,并与 DSSM、多兴趣和分组热门路检查增量贡献。I2I 索引在这里通过“用户 → 历史商品 → 候选商品”形成用户级召回,不等同于 UserCF。

3. 单兴趣 U2I:主力个性化召回

单向量 U2I 召回用一个向量表达当前用户的整体兴趣,再检索与这个向量匹配的商品。

DSSM/双塔把用户和商品映射到同一向量空间,商品向量可离线建 ANN 索引,用户向量在线计算,适合从百万乃至更大规模的商品库中进行高效个性化候选生成。与纯协同过滤相比,它还能融合用户画像、商品属性和上下文特征,具有更强的泛化能力。

首页用户行为相对充足、兴趣较集中时,单向量双塔是值得优先验证的主召回基线。工程上要关注训练目标与线上目标是否一致、负采样是否偏向热门商品、item 向量更新频率,以及 ANN 的召回率—延迟权衡;同类目集中的程度应按用户群和翻页深度分别诊断。

单向量 DSSM 可以承担首页个性化的较大基础配额,但应按用户分桶检查最大类目占比、类目覆盖数及去重后独有候选率。出现同类别集中时,先排查历史聚合、特征、样本与索引,再给多兴趣、内容、业务和探索路分配补充预算。必要时在路内扩大检索量后按类目上限截断,或使用类目子索引;这些操作需要验证相关性损失,不能靠增加 K 自动获得跨类目多样性。

4. 多兴趣与序列召回:把“一个用户”拆成多种意图

多兴趣与序列召回分别面向用户的不同兴趣、近期会话和长期偏好生成候选。

单向量双塔提供了高效的个性化基线,但一个用户的兴趣未必只有一条主线。用户可能同时关注母婴、数码、运动和食品。MIND 等多兴趣模型用多个向量表达一个用户,能避免单向量把相距很远的兴趣平均掉。序列召回强调行为先后关系和近期变化,可用于承接短期会话意图。两者并不互斥,一个模型也可以同时学习多个兴趣和行为顺序。多兴趣建模的出发点可参见 MIND 原论文。

首页历史行为较长、类目跨度较大的用户可优先验证多兴趣表达;本次瀑布流会话中的最新点击可进入短序列表征,承接兴趣迁移;低频但高价值的购买行为可作为长期兴趣信号,避免被高频点击完全覆盖。新行为需要及时更新 trigger 或用户表征,同时用跨请求去重防止翻页反复出现同一批商品。

多兴趣路采用“用户总预算 → 兴趣子配额”的两层分配方式,再按兴趣强度、最近活跃度和多样性需求调整各簇名额。总量受控后,对同类目和同店铺进一步限额,可以同时避免候选数随兴趣数量膨胀,以及单个强兴趣占满本路。

5. 内容与多模态召回:解决新品和行为稀疏

内容召回寻找的是在标题、类目、属性、图片或跨模态语义上,与用户兴趣或 trigger 商品相近的商品。

前面几类方法都在不同程度上利用历史行为,但新品恰好缺少这类证据。标题、类目、属性和图片通常在商品上架时就已存在,因此可以换一条线索,从商品本身出发建立匹配。因此内容召回是新品冷启动的关键补充,也能覆盖行为共现尚未形成的长尾商品。

结构化属性可靠时,属性和类目特征应优先进入轻量基线;文本丰富时可使用语义向量;图片决定购买决策的类目可加入视觉或多模态向量。多模态不是“越多越好”,应根据类目分别验证文本、图片、价格和品牌信号的增量。

新品期可提高内容路配额,待交互信号充足后逐步让协同路和深度 U2I 接管。内容路还应设置质量门槛,避免把信息不完整、图片低质或属性错误的新品大规模推入候选池。

6. 图召回:挖掘高阶、替代与互补关系

图召回从用户—商品图或商品关系图中寻找具有多跳联系、结构相似、替代或搭配关系的商品。

序列模型主要学习同一行为序列中的邻近关系,图方法还可利用二度邻居和更复杂的结构信息。电商中“相似商品”和“搭配商品”是两种不同关系,后者常常难以仅靠内容相似得到。

DeepWalk/Node2vec 是可扩展的浅层图基线;EGES 通过融合类目、店铺、品牌等侧信息缓解稀疏和新品冷启动;GraphSAGE 等归纳式方法可利用节点特征和邻居为新节点生成表示,但效果仍取决于可用信息,不能自动解决完全孤立、缺少特征的新品问题。EGES 论文讨论了融合侧信息以缓解稀疏与冷启动的做法。图模型是否值得单独成路,取决于它相对协同过滤和序列召回能否提供足够的独有候选。

图召回应重点监控与 I2I、Swing 的候选重合率。如果 TopK 大量重复,应缩减配额或只保留其擅长的关系类型,例如跨类目搭配、长尾或多跳候选。

7. 业务召回:给策略目标一个受控入口

业务召回面向新品、活动品、促销品、高毛利品、高履约质量商品,以及需要扶持或治理的特定品池。

排序模型只会优化训练目标,不会天然满足上新、活动节奏、供给治理和增长实验等约束。业务召回为这些商品设置受控的候选入口,是模型目标与经营目标之间的接口。但它仍受资格、配额和筛选约束,不代表池内每件商品都会被召回。

先做硬资格过滤,再在品池内用轻量级 pCTR/pCVR、质量分或多目标价值分排序。业务路必须携带 recall_source、pool_id、原始得分和策略版本,方便下游做校准、归因与回滚。

对小品池,可以评估对池内合格商品直接做轻量打分;对大品池,则需要内容、热门、向量检索等入口先缩小范围。否则,只把 I2I 候选套上业务标签,仍然补不齐原先的漏召。

配额按用户价值、冷启动程度、活动阶段和库存动态变化,并设置用户级、品类级、店铺级和全局流量上限。业务路应进入统一粗排,而不是绕过主链路;硬保量若确有必要,应放在可解释、可监控的重排约束中完成。

8. 探索召回:用有限流量换取未来信息

探索召回为低曝光但质量达标的长尾商品、模型不确定性高的商品、跨域兴趣,以及生成式召回等新方案提供实验入口。

只利用历史最优会加剧曝光偏差,新品永远没有机会积累反馈。探索路的目标不是立即最大化 CTR,而是在可控成本下获取信息,改善长期覆盖与模型学习。

可以从随机但受质量约束的探索开始,再逐步升级为基于不确定性、上下置信界或 Thompson Sampling 的流量分配。生成式召回、跨域召回等更适合作为小流量独立实验,不宜与成熟主路混为一谈。

首页瀑布流的探索预算应按请求、用户和会话共同限制,在连续翻页中控制累计占比,并设置质量、安全、价格、库存和负反馈护栏。先用小流量评估短期转化损失,再观察复访、有效交互覆盖及新品后续表现;召回探索候选数量仍不等于实际探索曝光预算。

6. TopK 怎么分:给增量价值分预算

各路职责明确后,需要将覆盖目标转化为可执行的容量预算。TopK 由商品规模、候选重合率、粗排吞吐、延迟要求和业务目标共同决定。下面以 A/B 实验起始配置为例:各路合计召回 2,000 个原始候选,假设去重后约 1,200 个,再通过质量过滤和预算截断保留 800 个进入粗排。去重后的数量随用户与各路重合情况变化,实际吞吐应以线上统计为准。

召回路 原始 TopK 角色
单兴趣 U2I / DSSM 450 主力个性化与语义泛化
多兴趣 / 序列召回 300 多兴趣、短期意图与兴趣迁移
协同过滤 I2I / Swing 350 稳定共现、替代和长尾关联
内容 / 多模态召回 200 新品与行为稀疏补充
图召回 150 多跳、结构和搭配关系
全局 / 分组热门 200 冷启动与不足兜底
业务品池召回 250 新品、活动、促销等策略目标
探索召回 100 长尾与新方案探索
合计 2,000 去重前预算

图 4|候选数量与曝光数量的区别。本文绘制;2,000 → 约 1,200 → 800 沿用本文假设配置,后续曝光量不作数值假设。

预算调整遵循三个原则:

  1. 按增量贡献分配预算。 某一路召回 300 个候选,其中 280 个已被其他路覆盖,独有候选仅有 20 个;这 20 个是否有价值,还要继续观察有效性、排序入围和最终曝光。配额调整以独有有效候选及线上净收益为依据,避免把原始召回量等同于效果增量。
  2. 根据用户状态动态分桶。 冷启动用户提高热门、内容和业务路比例;活跃用户提高 U2I、序列和协同路比例;多兴趣用户提高 MIND 子配额;大促期可适度提高活动品池预算,但需同时收紧质量护栏。
  3. TopK 是容量预算,不是曝光承诺。 召回配额解决覆盖,排序权重解决竞争力,重排约束解决最终页面结构,PID 或流量控制解决跨时段累计目标。这几层不能相互替代。

7. 把多路候选接成一条可维护的主链路

各路完成候选生成后,需要在统一链路中处理资格、重复、分数尺度与最终容量。过滤尽量前置,来源信息贯穿各阶段,补量则在质量与延迟约束内完成。整体流程分为六步:

1. 召回前过滤

在进入各路索引或品池之前,先过滤不可售、无库存、地域不可达、活动未生效、价格异常、风控或合规不通过的商品。越早过滤,越能避免无效候选占用 TopK。

2. 路内截断

每一路先完成自己的 trigger 选择、时间衰减、按业务规则处理已购商品和负反馈商品、同店铺或同类目上限,再输出 TopK。路内截断应保留原始得分、路内名次、trigger 和模型版本。

对于可重复购买的消耗品,已购不一定意味着永久排除;过滤时间窗应结合类目和复购周期设定。

3. 跨路去重并保留来源

按 item_id 合并重复商品,但不要只保留一个来源。建议保留 recall_sources、各路 rank、各路 raw score、最强 trigger 等信息。多路命中可以成为有用特征,也有助于解释和归因。但各路往往共享行为数据和模型特征,不能假设这些证据相互独立,更不能仅凭命中路数多就认定质量高。

4. 分数校准与候选融合

不同召回路的余弦相似度、共现分、热度分和业务分不在同一量纲,不能直接拼起来排序。常见做法有三类:

  • 配额并集 + 统一粗排。 最简单稳健,各路只负责贡献候选,统一模型负责比较价值;
  • 归一化后加权。 先通过分位数或 z-score 等变换统一数值尺度,再验证加权策略。尺度归一化不等于把分数校准成同一种点击或成交概率;
  • 按名次融合。 当分数难以校准时,用 RRF(Reciprocal Rank Fusion)等基于路内排名的方法合并,减少量纲差异的影响。

RRF 可以直观理解为:看一个商品在每一路排第几,而不是直接比较不同路给出的分数。常见形式是对各路的 1 / (c + rank) 求和,未命中该路时不计贡献;常数 c 控制前几名的优势程度。它避免了直接混用原始量纲,但不能替代业务价值建模,也不自动保证各路配额。实现示例可参见 Milvus RRF 文档。

数据和算力足够时,还可以训练一个轻量混排模型,把召回来源、路内名次、原始分和用户状态作为特征。但无论采用哪种方式,都应避免把某一路的 raw score 当成全局 rank score。

5. 合并后过滤与补量

合并后再次执行曝光频控、用户负反馈过滤、商品和店铺集中度约束、近重复过滤。首页瀑布流还需对同一会话各页的已曝光和已下发商品去重,避免翻页重复。候选不足时,可优先从满足门槛的细分榜、上级榜和全局榜逐层补量;扩大主路检索 K 则应在剩余延迟预算内执行,不能无限重试。补量仍执行相同过滤与质量门槛,并记录回退层级及最终填充率。

6. 进入统一排序与受约束重排

粗排负责从千级候选压缩到百级,精排统一评估点击、转化、GMV、留存等目标,重排再处理多样性、店铺/类目打散、业务配额和页面体验。对于必须完成的保量目标,可以在重排阶段设置软约束或保底槽位,但应同时设置质量下限和大盘损失上限。

8. 怎样证明新增一路真的有用

召回评估同时覆盖相关性、供给覆盖、跨路互补和系统成本。离线指标用于定位缺口,线上实验用于验证候选增量能否转化为用户与业务收益。主要观测维度包括:

  • 相关性: Recall@K、HitRate@K、NDCG、正样本在候选中的排名;
  • 覆盖: 商品覆盖率、类目覆盖率、新品覆盖率、长尾商品占比;
  • 互补性: 与其他路的 Jaccard 重合率、独有候选率、独有曝光率;
  • 漏斗贡献: 召回量 → 去重后量 → 粗排入围量 → 精排入围量 → 曝光/点击/成交量;
  • 系统指标: P95/P99 延迟、超时率、索引新鲜度、空结果率和补量率。

线上则需要同时看 CTR、CVR/CTCVR、GMV、客单价、MAU 或留存,以及新品曝光和业务目标达成率。判断某一路是否有效,最可靠的方法不是看它“召回了多少”,而是做增量实验:关闭该路、缩减配额或替换为等量随机/热门候选,观察大盘和目标人群的净变化。

从漏斗定位问题,再决定改哪一层

假设新品有库存、符合投放资格,却始终达不到曝光目标,我会沿下面这条路径逐段看数,而不是一开始就提高扶持权重。

图 5|曝光不足的排查路径。本文绘制;各阶段都应按同一目标人群和业务品池观察。

第一层没有候选,先看资格、索引和召回入口;有候选却进不了精排,检查候选质量、预算截断和粗排目标;进入精排仍很少曝光,再看分数、重排约束及扶持力度。若这些环节均正常,但累计目标仍落后,还要检查目标本身是否超过合格流量和库存能够支撑的上限。PID 能纠偏,不能凭空创造可用流量。

实验也要保持比较条件尽量一致:测试某一路的价值时,固定总体候选容量和延迟预算,明确移除它后是否由其他路补量。否则,测到的可能只是“多算了一批候选”的收益。离线评估还需按时间切分,防止把未来行为带回历史索引;只基于旧系统曝光日志的指标,则会受到既有曝光选择的影响。

9. 实践中最容易踩的几个坑

  • 把更多召回路等同于更高效果。 高重合的召回路只会增加复杂度和延迟。
  • 直接混合不同路的原始分数。 分数量纲和分布不同,结果往往被某一路支配。
  • 用召回层承担硬保量。 召回只能保证候选资格,无法保证最终曝光。
  • 业务品池绕过统一排序。 短期见效快,长期容易伤害 GMV、CTR 和用户体验。
  • 所有用户使用固定 TopK。 冷用户、重度用户、多兴趣用户和活动期用户需要不同配额。
  • 只看点击,不看覆盖和长期反馈。 这会不断强化头部和已有兴趣,使新品与长尾越来越难获得学习机会。

10. 回到最初的问题:扶持需要一条完整的链路

多路召回的价值不在于堆叠模型,而在于把不同问题拆给最合适的信号源:统计召回负责兜底,协同过滤负责真实行为关联,双塔负责大规模个性化,多兴趣与序列模型负责兴趣结构,内容和多模态负责冷启动,图召回负责高阶关系,业务召回负责经营目标,探索召回负责获取未来信息。

真正决定系统质量的,通常不是“有没有某个先进模型”,而是四件更朴素的事:每一路是否有清晰职责,TopK 是否根据增量价值分配,跨路结果是否正确校准与去重,以及召回、排序、重排和流量控制的职责是否分明。

新品扶持暴露出的并非单一模型缺陷,而是候选覆盖、跨路配额和下游竞争之间的协同问题。内容与业务召回提供新品入口,多兴趣与分组热门拓展用户需求覆盖,统一排序比较候选价值,重排与 PID 再在质量护栏内落实累计曝光目标。从候选生成到最终曝光形成这一闭环,才有可能持续扩大优质供给的机会,并兼顾首页体验与长期收益。

术语速查

术语 在本文中的含义
品池 按新品、活动、促销等业务规则圈定的一组商品
冷启动 用户或商品缺少历史行为,难以靠协同信号判断偏好
长尾 交互或曝光较少的大量商品,并不等同于低质量商品
Trigger 用来发起 I2I 查表或检索的历史商品
Embedding / ANN 前者是向量表示,后者是高效近邻检索方法
TopN / TopK 本文中前者常指每个 trigger 离线保留的邻居数,后者指每路在线输出的候选数;具体命名以系统为准
CTR / CVR / CTCVR 分别关注曝光到点击、点击到成交、曝光到成交;需统一事件、去重和归因窗口,口径一致时才可相互换算
pCTR / pCVR 模型预测的点击概率 / 点击后转化概率
Recall@K / HitRate@K 前 K 个候选覆盖了多少目标正样本 / 有多少请求至少命中一个目标正样本
NDCG 考虑相关性与排名位置的排序指标,靠前命中高相关商品得分更高
Jaccard 两个候选集合的交集大小除以并集大小,用于衡量重合程度
P95 / P99 延迟 95% / 99% 请求能在该耗时内完成,用于观察慢请求
LTV 用户生命周期价值,关注更长时间尺度的贡献
PoC 概念验证,用小规模实验判断一个新方案是否值得继续投入
UCB / Thompson Sampling 利用不确定性进行探索的两类策略,决定在已知优选项与待验证选项之间怎样分配机会

参考资料

原文与项目经验来源:电商首页推荐场景的多路召回体系搭建。本文保留项目复盘与数值案例,补充解释、示意图和适用边界;文中的实验起点不是行业统一标准。

以下为原文参考资料;算法机制附近另附有一手文档链接。