面灵AI→

B站推荐算法一面:生成式召回与SID编码13问

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

  1. 构建 SID 编码体系时,引入曝光容量约束的具体实现方式是什么?
  2. 增加曝光约束后会增大量化误差,如何平衡业务约束与量化精度的 Trade-off?
  3. 是否统计过 SID 编码的碰撞率?工程中如何缓解和解决编码碰撞问题?
  4. 模型 SFT 微调采用何种训练方案?LoRA 微调的核心优势是什么?
  5. 生成式召回任务中,SFT 训练数据集的构造逻辑与筛选标准是什么?
  6. 用户行为序列长度差异悬殊如何处理?针对无历史行为的冷启动新用户,有哪些解决思路?
  7. 生成式召回天然存在推理延迟高的问题,项目中从哪些维度做了降延迟优化?
  8. 简述主流的经典召回模型架构及适用场景。
  9. 双塔向量召回模型存在哪些固有缺陷?重点分析长尾物品表征学习不足的问题。
  10. 不依赖生成式方案,仅从双塔模型结构本身优化,如何提升长尾 Item 的表征质量?
  11. 简述双塔模型 Pointwise、Pairwise、Listwise 三种训练范式的区别,以及对应的损失函数。
  12. InfoNCE 损失中温度系数的核心作用与设计意义是什么?
  13. 结合 B站推荐体验,分析其推荐系统现存问题;从召回、精排、重排全链路说明优化多样性的具体方案。

《参考解析》

曝光容量约束下的 SID 编码:语义 ID(SID)一般由 RQ-VAE 或层次化聚类在 item 的语义 embedding 上逐级量化得到——第一级给出粗簇,后面几级逐级细分,最终每个 item 得到一串离散码。加入曝光容量约束,就是把「单个码字可承载的曝光量/占比」当作量化时的容量上限,思路类似带负载均衡的 K-means:先按曝光量分桶,限制每个簇的曝光份额,避免极少数热门 item 挤进同一码字造成码本分布极度倾斜。工程上常有两种落法:一是每级量化时加软容量惩罚项(超容量即惩罚,不硬截断);二是只在前 1~2 级保持纯语义划分、末级再施加容量约束,把长尾 item 合并到共享码。

业务约束与量化精度的 Trade-off:容量约束越紧,簇形状越偏离语义上的最优划分,量化误差(重构损失变大、码本利用率下降、碰撞率上升)就越大。可用的权衡手段:把约束写成软惩罚并按线上指标(Recall@K、多样性、生成序列的合法率)调权重,而不是一次性调死;用多套码本加残差量化,把误差摊到后几级;对头部 item 单独放码、尾部共享码,让「精度损失」只发生在本来就不需要精细区分的长尾上。核心是把这题讲成「约束怎么软化 + 用什么指标验证」,而不是只答「加个惩罚项」。

SID 碰撞率怎么统计与缓解:统计口径至少两个——整体碰撞率 1 − 唯一 SID 数 / item 总数,以及按曝光加权的碰撞率(热门 item 是否撞在一起,这才真正影响效果)。缓解手段:加大码本或增加量化层数(末级给更大的码本);对高频 item 做独占码;碰撞组内再用 item id 后缀或哈希做二次区分,让生成式召回退化成「小候选集内再排序」;最后是接受碰撞,但通过训练让语义相近的 item 更容易撞在一起,这样即便召回错也不算太离谱。

InfoNCE 里的温度系数 τ:损失形如 −log( exp(s+ / τ) / Σ exp(si / τ) )。τ 越小,softmax 分布越尖锐,正样本要与最难的负样本拉开足够差距才能降损,梯度集中在困难样本上,表征更均匀、区分度更高,但对噪声标签敏感、训练容易不稳;τ 越大分布越平滑,学习信号被摊薄,表征趋于平均。它实际控制的是「负样本惩罚强度/分布锐度」,通常做成可学习参数(CLIP 式 logit scale),取值多在 0.05~0.2 之间。

双塔的三个训练范式:Pointwise 把每个 (user, item) 当独立样本做二分类/回归,损失是 BCE 或 MSE,实现简单但只看单点、不建模相对序;Pairwise 用 (正样本, 负样本) 对,损失是 hinge 或 BPR 形式的 −log σ(s+ − s−),直接优化相对序,是召回的主力;Listwise 对一整条候选列表做 softmax(softmax cross-entropy / ListNet,或 LambdaRank 的 λ 梯度),最贴近排序目标但计算量最大。工业界双塔召回普遍用 sampled softmax / in-batch negative,本质是 listwise 的高效近似——这题答到这里才算完整。

双塔的固有缺陷与长尾表征:因为 user 塔与 item 塔在打分时才交互(只做内积),模型无法建模 user-item 的细粒度交叉特征,表达上限低于交叉塔;同时热门 item 在训练中被高频采样,长尾 item 的 embedding 更新次数少、梯度信号弱,加上内积空间里长尾向量容易挤在原点附近,导致长尾召回几乎为 0。仅从双塔结构本身优化可以:① 负采样策略上做文章( popularity 校正、hard negative 挖掘、对长尾过采样);② 损失上做去偏(逆倾向加权 IPW、因果/去流行度偏差);③ 结构上加辅助任务(item 内容/多模态特征重建、类目预测)让长尾获得额外梯度;④ 表示上做归一化与角度间隔(cosine + margin),避免长尾向量被压到原点;⑤ 用多兴趣/多向量表示给长尾更多「落点」。冷启动与稀疏场景还可以引入内容侧双塔,让新 item 先靠内容特征获得召回。

序列长度与冷启动:序列长度悬殊,训练时用截断 + padding/mask,并按长度分桶采样避免长序列主导梯度;建模上可以用多尺度聚合(最近 N 个短期兴趣 + 长期兴趣分桶),配合 attention 池化让短序列不至于欠拟合。冷启动新用户:先用热门、地域、时段、设备等先验兜底,再用内容侧属性(类目、文本、封面多模态 embedding)做召回,配合探索流量(ε-greedy、Thompson sampling)快速收集反馈;新 item 侧对称地用内容塔映射到同一空间。

生成式召回的降延迟:① 解码侧优化:缩小 beam size、用前缀树约束只生成合法 SID、限制生成长度、投机解码;② 模型侧优化:量化(INT8/FP8)、KV cache 复用与批处理、蒸馏一个更小的生成模型;③ 架构侧优化:两段式(先粗生成少量候选再用向量检索补足)、生成与检索并行、热点请求缓存;④ 兜底:给生成设超时,超时直接退回双塔召回,保证 P99 不炸。

关于「结合 B站推荐体验谈多样性」:这题是开放题,回答结构建议是「现象 → 归因 → 全链路方案」。现象可以讲同质化(连刷多个同类视频)、信息茧房、新分区/新 UP 主难以获得曝光。归因从目标函数(点击/时长目标天然偏向头部与强兴趣)、召回源单一、精排分数集中、重排缺少打散约束几个层面说。方案按链路走:召回层扩源(内容召回、跨域召回、长尾专项);精排层做多目标融合与校准(时长/互动/负反馈分开建模,避免单一目标主导);重排层做多样性约束(DPP、MMR、类目/UP 主打散、滑动窗口去重)。最后补一句评测方式:除了 CTR/时长,要单独看多样性指标(类目熵、覆盖率、长尾曝光占比)和用户负反馈率,否则优化会被单一目标带偏。