Guiding the coarse levels of semantic IDs makes the fine levels learnable
Bin Wang, Zhengyu Zhang
cs.IR, cs.CL, cs.LG
2026-09-03
Meta 把生成式推荐 SID 最粗层强制编码为国家属性,端到端 A/B 中 recall@10 提升 1.39 倍、MRR 涨 37%。
生成式推荐把每个物品表示成一串离散编码,即 Semantic ID(SID),由 RQ-VAE 对物品内容向量做残差量化产生,再训练一个语言模型自回归地生成目标物品的 SID,取代传统的向量点积检索。这套范式有个结构性弱点:SID 是从粗到细逐层生成的,最粗的第一层编码(c0)一旦生成错,后面所有层都会跟着错,但标准 RQ-VAE 里 c0 只是嵌入空间里一次任意的几何切分,没有语义身份,模型必须凭用户历史去猜一个自己都不知道含义的区域。更深层的问题是双重错位:量化器独立训练来重建嵌入,产出的编码既不对齐下游 LLM(进词表后是不透明 token),也不对齐最终任务。此前的补救办法要么在消费端用对齐语料、强化学习或专门的逐 token 编码器让 LLM 看懂编码,要么在量化器端把任务目标反传进量化器,或监督各层去预测一套学出来的标签体系,但恢复出来的含义终究是内容驱动的,不一定是任务真正需要的含义。
Guided SID 直接把最粗的一层或两层(论文主实验用 G={0})的编码指定成一个预先选好的属性标签,比如广告投放国家,而不是让它照常做最近邻搜索。量化时直接用属性标签覆盖索引选择,码本本身仍然可学习,依然通过直通估计器接收重建梯度。这样被指定的那一层编码 100% 准确,因为索引是强制赋值的,人类可读,而且因为这个属性同时出现在 prompt 里,模型看到「United States」就能直接查表输出对应编码,粗层预测从推理变成了查找。
真正让这个方法可行的是配套的 trie-merge 码本构造:把任意高基数或集合值的属性值编码成一棵前缀树的路径,兄弟节点共享前缀,国家用按流行度排序的编码集合,内容分类直接用类目路径,然后自底向上反复合并当前最小的两个兄弟节点,直到叶子数压到目标码本大小 K。这保证了合并只发生在最相似的值之间,比如相邻小国合并成一个桶,而不是像取 top-K 加一个大杂烩那样把长尾一股脑塞进一个没有意义的兜底编码。
在 44 亿条广告的工业语料上,用国家作为指定属性、L=6 层 K=256 码本,固定第 0 层做实验:
| 指标 | Guided | Vanilla(均匀基线) | Prepended | 提升倍数 |
| recall@1 | 0.0166 | 0.0122 | 0.0076 | 1.36× |
| recall@10 | 0.0890 | 0.0639 | 0.0510 | 1.39× |
| MRR | 0.0355 | 0.0260 | 0.0184 | 1.37× |
| 属性命中率@1 | 0.1770 | 0.0422 | 0.1618 | 4.19× |
指定粗层编码不但没有损害量化质量,重建距离反而比基线低 27%,尽管第 0 层被挪用去编码一个和重建无关的信号。对照实验更能说明问题:把同一个属性以额外前置 token 的方式塞进序列、内容编码本身不动的第三种方案(Prepended),几乎拿不到上面的提升,部分指标甚至不如均匀基线。这说明收益来自重构粗层编码本身,不只是给模型多喂了一点上下文信息。此外,没有被直接监督的细层编码(c1 到 c5)也普遍变得更容易生成,在全部 24 个位置-k 组合上都领先基线 1.4 到 1.5 倍,只是这个幅度远小于粗层本身 4.19 倍的提升。
这篇论文给生成式检索系统提供了一个几乎零成本的粗层设计:只要有一个和内容相关、能写进 prompt 里的分类属性,比如投放国家、语言、类目,就可以把它直接烧进最容易出错、也最容易拖累后续所有层的第一个编码位置,换来更高的检索命中率和一个可解释、可用于按属性约束解码的编码结构。trie-merge 构造把这个思路从只能用于低基数属性扩展到了真实工业场景里普遍存在的高基数、集合值属性,是方法能落地的关键部分。对已经在用 RQ-VAE 加自回归生成做推荐或广告检索的团队,这是一个可以直接嫁接到现有量化器上的改动,不需要为消费端 LLM 重新准备对齐语料。
论文只在一个属性(国家)上做了端到端实验,而这个属性的码本分布严重头部化,最大的桶占了 22.1% 的广告,前十大桶占 63.6%,一个占五分之一语料的编码携带的信息量其实很有限。国家和内容的关系也是间接的:广告主按市场定制素材,所以投放国家能间接反映内容,但不是内容本身,论文自己承认一个直接内容相关、分布更均匀的属性可能效果更好,但没有测试。指定层级也只试了单层(G={0}),多层指定,比如国家到类目到子类目这种更复杂的层级设计完全没有验证。训练只做到有监督微调阶段,没有测试指定编码在强化学习阶段或真实上线服务中的表现。