2 RAG 常见错误类型有哪些
P0 · rag
🏷 标签:rag, error-taxonomy, debugging, classification
1️⃣ 考察意图
面试官想看你是否具备系统性诊断 RAG 系统的能力,而非零散地背几个错误。考察类型是工程取舍 + 分类思维。刁钻点在于:多数人只提“检索不到”和“幻觉”,但忽略了上下文窗口污染和多跳推理断裂这类隐性错误。答好了能展示你从现象反推根因的 debug 方法论,以及针对不同错误类型设计针对性优化策略的硬实力。
2️⃣ 标准答
RAG 错误可归为四大类,每类有明确的根因和修复路径。以下按检索 → 上下文 → 生成 → 推理的顺序展开,并给出工程取舍和落地坑。
检索错误:召回质量决定天花板
- 未召回相关文档:常见于 query 与文档语义偏移。例如用户问“苹果股价”,但文档用“AAPL”表述。解法是混合检索:BM25(k1=1.5, b=0.75)做关键词匹配 + Dense Embedding(如 bge-large)做语义检索,加权融合(权重 0.3 vs 0.7 需调参)。坑:BM25 对长文档的 IDF 计算会稀释关键词,需对文档做段落级切分(chunk size 256-512 tokens)。
- 召回不相关文档:embedding 模型在领域术语上泛化差。例如医疗 RAG 中“心梗”被匹配到“心肌炎”。解法是查询重写:用 LLM 将用户 query 扩展为 3 个同义子查询(如“心肌梗死”、“heart attack”),分别检索后去重。取舍:重写增加 200ms 延迟,但召回 precision 提升 15-20%。
- 排序不佳:Top-K 中相关文档排在后位。使用交叉编码器重排序(如 Cohere rerank-v3),对 Top-50 结果重排后取 Top-5。坑:交叉编码器计算成本高(O(n²)),需限制重排数量,否则延迟爆炸。
上下文错误:窗口污染是隐形杀手
- 文档截断:长文档被硬切导致关键信息丢失。例如法律合同第 10 页的免责条款被截断。解法是语义分块:用递归字符分割(recursive splitter)配合段落边界检测,确保每个 chunk 是完整语义单元。坑:分块过小(<100 tokens)会丢失上下文,过大(>1000 tokens)会稀释注意力,建议 512 tokens 起步,按领域调。
- 信息冗余导致注意力分散:Top-5 文档中 3 个重复内容,LLM 被噪声淹没。解法是去重:基于 MinHash 或 SimHash 对检索结果做近似去重,保留语义最丰富的版本。取舍:去重可能误删细微差异的文档(如版本号不同),需设置相似度阈值 0.85。
生成错误:幻觉与遗漏的博弈
- 幻觉:LLM 生成文档中不存在的内容。例如问“2023 年营收”,LLM 编造了 2024 年数据。根因是 LLM 过度依赖参数知识。解法是引用强制:在 prompt 中要求“仅基于以下文档回答,并标注引用段落编号”。坑:LLM 可能伪造引用(如引用不存在的段落),需后处理校验引用是否在文档中。
- 遗漏关键信息:LLM 只回答了部分问题。例如问“优缺点”,只答了优点。解法是结构化输出:用 JSON schema 约束输出(如
{"pros": [...], "cons": [...]}),并在 prompt 中显式列出所有必填字段。
推理错误:多跳断裂
- 多跳推理失败:需要跨文档推理时,LLM 只用了单文档。例如问“A 公司的竞争对手 B 的 CEO 是谁”,需要先找“A 的竞争对手是 B”,再找“B 的 CEO”。解法是迭代检索:第一轮检索后,让 LLM 生成缺失信息作为新 query,再检索。取舍:迭代次数越多,延迟和 token 成本线性增长,通常限制 2-3 轮。
- 逻辑矛盾:LLM 同时引用矛盾文档。例如文档 A 说“2023 年营收增长 10%”,文档 B 说“2023 年营收下降 5%”。解法是冲突检测:在 prompt 中加入“如果文档间存在矛盾,请指出并给出置信度最高的答案”,或使用投票机制(多个 LLM 调用取多数)。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从检索、上下文、生成、推理四个层面回答。检索层面,常见未召回或召回不相关,用混合检索和查询重写解决;上下文层面,文档截断和冗余是隐形杀手,需语义分块和去重;生成层面,幻觉和遗漏靠引用强制和结构化输出;推理层面,多跳失败用迭代检索。总结一句:RAG 错误诊断的核心是定位根因在哪个环节,然后针对性优化,而非盲目调参。”
4️⃣ 高频追问 & 应对
追问 1:你提到混合检索,具体怎么调 BM25 和 Dense 的权重?
权重调参依赖数据分布。如果 query 多为精确术语(如产品型号),BM25 权重可设 0.6;如果多为语义查询(如“类似功能的产品”),Dense 权重设 0.7。实操中,我会在验证集上做网格搜索(步长 0.1),用 Recall@5 作为指标。一个坑是:BM25 的 k1 和 b 参数也需要调,k1 控制词频饱和度,b 控制文档长度归一化,默认值(1.5, 0.75)在短文本上表现差,建议用 Optuna 自动调参。
追问 2:如果用户 query 是“苹果的竞争对手”,但文档里只有“Apple”,怎么处理?
这是典型的术语对齐问题。解法是同义词扩展:在检索前用预定义词典或 LLM 将 query 中的“苹果”扩展为“Apple、iPhone 制造商”。另一个方案是embedding 模型微调:用领域数据(如科技新闻)微调 bge-large,使“苹果”和“Apple”的向量距离更近。取舍:微调成本高(需 1000+ 标注样本),但效果比扩展更稳定。
追问 3:你怎么评估 RAG 系统的错误率?
用端到端指标 + 分环节指标。端到端用 Answer Relevancy(LLM 打分)和 Faithfulness(是否幻觉)。分环节:检索用 Recall@K 和 Precision@K;生成用 BLEU 和 ROUGE-L。一个实战坑:LLM 打分器本身有偏见(如偏好长答案),需用人工标注 200 条作为 ground truth 校准。优化目标:错误率降低 15% 以上。
5️⃣ 避坑 · 常见错误答法
- ❌ 只提“检索不到”和“幻觉”两类错误,忽略上下文污染和多跳推理。→ ✅ 必须覆盖四大类,并给出每类的根因和具体解法(如语义分块、迭代检索)。
- ❌ 说“用更好的 embedding 模型就能解决所有检索错误”。→ ✅ 承认 embedding 模型的局限,并给出混合检索、查询重写等组合方案,体现工程取舍。
- ❌ 把“LLM 生成错误”全归为幻觉,不区分遗漏和格式错误。→ ✅ 区分幻觉(编造)、遗漏(缺失)、格式错误(输出不符合 schema),并分别给解法。
6️⃣ 简历呼应
- 如果你有 RAG 项目:从项目中的错误案例切入,比如“我在电商客服 RAG 中遇到 30% 的幻觉,通过引用强制和冲突检测降到 10%”,展示你实际 debug 过。
- 如果你只做过传统 NLP:用信息检索的类比迁移,比如“传统 IR 中的 query expansion 对应 RAG 的查询重写,排序模型对应交叉编码器重排”,体现跨领域理解。
- 如果你是校招无项目:聚焦论文复现,比如“我复现了 Karpukhin 2020 的 DPR 论文,发现检索错误占 40%,并模拟了混合检索改进”,展示理论到实践的推导能力。
- Karpukhin et al., “Dense Passage Retrieval for Open-Domain Question Answering”, EMNLP 2020
- Lewis et al., “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks”, NeurIPS 2020
- Shuster et al., “Retrieval Augmentation Reduces Hallucination in Conversation”, arXiv 2021
- 博客:LangChain 官方文档 “RAG Error Analysis” 章节
- 工具:Ragas 框架(用于 RAG 评估和错误分类)