生产环境中的RAG系统失败的三种原因:上下文碎片化、漂移与滥用。
生产型RAG失败的三种方式:分块导致的上下文碎片化、知识库扩展带来的漂移问题,以及尽管检索效果良好但仍被误用,以及相应的层级级解决方案。
来源: Complete AI Engineer Interview Handbook (Part 1): Why RAG Systems Fail
为何RAG演示可以成功,而生产系统却不行
检索增强生成已成为企业人工智能的默认架构。在银行、保险、医疗保健、电信、零售和政府领域,各种客服助手、内部知识工具、合规顾问以及智能搜索产品都在使用它来将语言模型与企业的自有知识相连。这个理念听起来很简单:在模型回答问题之前,从知识库中获取相关内容并传递给模型。但在实际生产环境中实现这一功能,要比概念验证所显示的困难得多。
许多团队虽然能让原型运行起来,但在大规模应用时却会遇到新问题。得到的答案往往不完整。随着数据量增加,检索质量也会下降。关键上下文会被遗漏,出现幻觉现象,延迟逐渐上升,用户收到的回复在技术上虽正确,但实际上毫无用处。有时检索系统能找到完全正确的文档,模型依然会给出错误答案。
企业环境会让这些问题更加严重,因为知识分散在成千上万的文档、政策、流程、操作手册以及监管指南中。一项业务决策可能依赖于分散在知识库不同部分的细节,这使得检索质量与模型能力同样重要。
有一种常见的误解认为,更好的RAG系统就意味着更好的LLM模型。虽然模型选择很重要,但许多实际应用中的问题其实源于其他方面:文本分块、检索架构、上下文管理、排序流程以及评估机制。一个设计精良的检索系统搭配功能强大的模型,往往能胜过那些使用最先进模型却构建粗糙的系统。在银行等受监管的行业里,了解这些故障模式往往比掌握最新模型的内部结构更为重要,因为实际应用的成败很少取决于单次模型升级,而更多取决于信息检索、排序、组织呈现的效率。
以下三种情况展示了问题可能如何发生:
- 系统虽能检索到相关内容,却仍会忽略关键细节。
- 随着知识库的不断扩充,检索质量会逐渐下降。
这三种情况都表明,优秀的RAG系统依赖于更出色的检索能力、上下文管理、评估机制以及系统设计,而不仅仅是更强大的模型。
场景一:有相关文本,但未能抓住要点
最令人恼火的情况之一是,检索系统虽然找到了相关段落,但生成的答案仍然不够充分。这些答案可能在事实层面是正确的,却缺乏人类专家能够立即察觉的上下文、细微细节或业务层面的微妙之处。在信息分散在多个章节的长文档中,这种情况更为常见。
想象一下,银行的知识库中存储着客户开户政策。主要要求集中在某一章中,异常处理规则在另一章,而监管要求则由风险部门单独保管在另一个部分。有客户询问某份文件是否足以用于开户。检索系统会返回相关的开户政策,却忽略了其他地方记录的监管例外情况。根据所获取的信息,模型的回答是正确的,但对业务而言仍然不完整。这说明该系统只能理解文件的部分内容,而无法把握整体情况。
工程师们往往首先怀疑模型本身。最常见的问题出在检索架构上。
固定大小的片段会割裂整体逻辑
首先需要检查的是分块方式。许多实现采用固定大小的块,因为这样易于构建,在实验中表现良好——将文档每几百个标记分割一次,然后将这些片段存储在向量数据库中。虽然这种方法简单,但常常会破坏逻辑关系。文档并非以标记为单位来组织的,而是围绕主题、章节、政策、流程及业务概念来构建的;一旦有边界将某部分切分,上下文就会破碎。某个政策定义可能位于一个块中,而其例外情况却在另一个块中。检索系统只能获取到定义,却找不到例外内容,于是模型只能根据不完整的证据进行推理。
解决上下文碎片化的方法
语义分块是常用的解决方案。它不会按照任意的标记数量进行切割,而是遵循标题、章节、段落以及主题转换等自然结构,从而保留内容间的关联,显著提升检索效果。
即便如此,重要信息往往位于两个分块之间的边界附近。如果这些分块完全独立,检索仍可能遗漏这些信息。此时重叠的分块就能发挥作用——让相邻分块共享部分内容,能够在分界处保持连贯性,因为结束一个分块的内容同时也开启了下一个分块,从而降低丢失相关上下文的可能性。
随着文档变得愈发复杂,父子式结构显得尤为重要。将内容拆分为较小的片段进行嵌入和搜索,能够实现更高的精确度。一旦某个小片段匹配成功,系统就会获取包含它的较大父级部分,这样模型就能同时看到匹配的细节及其周边内容。这就好比先找到对应的段落,再阅读整个章节,而非仅几句零散的文字。
实际应用系统也表明,最佳答案很少存在于单个片段中。相关辅助信息往往位于最高匹配结果的前后位置,因此仅获取排名最高的片段可能会导致推理不完整。将检索范围扩大到包括主要结果周围的相邻片段,既能保持内容的连贯性,也能让模型了解各部分之间的关联关系。
随着知识库的不断扩充,对检索质量的要求也日益提高。向量搜索在查找语义相似的内容方面表现优异,但可能无法捕捉到精确的术语、产品名称、政策标识、法规引用以及领域特定的关键词。在银行业务中,客户可能会提及需要精确匹配的特定法规、账户类型或交易类别。将语义搜索与BM25等关键词检索方法相结合的混合策略能够兼顾两者优势:语义搜索负责捕捉含义,而关键词搜索则确保精确性,二者结合能实现比单独使用任一方法更好的检索效果。
在内容进入模型之前,最后会进行重排序和上下文优化。并非所有检索到的段落都适合出现在最终提示中。重排序机制会将最相关的内容置于前面,而上下文优化则通过去除冗余信息来充分利用输入窗口的容量。其目标不仅仅是检索出相关文本,而是让模型获得像有经验的人阅读相关内容后所能获得的理解。只有当检索过程能够保留概念、规则、例外情况以及证据之间的关联时,答案的质量才能大幅提升,长文档中那些容易被忽略的细节也不会丢失。
简而言之
出现这种症状时,应先检查模型之前的检索层。审视分块策略,采用带有重叠的语义分块方式,加入父子节点检索功能,扩展到相邻分块,并结合混合搜索与重排序技术。这些改进通常能为模型提供更丰富、关联性更强的上下文,而这正是保持长文档中细微差别的关键。
第二种情况:开发阶段表现良好,生产环境却不稳定
企业中常见的情况是这样的:RAG系统在开发阶段表现优异,但上线后不久就开始返回无关或不一致的结果。演示时一切正常,测试查询能得到准确答案,信息检索看起来可靠,人们也充满信心。然而当真实流量到来后,问题就出现了——用户提出各种不同的问题,新的文档不断加入知识库,业务流程发生变化,数据量也持续增长,那些曾经看似正确的答案变得不一致、不完整或偏离主题。
数据发生变化了吗?
首要的检验标准是数据分布是否发生了变化。开发环境中的数据集规模较小,经过精心筛选且结构整齐。而生产环境中则可能存在成千上万份由不同团队按照不同格式和标准编写的文档。试想一家银行,起初只有少量新用户准入政策,后来逐步增加了合规流程、审计文件、反欺诈指南、产品手册、客户往来信件以及监管通知等内容。原本只需从十份高度相关的文档中选取结果的查询,现在却要与数千份仅有部分关联的文档竞争。检索系统仍可能返回内容相似但并非最实用的结果,而这往往是随着知识库规模扩大导致检索质量下降的最初迹象。
单独评估检索性能
接下来,需要将检索部分与语言模型分开进行评估。一个常见的错误是,当检索系统未能提供正确上下文时,却将糟糕的答案归咎于大型语言模型。Recall@K和Precision@K等指标能很快解决这个问题:如果正确文档没有出现在顶级结果中,那就说明模型根本无从获得有效信息。通常情况下,问题出在检索流程本身。
一个常见的原因就是嵌入向量漂移。原本适用于小型数据集的嵌入模型,随着文档类型的多样化,其效果会逐渐下降,因为不同的类型、写作风格和领域术语会削弱它的性能。银行的知识库可能包含合规团队的政策、业务团队的手册以及工程师的规范。虽然这些都属于同一个机构,但语言差异很大,如果嵌入向量无法捕捉这些差异,质量就会下降。
分块策略也可能会过时。一种在数百份文档上有效的方法,在数十万份文档上却可能失效,因为结构不良的分块会为相似性搜索带来干扰,增加找到相关内容的难度。正因如此,实际部署的RAG系统需要持续评估,而非一次性构建即可。
真实查询与测试查询不同
查询模式值得关注。开发测试通常使用理想化的问题,因为工程师已经熟悉相关数据。而真实用户会提出模糊或不完整的问题,并使用知识库中不存在的术语。例如,服务人员可能会搜索“高级账户关闭规则”,而官方文档中使用的是“高价值客户账户终止流程”。人们能立刻理解这两个表述的关联,但检索系统未必能识别出来。观察真实用户的操作方式通常能发现测试无法暴露的缺陷。
了解处理流程内部情况
检索可观测性是另一项重要的技术。对于每一个生产环境中的查询,其可见性应涵盖以下内容:
- 返回了哪些文档
- 每篇文档被检索出来的原因
- 相似度得分
- 发送给大语言模型的最终上下文
- 生成的响应内容
如果没有这些信息,调试工作将只能靠猜测;而有了它们,追踪记录往往能显示问题是出在检索、重排序、提示词构建还是生成环节。
随着数据量的不断增加,可以在向量搜索之前添加更多层处理机制,比如混合检索、元数据过滤、文档分类、重排序器或领域专用处理流程。例如,关于抵押贷款的银行查询就应该先在抵押贷款相关资料中搜索,而非整个企业知识库。缩小搜索范围可以提高准确率和答案质量。
关键在于,生产环境中的 RAG 系统是会随着数据变化而演进的动态系统。不能认为第一天表现良好的解决方案在六个月后仍能保持相同性能,因此持续监控、评估并重新训练检索组件对于维持大规模应用下的质量至关重要。
简而言之
当系统在开发阶段表现良好但在生产环境中表现不佳时,应首先区分检索问题与生成问题。分析检索指标、检查被检索到的文档、评估嵌入质量、研究真实的查询模式,并在整个流程中增加可观测性。随着数据量的增长,可以考虑采用混合搜索、元数据过滤、重排序以及领域特定的检索方法,以确保结果的相关性与准确性。
场景三:文档正确但答案错误
许多工程师认为,一旦检索功能正常工作,任务就完成了。但实际上最棘手的RAG场景恰恰相反:系统找到了正确的文档,模型依然给出错误答案。这尤其令人沮丧,因为通常的调试思路会直接指向检索环节,而检索模块可能已经完美地完成了工作。问题出在模型如何处理并运用这些上下文信息上。
想象一下负责处理银行合规问题的助手在回答反洗钱相关问题。有用户询问,在客户身份验证尚未完成时,账户是否仍可保持活跃状态。检索系统返回了正确的政策文件,相关规则也包含在上下文中,但模型的回答却称账户可以无限期保持活跃。所需信息明明就在那里,模型却未能正确使用它。
上下文过载与中间丢失问题
其中一个原因是上下文过载。检索到的文档越多,模型需要处理的量就越大,而且并非所有信息的重要性都相同,因此关键细节可能会被淹没在冗长的提示语中。这通常被称为“中间内容丢失”问题:模型往往只关注上下文开头和结尾的内容,而忽略中间的部分。正确的答案可能就存在于提示语之中,却仍会被忽视。
解决办法是重视上下文的质量而非数量。团队往往试图通过获取更多信息来提高准确性,但更多的上下文并不能保证产生更好的答案,几段高质量的内容往往比一堆关联不紧密的内容更有效。此时重新排序就显得非常重要,因为它能在模型看到内容之前先对最相关的段落进行排序。给模型提供三份具有明确支持证据的高度相关文档,其效果往往优于十份相关性一般的文档。
要求有依据的提示词
提示词的设计也很重要。不要让模型自由作答,而应要求它严格依据检索到的上下文来回应,当证据无法支撑答案时则明确表示信息不足。这样就能有效减少无依据的推理。
基于引用的生成方式也很有帮助。当模型需要指定某些部分或文档标识符时,就能更轻松地判断答案是否基于检索到的证据,这在银行等需要具备可审计性和可解释性的受监管行业中尤为重要。
冲突的来源
需检查检索到的文档是否存在冲突。大型组织通常会保存政策、流程和指南的多个版本,如果检索结果同时包含过时版本和当前版本,模型可能无法判断哪个版本应优先使用。此时元数据过滤与文档版本控制就显得十分重要。
其目标不仅仅是检索信息,还要确保模型能够识别、区分优先级,并对其中最相关的证据进行推理。只有当检索与推理相互配合时,RAG系统才能发挥作用。
简而言之
当正确的文档被检索出来但答案仍然错误时,需检查模型是如何使用上下文的:信息过载、中间丢失效应、来源冲突以及依据不足。值得尝试的解决方法包括重新排序、缩减上下文范围、让答案注明来源、使用元数据过滤器,以及设计提示语迫使模型仅依赖检索到的证据。很多时候问题并不在于信息检索本身,而在于上下文的使用方式。
三种情况的共同点
构建一个优秀的RAG系统远不止是将向量数据库与大语言模型相连那么简单。概念验证阶段的系统往往看起来相当出色,但真正的挑战在于系统投入实际应用后需要在大规模环境中稳定运行。在这三种情况下,大量文档中的上下文片段会分散存在,随着存储库规模扩大检索质量会下降,即便检索到了正确的信息,模型也可能无法对其进行有效推理。
反复出现的主题是:检索质量与模型能力同样重要。即便是最先进的大型语言模型,也无法弥补上下文缺失、结构混乱的文本块、低效的检索策略或提示词中无关内容所带来的问题。通常,优化检索架构带来的收益远高于更换模型。对于工程师、系统架构师和技术负责人而言,将演示级系统提升为可投入生产的系统关键在于精心设计:合理的文本分块、完善的检索流程、对上下文的充分依托、重新排序功能以及持续的评估机制。企业级人工智能不仅仅是生成答案,更重要的是生成相关、有依据、可解释且始终可靠的答案。