One Hierarchy, Two Systems: Semantic Product IDs for Discovery-Surface Ranking and Search-Page Query Reformulation
DoorDash 用产品内容 embedding 学习三层 Semantic ID(每层 512 个码),再将 SID 前缀上的用户偏好、商品表现和序列特征接入个性化排序,同时把查询转成商品概念做层级改写。排序离线 MRR@5 相对生产基线提升 6.98%、NDCG@5 提升 6.76%;线上首位加购率提升 8%,搜索滚动深度下降 1.866%。
INSIGHT共享语义层级可以跨商家合并同品行为,缓解 UGC 或商品短文本中的 ID 稀疏,但 SID 只能充当可迁移的语义先验,不能替代业务上下文。工程上应保留精确 item ID、用户行为和场景特征,并按任务分别使用不同层级;同时用类目、库存和可服务性约束过滤改写结果。
1. 问题与动机
这篇工作来自 DoorDash 的跨商家电商场景,核心问题是商品标识和搜索词都在碎片化行为证据。相同或相近的商品会因为商家不同而拥有不同 listing ID:用户在商家 A 买过某个商品,这条行为通常不能直接帮助商家 B 的等价商品排序。反过来,人工 taxonomy 虽然可解释,却常常过粗,不能表达品牌、规格、用途和细粒度偏好。结果是新商家或低频商品缺少可靠的个性化信号。
搜索改写有类似问题。传统方法在 query string 之间统计 session transition,同义词、拼写错误、缩写会被当作不同节点;同一个词在不同 business vertical 中又可能代表不同意图。高频 query 会淹没长尾意图,导致改写结果看似热门但不一定可购买或可推进用户任务。论文因此提出一个统一但不耦合的中间表示:从商品内容学出多层 Semantic ID,让商品、用户历史和 query 都能落到同一个细粒度概念层级上。
论文的关键立场是“共享表示,不共享决策模型”。同一个 Semantic ID 层级被排序和 query reformulation 使用,但两个应用各自组织行为数据、训练目标和 serving 逻辑。这样可以在跨商家合并证据的同时,保留发现流排序与搜索页改写各自的业务上下文。对社区搜索尤其有启发:帖子、作者、主题、实体可以共享一个语义层级,但召回、排序、改写和安全过滤仍需按任务分开。
2. 方法详解
2.1 三层 Semantic ID 的构造
论文先把商品名、品牌、规格等 catalog 字段串成文本 profile,用 gemini-embedding-001 编码为 3,072 维向量。然后采用三阶段 residual-quantization K-means,层数 L=3,每层 K=512 个 centroid。对商品 i,第一层把 embedding 分配到最近的 centroid,减去该 centroid 得到 residual;第二、三层对 residual 重复分配和相减,最终得到 SID s_i=[c_i0,c_i1,c_i2]。深度 1、2、3 分别称为 L1、L2、L3 前缀。
共享前缀的商品被视为同一层级概念,短前缀聚合更宽泛的语义,长前缀表达更具体的商品意图。内在分析显示,L1/L2/L3 的 Gini 分别为 0.472/0.508/0.467,DBI 为 3.934/2.065/0.976,held-out cosine 为 0.957/0.965/0.981。随着前缀变长,簇分离度提高、未见商品的语义一致性增强,而 code usage 的不平衡没有明显恶化。这给跨商家行为共享提供了一个介于精确 listing ID 和粗粒度 taxonomy 之间的中间层。
2.2 个性化发现流排序
发现流排序器是 multi-task、multi-label 神经网络,同时预测 CTR、ATCR(加购)和 CVR(购买)。SID 派生特征分为两类。第一类是 dense aggregate:在 L1、L2、L3 前缀上统计用户的购买频次、购买新近性、消费金额,以及子市场中的曝光、点击、加购、购买和对应率。浅层前缀提供跨商家的统计支持,深层前缀恢复商品意图的细节。
第二类是 sequence features。作者用 SentencePiece 把 SID 三个 code 映射为子词。输入符号表大小为 3×512=1,536;BPE 词表为 2×10^5,embedding 维度 64。候选商品使用自己的 SID token,用户侧取过去 180 天买过的商品,按订单数量排序、以新近性打破平局,再保留高频 token。商品与用户共用 embedding 表,因此排序器可以直接学习“候选 SID 子片段—用户历史语义片段”的交互。
这个设计把两种归纳偏置叠加起来:dense aggregate 直接提供统计证据,减少高基数概念必须从零学习的压力;sequence feature 保留 SID 的顺序和子片段,让模型能学习更复杂的用户—商品组合。精确 listing ID 与 taxonomy 没有被删除,而是与 SID 特征并存,分别负责身份、业务组织和可迁移语义。
2.3 基于 SID 的 query reformulation
query 先按 business vertical 与加购事件落到 SID 概念。一个 query–BV 对至少要有 5 个相关 ATC 事件;若某个 L2 前缀占证据至少 30%,就使用该 L2,否则退回 L1;两层都不满足时保留 raw query,避免无证据的强制映射。session 中相邻 query 不再直接作为字符串边,而是变成 SID 概念之间的 transition,分别在每个 BV 中统计,并用 NPMI 排序。保留边的条件是观测次数至少 5、独立假设下的期望次数至少 1、NPMI 至少 0.1。
同一 L2 前缀内的细粒度改写容易塌成 self-loop,因此作者增加 L2 到 L3 的 hierarchical refinement,用 query-specific ATC 证据或父级流行度挑选子概念。随后让语言模型只负责把内部 SID 概念渲染成用户可读 query,第二阶段删除不可用的 source-target pair,最后按 source query 与 rendered query 的 embedding 相似度排序。serving 端还会检查商家 active assortment,保证建议对应的商品确实可买。
3. 核心技术贡献
第一,论文把 Semantic ID 从生成式检索的 item code 扩展成跨发现任务的 reusable concept layer。它用一套三层语义层级在商家之间搬运行为证据,解决 listing ID 无法共享和 taxonomy 太粗的问题,但不强迫应用共享模型参数。
第二,排序和 query 改写使用不同的任务上下文。排序把前缀当作用户偏好和商品表现的统计 key,并拼进用户序列;改写把前缀当作 query grounding、transition、层级导航和库存过滤的结构节点。这种“共享语义、独立策略”比单一端到端模型更容易嵌入现有多阶段系统。
第三,作者同时用 dense 和 sequence 两类 SID 特征,使语义聚合既有显式统计支持,又有可学习的 token 交互。离线 FC-A 去掉 SID 特征后仍有部分收益,说明同期非 SID 特征也重要;完整 FC 的增益明显更大,证明 SID 派生特征贡献了完整候选的主要离线提升。
第四,论文明确了语义压缩的风险和补救办法。浅层前缀能提升覆盖却可能连接无关行为,深层前缀能恢复 specificity 却可能稀疏;因此排序使用多层特征,改写用 BV 条件、L3 证据和 assortment filter 恢复任务约束,而不是把 SID 当作完整意图表示。
4. 实验结果分析
4.1 语义层级质量
| 前缀层级 | Gini | DBI | held-out cosine |
|---|---|---|---|
| L1 粗粒度 | 0.472 | 3.934 | 0.957 |
| L2 中粒度 | 0.508 | 2.065 | 0.965 |
| L3 细粒度 | 0.467 | 0.976 | 0.981 |
L3 的 DBI 最低、held-out cosine 最高,说明更长的前缀确实更紧凑、更有语义一致性;L1 的 Gini 并没有显著更差,说明粗层聚合没有简单地退化成少数热门桶。
4.2 个性化排序结果与消融
排序离线实验训练 M 天日志、在第 M+1 天评估,并用 CVR head 的 MRR@K/NDCG@K 衡量。K=5 对应发现流无需滚动即可见的 5 个商品。相对生产基线的结果如下:
| 候选配置 | MRR@5 | NDCG@5 |
|---|---|---|
| FC-A:去除所有 SID 特征 | +2.10% | +2.92% |
| FC:包含 SID 特征 | +6.98% | +6.76% |
FC 相比 FC-A 的差额来自 SID 派生特征,说明大部分完整候选收益并非仅由同期非 SID 更新产生。线上 21 天实验将消费者近似均匀分成现有 ranker、完整 feature bundle 和另一个 serving optimization arm;与现有 ranker 相比,完整 ranking treatment 的 subtotal 提升 +0.31%,平均 carousel ATC rate 提升 +5.5%,首位/第二位/第三位商品 ATC 分别提升 +8%/+16%/+6%。同时,首位商品的历史平均流行度下降 18.1%,首位 blockbuster 曝光占比下降 2.1 个百分点,说明 engagement 提升并没有依赖进一步集中在头部商品。
4.3 改写质量与线上搜索效率
在意图保持实验中,taxonomy 把 18.8% 的 intent-changing transition 压成同一概念,SID 只压缩 10.9%。人工标注集包含 200 个 query pairs,LLM judge 与人工对 usefulness 的一致率为 80%,完全一致率为 78%。rank-one judged quality 从 raw query-string graph 的 0.522 提升到 SID graph 的 0.734。
线上相对无改写 control,purchase MRR 提升 +0.558%,95% CI 为 [+0.294%, +0.823%];ATC position 下降 1.571%,95% CI 为 [-2.159%, -0.982%];search scroll depth 下降 1.866%,95% CI 为 [-2.262%, -1.470%]。这些指标共同说明用户更早触达可购买商品,且搜索努力更少。
4.4 失败模式与实验解释
论文没有把线上 ranking treatment 的所有收益都归给 SID,因为 bundle 同时包含同期 non-SID 更新;作者借助 FC/FC-A 离线消融和事后分析推断 SID 贡献主要部分。定性分析还发现量化边界会把本来可互换的商品分到不同 code,过宽前缀会形成高连接度 hub,query grounding 可能捕捉最终加购概念而不是原始查询意图。这些问题解释了为什么需要多层聚合、BV 条件和库存过滤。
5. 局限与未来方向
作者在定性分析和实验解释中明确给出几类边界。首先,Semantic ID 是语义压缩,量化边界可能把相近替代品分开,同一前缀内部也可能混入对具体用户而言属性不同的商品。其次,过宽的 prefix 会成为高阶 hub,在 query transition 中传播不相关建议;商品 grounding 还可能把“用户最后买了什么”误当作“用户最初想找什么”。第三,线上 ranking 实验的 feature bundle 同时含有非 SID 更新,因此不能从线上结果单独识别 SID 的因果增益。第四,改写依赖商家 active assortment 和 BV 内足够的 ATC 事件,低流量、冷启动和无库存场景仍要回退 raw query 或其他策略。
论文还只展示了 DoorDash 自身的生产规模研究,并未证明三层、512 code、180 天历史等设置适合其他品类或内容社区。未来可以研究动态 SID 更新、对新 item 的增量量化、跨语言/跨市场语义层级,以及在隐私约束下共享用户兴趣而不暴露原始行为。对社区搜索,还需要验证作者、主题、实体和帖子生命周期的语义层级是否比商品内容更稳定。
6. 工业实践意义
在社区搜索或推荐中,可以先把帖子标题、正文短文本、作者、话题和实体编码成多层语义 ID,按“主题—子主题—实体/事件”形成粗到细的概念层级。第一阶段只将 SID 前缀作为离线聚合 key:统计用户在不同主题、实体、作者簇上的点击、停留、收藏和负反馈,观察跨内容类型合并行为后 nDCG@5、CTR 和冷启动覆盖是否改善。这样不需要重写整个 ranker,也能验证语义层级是否比现有 taxonomy 更能转移行为证据。
第二阶段可把 SID token 加入序列特征。对候选帖子和用户历史分别保留 exact ID 与 SID 子词,使用共享 embedding 学习“候选主题片段—用户兴趣片段”的交互;历史应使用多个时间窗口,类似论文的 180 天窗口,但社区内容需要额外加入新鲜度和事件衰减。第三阶段再接入 query reformulation:查询先落到主题/实体概念,再在 session 中统计概念跳转,最后由语言模型负责可读化,不让 LLM 自由生成没有库存、没有证据或违反安全规则的建议。
上线时必须保留任务特有的约束。排序需要用户、候选、作者质量、内容安全和时效性;改写需要查询意图、可检索内容、敏感词和当前库存。SID 应被视为可迁移先验,而不是唯一真值。监控面板至少要同时看 nDCG@5、CTR、首位/中腰部曝光、query reformulation success、滚动深度和负反馈;特别要关注热门前缀是否变成新的信息茧房。若线上 bundle 含有多个非 SID 改动,应同步保留 SID-only 的离线消融或分层实验,否则很难知道投入到底来自语义表示、排序特征还是其他策略。