字节 Agent 开发后端日常实习一面:RAG 检索与评测深挖
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 先整体介绍项目,为什么选 LangGraph?工作流是怎样的?
- 项目中的评测数据集是怎么构造的?
- 数据主要由 AI 生成,如何保证数据集质量和覆盖度?
- 如何保证 Agent 能在这些数据上更好地回答问题?
- 用户问题比较口语化、有错别字或意图不明确时,如何处理?
- 知识库如何构建?Markdown、TXT、PDF 分别怎么切块?
- 为什么同时使用 BM25 和向量检索?两者各自适合什么问题?
- 两路召回结果如何融合?
- RRF 的原理是什么?为什么不直接融合两种检索的原始分数?
- 粗排后为什么还要使用 Cross-Encoder 重排?
- Cross-Encoder 为什么会比向量相似度更准确?
- 直接使用预训练 Cross-Encoder,训练目标和你的业务场景并不一致,如何保证效果?
- 简历里写了多种检索方式,分别是什么,为什么需要这么多种?
- 这个项目和上一个项目除了技术栈不同,还有什么本质区别?
- 做这个项目最大的收获是什么?
- 项目里遇到的最大困难是什么,怎么解决?
- 评测体系里有很多指标,哪个指标最能衡量系统是否达成目标?
- 手撕算法:一道偏简单的贪心题。
《参考解析》
RRF 以及为什么不直接融合原始分数:RRF(Reciprocal Rank Fusion)对每一路召回结果只取排名,按 score(d) = Σ 1 / (k + rank_i(d)) 累加,通常取 k = 60,最后按总分重排。它之所以好用,是因为不同检索器的分数没有可比性:BM25 是词频与逆文档频率算出的无界正数,受文档长度和词项分布影响;向量检索给的是余弦相似度或内积,落在固定区间且分布完全不同。直接加权求和必须先做归一化(min-max、z-score 或概率化),而归一化对每路的分数分布极其敏感,换一批 query 分布一变,权重就得重调。RRF 只依赖排名,天然免归一化、对异常分数稳健、两路权重也近似对称,实现只要几行。代价是丢失了分数的幅度信息——「第一名远超第二名」和「险胜」在 RRF 里等价,所以更精细的做法是 RRF 打底、再叠一路学习到的融合模型(把各路分数、排名、文档特征一起喂给 LTR)。面试里补一句「k 的作用是压制头部差异、让中段排名也有贡献」会很加分。
Cross-Encoder 为什么会更准,以及预训练模型与业务不一致怎么办:向量检索用的双塔结构里,query 和文档各自独立编码,只在最后做一次向量比较,交互发生在压缩之后的单个向量上,信息损失不可避免;Cross-Encoder 把 [query, document] 拼成一条序列送进模型,从第一层开始就做 token 级交叉注意力,能捕捉否定、限定、数字与条件的细微差别,所以排序质量显著更高。代价是无法预计算:每个 query 都要和候选文档逐一前向,复杂度与候选数成正比,因此只能放在召回之后的精排段,且要限制候选规模(几十到一两百条)。预训练模型与业务不一致是真实问题,常规解法有四条:一是领域微调,用业务里的 query-正例-难负例三元组建训练集,损失常用 pairwise ranking 或 MarginMSE,难负例从现有检索器的 Top-K 里挖;二是蒸馏,把 Cross-Encoder 的排序结果蒸馏回双塔,让召回阶段也变准;三是提示式使用,不微调时把任务写成明确的判定模板(「这段文档能否回答该问题」)并做分数校准;四是兜底评估,先在业务 golden set 上看它相比现有精排的增益,涨了再上,没涨就说明瓶颈在召回或切块,不在重排。面试官追问「怎么证明有效」时,要给出离线指标(NDCG@10、MRR、Recall@k)与线上指标(答案采纳率、点踩率)的对照。
BM25 与向量检索的分工:BM25 属于稀疏检索,靠精确的词项匹配加 TF-IDF 式加权和文档长度归一化,对术语、型号、代码符号、人名、报错码这类低频但关键的词极其可靠,而且可解释、能给出命中了哪些词;它的短板是同义词与改写——用户问「怎么让模型记住之前聊过的东西」而文档里写的是「多轮对话的上下文管理」,词项对不上就召不回。向量检索是稠密语义匹配,把 query 和文档映射到同一空间比距离,擅长处理口语化、同义改写、跨语言,但会把具体数字和稀有实体模糊掉(「iPhone 15 和 iPhone 16 的区别」可能召回 14 的内容),且对领域外的 embedding 模型效果不稳。所以混合召回是互补而不是叠加噪音:稀疏保精确、稠密保语义,再让融合层决定顺序。工程上还可以加一路「结构化过滤」(按时间、权限、文档类型先筛)和一路「精确串匹配」,命中关键实体时直接提权。评估时最好把两路分开看召回率,确认它们确实覆盖了不同的失败集合,否则混合只是白花算力。
AI 合成评测集的构造与质量控制:AI 生成数据的最大风险是与提示词同源、分布失真——用同一个模型生成的问答往往比真实用户提问更规整、更书面,模型在它上面表现虚高,上线就被真实流量打脸。可控的做法分四层:一是来源分层,合成数据之外必须混入真实来源(脱敏线上日志、客服工单、用户反馈、人工撰写的 golden set),并规定真实数据的最低占比;二是生成时约束,从真实语料反向出题(基于 chunk 生成问题,保证有答案可依),同时显式要求覆盖不同意图、难度、长度与口语化程度,并让生成模型标注它依据的原文片段,便于后续判定忠实度;三是自动过滤,用规则去重(近重复、模板化句式)、用另一个模型做交叉校验(答案能否由给定文档支持、是否有幻觉、问题是否自洽),把不合格的丢掉;四是人工抽检与评测护栏,按维度分层抽样人工打分,统计合成集与人工集上同一系统的表现差距,差距大就说明数据集不可信。最后不要把所有指标压成一个平均分——按意图类别、难度、问题长度分桶看,平均值往往掩盖了最差的那一桶。
评测体系里哪个指标最能衡量目标:要先回到「系统要达成什么」。如果是问答型系统,单一最有代表性的指标是端到端的任务成功率(答案正确且被引用支持、用户不需追问),它直接对齐业务目标,其他指标都是它的分解与诊断工具;在线下则通常用「忠实度 + 正确性」的人工或模型评判作为代理。如果是检索型,核心是 Recall@k(能召回才有后续),用 NDCG 看排序质量。指标选择的两个原则:一是分层,端到端指标看结果,过程指标(召回率、重排增益、幻觉率、拒答率、P95 延迟、单次成本)用来定位问题出在哪一环;二是对齐线上,离线涨了线上不涨,多半是指标选错了或者评测集分布不对。面试里如果只答「看准确率」,会被追问准确率怎么算、谁来判断对错——把判定口径(人工标注、LLM-as-judge 加人工抽检校准)讲清楚才算答完。