B站推荐算法一面:生成式召回与SID编码13问
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 构建 SID 编码体系时,引入曝光容量约束的具体实现方式是什么?
- 增加曝光约束后会增大量化误差,如何平衡业务约束与量化精度的 Trade-off?
- 是否统计过 SID 编码的碰撞率?工程中如何缓解和解决编码碰撞问题?
- 模型 SFT 微调采用何种训练方案?LoRA 微调的核心优势是什么?
- 生成式召回任务中,SFT 训练数据集的构造逻辑与筛选标准是什么?
- 用户行为序列长度差异悬殊如何处理?针对无历史行为的冷启动新用户,有哪些解决思路?
- 生成式召回天然存在推理延迟高的问题,项目中从哪些维度做了降延迟优化?
- 简述主流的经典召回模型架构及适用场景。
- 双塔向量召回模型存在哪些固有缺陷?重点分析长尾物品表征学习不足的问题。
- 不依赖生成式方案,仅从双塔模型结构本身优化,如何提升长尾 Item 的表征质量?
- 简述双塔模型 Pointwise、Pairwise、Listwise 三种训练范式的区别,以及对应的损失函数。
- InfoNCE 损失中温度系数的核心作用与设计意义是什么?
- 结合 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/时长,要单独看多样性指标(类目熵、覆盖率、长尾曝光占比)和用户负反馈率,否则优化会被单一目标带偏。