← 论文沉淀 / 🎯 生成式推荐 · ·RecSys 2026

CoSID: Concept-Conditioned Semantic-ID Decoding for Efficient Generative Recommendation

Danil Gusak, Anna Volodkevich, Evgeny Frolov (3 人)

SB AI Lab × AI Center × HSE University

把生成式推荐里两件事拆开:骨干网络的容量用来预判下一个物品,而不是用来逐位拼写它的 SID。CoSID 让骨干只读一次历史(每个物品的 K 个码组合成 1 个 token),把末状态投影成一个紧凑的 next-item concept z;之后整个 trie 约束 beam search 都交给一个 2 层、约 7M 参数的 KV-cached 轻量解码器,并用 Composed-AR 教师初始化 + CE + 分层 KD 训练。四个 Amazon 数据集上精度持平或更高,beam 100 吞吐 6.1–6.2 倍、beam 1000 吞吐 7.3 倍,且吞吐基本不随骨干加深而下降。

Concept Bottleneck DecodingLightweight SID DecoderBeam Search EfficiencyTeacher-Initialized DistillationCacheable User State
📝 我的备注
加载中…

核心思路

生成式推荐用语义 ID(SID)表示物品,按码逐位自回归解码,再用目录 trie 约束 beam search 召回。问题出在推理开销上:beam 里每个活跃前缀的每一步都要过一遍完整骨干,增量骨干 token 评估量是 O(BK)(B 为 beam 宽,K 为 SID 深度)。Composed-AR 这类做法把一个物品的 K 个码嵌入合成一个输入 token,只解决了输入侧的长度膨胀(TK -> T),输出侧的 O(BK) 一点没少。

CoSID 的判断是:骨干容量该用来预判下一个物品,不该用来逐位拼写它的码。 所以把两件事拆开:

  • 骨干只读一次历史,把末状态投影成一个紧凑的 next-item concept z;
  • 一个 2 层、约 7M 参数、带 KV cache 的轻量解码器以 z 为条件,跑完整个 trie 约束 beam search。

z 是两段之间唯一的接口,解码器不回看历史,也不保留骨干的 KV cache。这样骨干的计算量只和历史长度 T 有关,和 beam 宽无关。z 在 bf16 下每个用户 1 KiB,可以预计算、缓存,并独立于请求流量刷新。

整体实现思路

论文对比了三种生成接口(Figure 1):

接口历史输入解码循环骨干 token 评估
SID-AR(TIGER 式)T×K 个码 tokenO(BK) 步全骨干TK + O(BK)
Composed-ART 个组合物品 token(K 个码学习式合并为 1 个)O(BK) 步全骨干T + O(BK)
CoSIDT 个组合物品 tokenO(BK) 步轻量解码器只有 T

流程如下:

  1. 训练 Composed-AR 教师:骨干读组合后的历史,自回归解码目标 SID,按验证 NDCG@10 早停。
  2. 用教师初始化学生的骨干和组合层;轻量解码器的 SID 嵌入和输出头用教师权重的维度匹配投影初始化,Transformer block 随机初始化。
  3. 用 CE + 分层 KD 联合训练学生。
  4. 推理时骨干 prefill 一次得到 z(服务上可缓存),轻量解码器在 trie 掩码下做 top-B beam search,输出 top-B 个 SID 序列。

子模块实现(可复现细节)

SID 构造

  • 物品表示用 E5 文本嵌入。
  • RQ-KMeans 残差量化:4 层码本,每层 2048 路;BPC-23 用 6 层。
  • 冲突用基于流行度的方式解决。
  • 所有合法 SID 序列组成目录 trie,生成时用于约束。

分解形式为 p(i_{T+1} | H) = ∏_{k=1..K} p(c^k | c^{<k}, H)。

骨干与组合层

  • 骨干是 8 层 decoder,结构沿用 Qwen2(深度扩展实验里取 2 到 8 层)。
  • 每个历史物品的 K 个码嵌入经学习式组合层(沿用 GenRec 的做法)合并为一个 token;历史最多 20 个物品。
  • 取末位置隐状态 h_T,经投影 g 得到 concept z = g(h_T)。bf16 下每用户 1 KiB(不含索引和元数据)。按 2 字节每维换算是 512 维(推断)。

轻量 concept 解码器

  • 2 层 Transformer,约 7M 参数,标准 KV cache。
  • 条件分布 p_θ(i_{T+1} | H) = ∏_k p_θ(c^k | c^{<k}, z)。
  • 只以 z 为条件,不 attend 历史,也不持有骨干 cache;z 如何注入解码器(作为前缀 token 还是其它方式)文中没有细说。
  • 使用与基线相同的目录 trie 掩码和 top-B 选择。

训练目标

L = α · Σ_k −log p_θ(c_k | c_{<k}, z) + λ · Σ_k τ² · KL(q_τ^(k) ‖ p_θ,τ^(k))

  • q^(k) 是教师在第 k 层的码分布,τ 是蒸馏温度;
  • 两项都只在 trie 合法码上计算;
  • CE 锚定真实行为;KD 传递教师对合法候选码的相对偏好。从头只用 CE 训练时,每层只能看到 one-hot 目标,学不到候选之间的相对排序。
  • α、λ、τ 的具体值文中未给出。

CoSID_flat 对照

把相同的解码器和训练配方套到 flat SID-AR 骨干上(教师换成 SID-AR),用来区分“输入组合”和“concept 解码”各自的贡献。

训练与评测设置

  • 优化器 Adam,按验证 NDCG@10 早停;结果取 5 个种子的均值和标准差。
  • 推理 beam 100,大预算实验用 beam 1000。
  • 吞吐为单卡 H100、bf16、端到端测量:先预热 50 个 batch,再测 200 个 batch,每种方法用能放下的最大 batch。CoSID 的吞吐包含在线计算 concept 的时间,如果改用缓存的 concept,差距还会更大。

实验设置与结果

数据:Amazon-2014 Beauty、Sports、Toys;Amazon Reviews 2023 的 Beauty and Personal Care(BPC-23,约 696K 用户、181K 物品、6.2M 交互)。评论视为隐式反馈,做 5-core 过滤。采用两段式全局时间切分:时间轴最后 10% 为测试集,剩余部分的最后 10% 为验证集;每个用户在留出期内的最后一次交互作为目标,之前的事件作为输入。不过滤已交互物品(生产中这一步在召回之后做)。指标为 N@10/100、R@10/100、Coverage@100、Gini@100。

主结果(Table 1,8 层骨干,beam 100,节选均值)

数据方法N@10R@10N@100R@100Cov@100↑Gini@100↓users/s加速
BeautySID-AR0.01040.02030.02500.09810.87870.7216510×0.9
BeautyComposed-AR0.01450.02730.02920.10320.95890.6634538–
BeautyCoSID_flat0.01320.02390.02790.10080.93520.64672803×5.2
BeautyCoSID0.01590.02810.03080.10560.96780.64303357×6.2
SportsSID-AR0.00720.01470.01920.07910.58990.8843510×0.9
SportsComposed-AR0.01220.02380.02740.10310.70930.8518538–
SportsCoSID0.01430.02710.03050.11160.77490.82563357×6.2
ToysSID-AR0.01990.03490.03660.12250.88290.7172510×0.9
ToysComposed-AR0.02320.04070.04000.12690.95110.6395538–
ToysCoSID0.02560.04460.04360.13720.93150.66273357×6.2
BPC-23SID-AR0.00260.00530.00920.04060.07060.9936304×0.9
BPC-23Composed-AR0.01190.02230.02370.08250.20520.9807321–
BPC-23CoSID_flat0.01200.02280.02430.08570.20050.97901428×4.5
BPC-23CoSID0.01270.02380.02520.08790.21670.97931954×6.1

要点:

  • CoSID 在所有数据集的每个精度指标上均值最高,NDCG@10 比教师高 7–17%(Sports 0.0122→0.0143 最明显)。
  • Coverage 和 Gini 在 Beauty、Sports、BPC-23 上改善;在 Toys 上两项都略差。
  • 输入组合本身就很关键:BPC-23 上 flat SID-AR 只有 0.0026,Composed-AR 有 0.0119。CoSID_flat 从退化的 flat 骨干恢复到 0.0120,说明 concept 解码本身也有贡献。
  • SID-AR_match(截断历史以匹配 token 预算)各项都与 SID-AR 接近或更差。

骨干深度扩展(Figure 2,BPC-23,beam 100)

骨干层数Composed-AR users/sCoSID users/s加速
22650≈2000CoSID 更慢(解码器开销占主导)
4–≈2000×2.0
8321≈2000(表 1 为 1954)×6.1

各个深度下,CoSID 的精度都不低于 Composed-AR。

大候选预算(Table 2,BPC-23,8 层,beam 1000)

方法N@10N@100N@1000R@1000users/s加速
Composed-AR0.01240.02530.04580.262329–
CoSID0.01280.02600.04680.2681212×7.3

beam 1000 时,Composed-AR 每个请求要让上千个增量码前缀位置过一遍骨干,而 CoSID 的骨干只做长度 20 的历史 prefill。

训练配方消融(Figure 3,Toys,验证 NDCG@10)

  • init + CE + KD(完整配方):收敛最快,最终值最高。
  • CE + KD,不初始化:需要约 5 倍步数,收敛值更低。
  • init + CE,无 KD:从教师水平起步,之后逐渐下降。
  • KD only(约 5.7 倍步数)与 CE only:更差。
  • 作者也说明,在其它配置下教师初始化不总是有益,不初始化的 CE+KD 有时持平甚至更好。

思考与可参考价值

它解决了什么:在召回场景,beam 宽常常几百到上千,骨干也在不断加大,这时 SID 生成式召回的瓶颈在“每个 beam 前缀都要过一遍骨干”。CoSID 只用一个定长向量接口,就把这个循环整体搬到 7M 参数的小解码器里,吞吐基本不再随骨干深度变化。这个架构上的拆分简单直接,而且不改 SID、trie 和 beam search 本身,替换成本低。

和工业形态的契合:z 是每用户 1 KiB 的向量,天然对应“近线用户塔产出用户状态 + 在线轻量生成”的部署方式。在线只需要跑小解码器,重骨干可以按行为触发或定时刷新(推断:实时性取决于刷新策略,论文没有给出线上验证)。

需要警惕的地方:

  1. 单向量瓶颈:实验里最大目录只有 18 万物品,历史只有 20。在百万到亿级的电商目录、多品类兴趣下,一个 z 是否装得下多峰意图,需要自己验证。可以考虑多个 concept token,或者让解码器以少量前缀 token 为条件(推断)。
  2. 精度提升的来源:学生在教师早停点之后又用 CE+KD 继续训练,所以和教师的比较不完全等算力。BPC-23 上 0.0127 对 0.0119 的差距接近标准差范围(±.0006 / ±.0010)。
  3. 超参与消融不全:α、λ、τ、z 的维度、解码器宽度和层数都没有扫描;消融只在 Toys 上做了一组曲线,而且作者承认结论不普适。
  4. 缺少同类加速基线:没有和 RPG 这类并行长 SID 生成、投机解码、beam 剪枝等方案对比。
  5. 多样性:Toys 上覆盖率下降、Gini 上升,beam 1000 下的类目和商家多样性也没有分析。

落地前建议核验:

  • 在自有目录规模和 SID 深度下,比较不同解码器大小(2 层/7M 是否够用)的精度与吞吐曲线;
  • concept 缓存的过期时间对次日和当日行为命中的影响;
  • 只在 trie 合法码上算的分层 KD 是否同样适用于自己的教师(比如带 think 块或 PTR 结构的模型);
  • 在高 beam 宽下和现有 Composed-AR/全骨干解码做等算力对比,同时记录覆盖率和多样性。

一句话:这是一篇思路干净的 4 页短文,“骨干负责理解、小解码器负责拼码”的分工值得在大 beam 召回上试,但规模和消融都偏轻,工业上能不能直接用要自己做实验确认。