你的RAG返回垃圾答案,问题根本不在大模型

你的 RAG 机器人给出了一个自信而详细的回答,却完全错误。模型没有做错任何事,它只是基于你交给它的文本做出了完美回应。问题不在 AI,而在 AI 之前的五个步骤上。

实际工程中,开发者把大量精力放在选更大更好的 LLM,却很少系统检查数据进入模型前的整条流水线。结果就是模型拿到一堆碎片化、噪声重、顺序错乱的文本,忠实地生成看似合理实则荒谬的答案。以下从工程实践角度,把最常见的五个失败点逐一拆开,每一步都对应具体故障现象和可落地的排查优化方法。

分块把语义单元切成了碎片

分块是 RAG 流水线里最容易被低估的一环。很多项目直接拿固定长度切,比如每 512 个 token 切一段,段间不重叠,或者只做简单按句号分割。这直接把一个完整的语义单元撕成几块:一段讲背景、一段给结论、另一段是前提条件。检索时用户问题可能只命中其中一块,导致模型拿到的上下文缺少关键前提或结论。

工程里常见的后果是“部分正确却整体错误”。比如一个技术文档里,某个 API 的调用限制写在第 3 段,报错处理写在第 7 段,固定长度分块后检索只召回了第 7 段,模型就自信地给出缺少限流逻辑的代码。信号里提到的 pipeline 前置步骤里,分块正是第一个容易出错的地方。

可落地的优化思路有三条。一是采用语义分块而非长度分块,用小型 embedding 模型先对文档做句子聚类,把强相关的句子聚成一个 chunk。二是设置合理重叠,比如 20%-30% 的 token 重叠,保证上下文连贯。三是针对不同文档类型定制策略:代码用 AST 解析分块,表格用专门的表格解析器而不是纯文本切分。这些改动通常能把检索召回率提升 15-25 个百分点,实际项目中效果明显。

嵌入模型对领域术语理解偏差

通用嵌入模型在垂直领域表现往往很差。医疗、金融、法律或特定技术栈里的专有名词、缩写、行业黑话,模型要么完全不认识,要么把语义相近但实际不同的术语映射到相近向量上。结果就是用户问一个很具体的术语,检索出来的却是表面相似实则无关的内容。

这和信号强调的“不是模型的问题”高度一致——这里说的模型是大语言模型,而嵌入模型是另一个完全独立的模型。很多团队把 OpenAI 的 text-embedding-ada-002 直接用于所有场景,却没意识到它在自己领域内的表现可能远不如针对性微调后的小型模型。

优化路径很明确:先用领域数据对 embedding 模型做继续预训练或对比学习微调。成本其实不高,几千条高质量的领域句子对就能显著提升相关性。另一种快速见效的方法是混合嵌入:把通用 embedding 和领域关键词 TF-IDF 或 BM25 特征拼接后一起检索。实际测试中,这种混合方式在专有名词密集的文档集上,NDCG@10 能提升 0.18 左右。

向量检索只看相似度忽略相关性

向量检索最常用的就是 cosine similarity 或 Euclidean distance 选 top-k。这种纯相似度排序经常把“看起来像”但实际不相关的内容排到前面。比如用户问“如何处理超时异常”,检索可能把所有出现“异常”二字的片段都拉进来,包括完全不相关的业务异常处理逻辑。

这个阶段的局限独立于分块和后续 rerank。它本质上是 embedding 空间的局限性:相似度和相关性不是一回事。信号里 pipeline 的检索环节正是这个问题的集中体现。

工程上可以引入混合检索(Hybrid Search)。把向量检索和传统关键词检索(BM25)的结果做加权融合,通常能有效过滤掉纯语义漂移的垃圾内容。权重比例需要根据具体数据集做 A/B 测试,常见配置是向量 0.7、关键词 0.3。另一个思路是给 chunk 增加元数据过滤,比如按文档类型、更新时间、权限等先做硬过滤,再做向量检索。这一步优化通常能把最终答案的准确率提高 10-20%。

缺少 rerank 让最优片段沉底

即使 top-20 里已经包含了真正相关的内容,向量相似度排序也常常把最关键的那一段排在第 12 位以后。LLM 的上下文窗口有限,通常只会塞进 top-5 或 top-7,这就导致高质量片段被彻底丢弃。

rerank 模型正是为此设计的。它用更精细的交叉注意力机制重新对候选片段和查询做相关性打分,精度远高于单纯的 embedding 相似度。信号明确把 rerank 视为 pipeline 中关键的排序步骤,缺失它几乎必然导致最优内容沉底。

落地时推荐使用轻量级 reranker,如 bge-reranker-large 或 flashrank。这类模型推理速度快,单条 rerank 耗时在 10ms 以内。实际做法是先用向量检索拉回 30-50 个候选,再用 reranker 重新排序,取 top-5 给 LLM。多个项目数据显示,加上 rerank 后,答案相关性指标提升可达 30% 以上,性价比极高。

长上下文触发 lost in the middle

即使前面几步都做好了,把太多 chunk 塞进上下文仍然会出问题。研究和信号里提到的“lost in the middle”现象表明,大模型对长上下文的注意力分布极不均匀:开头和结尾的信息被重点关注,中间部分容易被忽略。动画演示里清楚地显示,当上下文超过 4k token 后,中间位置的关键事实被模型“忘记”的概率急剧上升。

这解释了为什么有些 RAG 看起来检索很全,答案却漏掉了最核心的那条信息。工程上常见的错误是把 top-10 甚至 top-20 全部塞进去,以为越多越好,结果适得其反。

优化方法包括:严格控制输入 token 数,优先放 rerank 后的 top-3 到 top-5;对多个 chunk 做总结压缩,把同主题的内容合并成一条;或者采用 Map-Reduce 方式,先让模型分别阅读每个 chunk 提取关键事实,再做二次汇总。这些技巧能显著降低中间信息丢失的风险。

五步 pipeline 检查能定位根因

信号把整个 RAG 流程浓缩成“one line of code”式的 pipeline,清晰指出问题几乎总是出在 LLM 之前的五个环节。实际工程中,最有效的排查方法就是把这条流水线拆成独立可观测的五段,逐段验证。

具体做法是:1) 记录每个 chunk 的原始文本和分块边界,人工抽样检查语义完整性;2) 对 embedding 质量做离线评估,用领域测试集算 recall@10;3) 把检索结果和查询一起展示,判断 top-k 是否真的相关;4) 加入 reranker 后对比排序变化,量化提升;5) 控制上下文长度,测试不同位置的信息是否被正确利用。

搭建这样一个端到端的诊断流程后,团队通常能在一天内定位 80% 以上的 RAG 问题根因,而不是盲目升级模型或增加 prompt 工程。很多时候,把 embedding 换成领域微调版本、加上 rerank、把 chunk 数量从 15 减到 5,就能让答案质量从“垃圾”变成“可用”。

真正的高性能 RAG 系统从来不是靠堆更大模型,而是把前面五个步骤做到极致。把精力放在 pipeline 的可观测性和可迭代性上,才是工程团队该有的正确姿势。

参考来源