CoSID: Concept-Conditioned Semantic-ID Decoding for Efficient Generative Recommendation
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 倍,且吞吐基本不随骨干加深而下降。
核心思路
生成式推荐用语义 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 个码 token | O(BK) 步全骨干 | TK + O(BK) |
| Composed-AR | T 个组合物品 token(K 个码学习式合并为 1 个) | O(BK) 步全骨干 | T + O(BK) |
| CoSID | T 个组合物品 token | O(BK) 步轻量解码器 | 只有 T |
流程如下:
- 训练 Composed-AR 教师:骨干读组合后的历史,自回归解码目标 SID,按验证 NDCG@10 早停。
- 用教师初始化学生的骨干和组合层;轻量解码器的 SID 嵌入和输出头用教师权重的维度匹配投影初始化,Transformer block 随机初始化。
- 用 CE + 分层 KD 联合训练学生。
- 推理时骨干 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@10 | R@10 | N@100 | R@100 | Cov@100↑ | Gini@100↓ | users/s | 加速 |
|---|---|---|---|---|---|---|---|---|---|
| Beauty | SID-AR | 0.0104 | 0.0203 | 0.0250 | 0.0981 | 0.8787 | 0.7216 | 510 | ×0.9 |
| Beauty | Composed-AR | 0.0145 | 0.0273 | 0.0292 | 0.1032 | 0.9589 | 0.6634 | 538 | – |
| Beauty | CoSID_flat | 0.0132 | 0.0239 | 0.0279 | 0.1008 | 0.9352 | 0.6467 | 2803 | ×5.2 |
| Beauty | CoSID | 0.0159 | 0.0281 | 0.0308 | 0.1056 | 0.9678 | 0.6430 | 3357 | ×6.2 |
| Sports | SID-AR | 0.0072 | 0.0147 | 0.0192 | 0.0791 | 0.5899 | 0.8843 | 510 | ×0.9 |
| Sports | Composed-AR | 0.0122 | 0.0238 | 0.0274 | 0.1031 | 0.7093 | 0.8518 | 538 | – |
| Sports | CoSID | 0.0143 | 0.0271 | 0.0305 | 0.1116 | 0.7749 | 0.8256 | 3357 | ×6.2 |
| Toys | SID-AR | 0.0199 | 0.0349 | 0.0366 | 0.1225 | 0.8829 | 0.7172 | 510 | ×0.9 |
| Toys | Composed-AR | 0.0232 | 0.0407 | 0.0400 | 0.1269 | 0.9511 | 0.6395 | 538 | – |
| Toys | CoSID | 0.0256 | 0.0446 | 0.0436 | 0.1372 | 0.9315 | 0.6627 | 3357 | ×6.2 |
| BPC-23 | SID-AR | 0.0026 | 0.0053 | 0.0092 | 0.0406 | 0.0706 | 0.9936 | 304 | ×0.9 |
| BPC-23 | Composed-AR | 0.0119 | 0.0223 | 0.0237 | 0.0825 | 0.2052 | 0.9807 | 321 | – |
| BPC-23 | CoSID_flat | 0.0120 | 0.0228 | 0.0243 | 0.0857 | 0.2005 | 0.9790 | 1428 | ×4.5 |
| BPC-23 | CoSID | 0.0127 | 0.0238 | 0.0252 | 0.0879 | 0.2167 | 0.9793 | 1954 | ×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/s | CoSID users/s | 加速 |
|---|---|---|---|
| 2 | 2650 | ≈2000 | CoSID 更慢(解码器开销占主导) |
| 4 | – | ≈2000 | ×2.0 |
| 8 | 321 | ≈2000(表 1 为 1954) | ×6.1 |
各个深度下,CoSID 的精度都不低于 Composed-AR。
大候选预算(Table 2,BPC-23,8 层,beam 1000)
| 方法 | N@10 | N@100 | N@1000 | R@1000 | users/s | 加速 |
|---|---|---|---|---|---|---|
| Composed-AR | 0.0124 | 0.0253 | 0.0458 | 0.2623 | 29 | – |
| CoSID | 0.0128 | 0.0260 | 0.0468 | 0.2681 | 212 | ×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 的向量,天然对应“近线用户塔产出用户状态 + 在线轻量生成”的部署方式。在线只需要跑小解码器,重骨干可以按行为触发或定时刷新(推断:实时性取决于刷新策略,论文没有给出线上验证)。
需要警惕的地方:
- 单向量瓶颈:实验里最大目录只有 18 万物品,历史只有 20。在百万到亿级的电商目录、多品类兴趣下,一个 z 是否装得下多峰意图,需要自己验证。可以考虑多个 concept token,或者让解码器以少量前缀 token 为条件(推断)。
- 精度提升的来源:学生在教师早停点之后又用 CE+KD 继续训练,所以和教师的比较不完全等算力。BPC-23 上 0.0127 对 0.0119 的差距接近标准差范围(±.0006 / ±.0010)。
- 超参与消融不全:α、λ、τ、z 的维度、解码器宽度和层数都没有扫描;消融只在 Toys 上做了一组曲线,而且作者承认结论不普适。
- 缺少同类加速基线:没有和 RPG 这类并行长 SID 生成、投机解码、beam 剪枝等方案对比。
- 多样性:Toys 上覆盖率下降、Gini 上升,beam 1000 下的类目和商家多样性也没有分析。
落地前建议核验:
- 在自有目录规模和 SID 深度下,比较不同解码器大小(2 层/7M 是否够用)的精度与吞吐曲线;
- concept 缓存的过期时间对次日和当日行为命中的影响;
- 只在 trie 合法码上算的分层 KD 是否同样适用于自己的教师(比如带 think 块或 PTR 结构的模型);
- 在高 beam 宽下和现有 Composed-AR/全骨干解码做等算力对比,同时记录覆盖率和多样性。
一句话:这是一篇思路干净的 4 页短文,“骨干负责理解、小解码器负责拼码”的分工值得在大 beam 召回上试,但规模和消融都偏轻,工业上能不能直接用要自己做实验确认。