1 RAG 不是把资料塞给模型就行,为什么
P1 · rag
🏷 标签:rag, retrieval, generation, system-design
1️⃣ 考察意图
面试官想看的不是你会不会调API,而是你是否理解RAG作为“检索-生成协同系统”的本质。这道题属于系统设计+工程取舍类型,刁钻点在于:很多人以为RAG就是“把文档拼进prompt”,但实际落地中,直接塞资料会导致上下文窗口爆炸、注意力稀释、检索噪声放大,甚至让模型产生更严重的幻觉。答好了能展示你对检索质量、上下文窗口管理、生成鲁棒性三者的权衡能力,以及从“能用”到“好用”的工程思维。
2️⃣ 标准答
RAG不是“资料塞给模型就行”,因为检索和生成是两个独立但耦合的子系统,简单拼接会引发三个核心问题:
- 上下文窗口的物理限制:以GPT-4 Turbo(128K token)为例,直接塞入10篇平均2000字的文档,token数轻松超过100K。但模型在长上下文中的注意力会衰减——Lost in the Middle现象(Liu et al., 2023)表明,模型对中间位置信息的召回率比开头和结尾低20-40%。这意味着,即使资料全在窗口内,关键信息也可能被淹没。
- 检索噪声放大幻觉:假设检索返回5篇文档,其中1篇是噪声(相关性<0.3)。模型在生成时无法区分“哪些是事实、哪些是干扰”,尤其当噪声文档包含与问题相似的实体或数字时,模型会优先采信与自身参数记忆冲突最小的片段。实际落地中,我们曾遇到一个金融问答场景:检索到一篇关于“2022年Q3营收”的旧报告,模型直接将其作为“当前数据”输出,导致答案偏差超过30%。
- 信息冗余与重复惩罚:多篇检索文档可能包含重叠内容(如维基百科的不同段落都描述同一事件)。模型在生成时若遇到重复信息,会倾向于重复输出或压缩关键点,反而丢失细节。例如,在医疗问答中,三篇文档都提到“阿司匹林用于抗血小板”,但只有一篇提到“剂量为75-100mg/天”,模型可能只输出“阿司匹林有效”而忽略剂量。
工程取舍点:为什么不能简单用“检索更多文档+让模型自己过滤”?因为检索召回率与精度存在trade-off。提高召回率(如top-k从3提到10)会引入更多噪声,而模型自身的过滤能力有限(尤其是小模型如7B)。实际中,我们采用两阶段策略:
- 检索阶段:用BM25(k1=1.5, b=0.75)做粗召回,再用ColBERT(基于late interaction)做精排,将top-5文档的噪声率控制在10%以下。
- 生成阶段:对检索结果做结构化摘要——用LLM(如GPT-4o-mini)将每篇文档压缩成“事实三元组”(实体-关系-值),再拼接成prompt。这样既减少token数(平均压缩60%),又强制模型聚焦关键信息。
实际落地的坑+解法:
- 坑:检索文档的时间戳冲突。比如用户问“苹果最新财报”,检索到2024Q4和2025Q1两份报告,模型可能混用数据。
- 解法:在检索阶段加入时间衰减权重(如BM25的文档得分乘以exp(-0.1 * days_since_publish)),并在生成prompt中显式标注“以下信息按时间排序,请优先使用最新数据”。
3️⃣ 答题模板(30秒电梯版)
“这个问题我从三个层面回答:第一,上下文窗口限制——模型对长文本的注意力会衰减,直接塞资料导致关键信息被淹没;第二,检索噪声放大——不相关的文档会误导模型产生幻觉,尤其在金融、医疗等敏感领域;第三,信息冗余——重复内容让模型丢失细节。总结一句:RAG需要精心设计检索策略(如BM25+ColBERT两阶段)、文档排序(时间衰减权重)和生成压缩(结构化摘要),而不是简单拼接。”
4️⃣ 高频追问 & 应对
追问1:你说检索噪声会放大幻觉,那如果检索结果全部相关,直接塞进去就行吗?
不行。即使全部相关,信息密度和结构仍是问题。比如检索到5篇相关文档,每篇都包含“公司A营收增长20%”,但只有一篇提到“增长主要来自B业务”。直接拼接后,模型可能输出“公司A营收增长20%”而忽略原因。解法是对检索结果做去重和关键信息提取:用LLM生成一个“事实列表”,再让模型基于列表回答。实际中,我们使用GPT-4o-mini对每篇文档生成3-5个“事实点”,然后合并去重,最终prompt token数减少50%,答案准确率提升15%。
追问2:你提到Lost in the Middle,那如果我把最重要的文档放在开头和结尾,能解决吗?
部分解决,但不够。位置重排(如按相关性降序排列)确实能提升召回率,但模型对中间位置的处理仍然脆弱。更根本的解法是分块+迭代检索:将长文档切分成512 token的chunk,用HNSW索引做向量检索,只取top-3 chunk。这样每个chunk都在模型的高注意力区域。代价是丢失跨chunk的上下文(如文档开头定义术语,结尾才解释),需要额外做chunk间关系建模(如用图结构存储chunk的引用关系)。
追问3:你提到用结构化摘要压缩,那摘要本身会不会引入新幻觉?
会,这是压缩-保真度trade-off。我们通过两阶段验证控制:第一阶段,用LLM生成摘要后,让另一个LLM(或同一模型的不同温度设置)做“事实一致性检查”——对比摘要和原文的实体、数字、关系是否一致。第二阶段,在生成prompt中保留原文的“关键证据片段”(如直接引用原文句子),让模型在不确定时回退到原文。实际中,摘要的幻觉率从8%降到2%以下,但增加了20%的推理延迟。
5️⃣ 避坑 · 常见错误答法
- ❌ “RAG就是把文档塞进prompt,模型会自动过滤无关信息。” → ✅ “模型没有‘自动过滤’能力,尤其当噪声文档与问题语义相似时,模型会混淆。必须主动控制检索质量,比如用重排序器(reranker)过滤低分文档。”
- ❌ “只要上下文窗口够大(比如1M token),直接塞所有资料就行。” → ✅ “窗口大不等于有效利用。模型在长上下文中的注意力是稀疏的,且计算成本随窗口平方增长。实际中,128K窗口的推理延迟是32K的4倍,但准确率只提升5%。”
- ❌ “检索结果越多越好,模型能自己挑重点。” → ✅ “检索结果增加会引入更多噪声和冗余,且模型对重复信息的处理能力有限。建议top-k控制在3-5,并配合去重和摘要。”
6️⃣ 简历呼应
- 如果你有RAG项目:从“检索噪声对生成准确率的影响”切入,展示你如何用BM25+ColBERT两阶段检索将噪声率从25%降到8%,并附上A/B测试的F1分数提升数据。
- 如果你只做过传统NLP:用“信息检索中的precision-recall trade-off”类比,说明RAG中检索精度(避免噪声)比召回率(覆盖所有资料)更重要,并提及你如何用TF-IDF或BM25做粗筛。
- 如果你是校招无项目:聚焦“Lost in the Middle”论文复现,用一个小demo(如用GPT-2生成不同位置信息的文本,对比模型回答准确率)展示你对长上下文问题的理解,并给出改进方案(如位置重排)。
- Lost in the Middle: How Language Models Use Long Contexts (Liu et al., 2023)
- ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT
- RAG vs. Fine-tuning: Pipelines, Tradeoffs, and a Case Study on Agriculture (Lewis et al., 2020)
- BM25算法详解及k1、b参数调优实践(博客)
- FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness