文章揭示RAG系统成败关键在于检索与生成之间的"增强层"。大模型对上下文位置有偏好效应,检索后处理管道(过滤、重排序、去重)至关重要,提示词架构影响模型表现。优化建议包括混合搜索、控制文本块数量、利用位置效应等,这些细节常被忽视,却是提升性能的关键。

前排提示,文末有大模型AGI-CSDN独家资料包哦!

“检索独占了所有的聚光灯,但真正决定系统在暗处成败的,却是检索与生成之间的环节。”

检索效果堪称完美。

返回了五个文本块,相关性分数均在0.85以上,恰好是用户需要的政策文档。答案就在第三个文本块中。

但回复遗漏了关键细节。这不算是完全的幻觉。更像是模型浏览了一遍而没有仔细阅读。

你调试检索器,调优嵌入模型,调整文本块大小。但检索本身从来不是问题所在。

问题出在其他地方:这些文本块是如何被组合成提示词的。它们出现的顺序如何。它们周围有多少上下文信息。模型是否真的能够利用你检索到的内容。

这是没人警告你的那一层:检索和生成之间发生了什么。你的向量数据库传递相关文本块。你的大语言模型生成回复。中间的增强层决定了你的检索是否真的有意义。

位置仍然重要

大语言模型不会均匀地读取上下文。

斯坦福大学和Meta的研究人员在2023年发现了这一点。他们将关键事实埋藏在检索文档的不同位置,然后测量准确率。结果是什么?一条U形曲线。模型对最先出现的内容(首因效应)和最后出现的内容(近因效应)关注强烈。中间的部分被忽视了。

这种情况有所改善。GPT-4o和Claude 3.5 Sonnet在位置处理上不像GPT-3.5-Turbo那样吃力。这种效应并未消失。它被削弱了,但并未消除。架构原因依然存在:Transformer的注意力机制,通过softmax归一化和"注意力sink"的quirks,仍然对早期token分配了不成比例的权重。

所以:把你最好的文本块放在最前面。这不费吹灰之力,还能防范位置效应。无论你使用哪种模型都有效。

RAG提示词示意图:文本块3具有最高的相关性分数(0.91),但位于第3位。最优位置将其放在首位。(所有插图均由作者提供)

解决方案:重新构建你的提示词。将最高相关性的文本块移到开头。将次要上下文放在中间。对于复杂查询,考虑在末尾添加摘要。

重排序算法:最佳文本块保持在位置1(首因效应),第二好的移到末尾(近因效应),其余填充中间部分。

2023年研究中的U形注意力曲线。虽然较新的模型使这条曲线趋于平缓,但这种模式并未完全消失。

检索之后实际发生了什么

大多数RAG教程展示的是一个简洁的图示:

查询 → 检索器 → 大语言模型 → 回复

检索器和大语言模型之间的箭头隐藏了整整一个处理管道。

其实,那个箭头隐藏了很多东西:

你的检索器返回候选结果,通常是按嵌入相似度排名前20-50的文本块。那些原始结果存在问题。有些文本块重叠,重复相同的信息。有些相互矛盾。有些是基于关键词匹配,但并不能真正回答你的问题。将它们直接输入大语言模型会浪费token并引入噪声。

处理管道将这些原始候选结果转换为优化的上下文。它通过相关性阈值进行过滤。它移除近似重复项。它使用比嵌入相似度更能理解查询-文档关系的模型进行重排序。它处理矛盾。它扩展有前景的文本块以包含周围上下文。然后,最终,它将所有内容组装成大语言模型实际可以使用的提示词结构。

跳过这些步骤中的任何一个,你都是在放弃质量。

检索和生成之间的隐藏管道:50个候选文本块通过过滤、重排序和去重缩减为4-6个优化后的文本块。

重排序是收益最大的地方。向量相似度快速但浅层。它比较文档的压缩表示,为了速度牺牲了细微差别。交叉编码器重排序器通过完整的Transformer注意力机制一起处理你的查询和每个文档,捕捉嵌入遗漏的关系。

有效的模式:广泛检索(前50个候选),精确重排序(保留前5个)。Pinecone的基准测试显示,这种两阶段方法比单纯的向量搜索提高了14-30%的检索质量。生产系统显示的数字也类似。

双编码器检索快速但浅层。交叉编码器重排序缓慢但深层。两者结合给你速度和精度。

对于重排序模型,Cohere Rerank可以很好地处理大多数用例。如果你不是所有文档都是英文,它的 multilingual 特性会有所帮助。对于自托管部署,BAAI的bge-reranker-ver2-m3在不产生API成本的情况下提供了相当的质量。

去重解决了一个你可能不会注意到直到它给你带来代价的问题。使用滑动窗口的文本分块策略会产生重叠。检索五个文本块,其中三个可能包含相同的段落。这不仅仅是浪费token。重复可能使模型偏向于过度强调重复的内容。

最大边际相关性(MMR)很好地处理这个问题。理念是:你添加的每个新文本块应该是相关的,但也应该与你已经选择的内容不同。没有理由包含三个说同样事情的文本块。

矛盾处理更难。当你的检索器返回相互矛盾的文本块时,模型应该怎么做?系统经常自信地引用错误的来源,因为它在上下文中最先出现。

对于时间矛盾,解决方案是元数据。包括时间戳,并在新内容涵盖相同领域时过滤旧内容。LlamaIndex有一个EmbeddingRecencyPostprocessor可以自动完成这个任务。

对于权威冲突,对你的来源进行加权。官方文档应该覆盖用户生成的内容。主要来源应该击败摘要。明确的元数据标签让你在管道中实现这些偏好。

当存在合法的模糊性时,诚实的方法是用清晰的归属呈现两种观点。强迫虚假的共识会产生听起来自信但会误导用户的回复。

没人教你的Token预算

上下文窗口有上限。这个你知道。但在这些限制内的预算分配是没人教的部分。

128K的上下文窗口听起来很大,直到你考虑到所有竞争空间的东西。你的系统提示词需要空间。用户的查询占用token。你需要为回复本身预留容量。剩下的才是你检索上下文的实际预算。

一个合理的分配:系统提示词1500 token,用户查询500 token,输出预留4000 token。在128K模型上,这为上下文留下了约122,000个token。足够多了,对吧?

理论上,是的。在实践中,更多并不总是更好。即使改进的长上下文模型,在某个点之后也存在收益递减,额外的文本块添加的是噪声而不是信号。模型必须筛选更多内容才能找到相关的内容。

Token分配现实:只是因为你能够填满128K并不意味着你应该这样做。质量优先于数量。

最佳点通常是大多数查询的4-6个文本块。在此之后,每个额外的文本块都与已包含的文本块竞争相关性。除非新文本块包含真正独特的信息,否则它会稀释而不是丰富内容。

当你需要更多上下文时,压缩胜于截断。

微软的LongLLMLingua实现了4倍压缩,同时在问答基准测试上提高了21%的准确率。它使用困惑度对token重要性进行评分,并保留与查询相关的内容,同时丢弃填充内容。压缩后的上下文包含的文本更少,但信号更多。

替代方案RECOMP提供提取式压缩(选择关键句子)和抽象式压缩(生成摘要)。任何一种方法都优于naive截断,后者基于位置而非重要性丢弃内容。

压缩在处理相关信息分散的长文档时效果最好。对于检索场景良好分块的内容,保持在4-6个高质量文本块内比压缩更大的集合效果更好。

真正有效的提示词架构

你如何构建最终提示词比大多数教程承认的更重要。

基本架构有两层:建立规则的持久系统提示词,以及注入查询时上下文的动态用户提示词。混合这些层会导致不一致。将它们保持分开。

你的系统提示词应该定义:

  • • 角色和人格(“你是某公司的技术支持助手…”)
  • • grounding规则(“仅使用提供的上下文回答。如果上下文不包含答案,请说明。”)
  • • 格式规范(“使用[1]、[2]符号引用来源”)
  • • 拒绝模式(“不要回答关于竞品的问题”)

此提示词在查询间保持不变。规则普遍适用。

你的用户提示词应该包含:

  • • 检索到的上下文,清晰界定
  • • 实际的用户查询
  • • 任何特定于查询的指令

分隔符的选择影响解析准确率。XML标签在Claude和受过结构化数据训练的模型上优于markdown和纯文本。我使用、和作为边界。

一个效果良好的结构如下:

Naive排序将关键信息埋在注意力死角。优化位置利用首因效应和近因效应。

<documents><document source="policy-handbook.pdf" page="12">[chunk content here]</document><document source="faq-updated-2024.md">[chunk content here]</document></documents><query>[user's question here]</query>

源元数据启用引用。页面编号让用户能够验证。清晰的结构帮助模型从指令中解析内容。

你应该包含什么元数据?源标题,是的。时间敏感内容的时间戳,是的。如果需要引用,页面编号,是的。

你应该排除什么?内部相关性分数、文件系统路径、编码信息、调试数据。这些消耗token但不帮助生成。如果元数据不能帮助模型更好地推理,就不要包含。

日志中不显示的失败

良好的检索指标不能保证良好的回复。注意检索成功后发生的失败模式。

引用幻觉是偷偷摸摸的。回复听起来权威,包含括号引用,但完全错误地说了哪个来源说了什么。事实可能是正确的。但归属不是。

这是因为引用准确性和事实准确性是独立的。模型可以从上下文中提取正确的信息,同时(如果这个词甚至适用于大语言模型的话)误记它来自哪个文本块。生产系统需要验证,将具体的主张追溯到具体的来源。

上下文中毒是我称之为当低相关性文本块挤掉好的文本块时。你的检索器返回十个文本块。七个是中等水平。三个正是你需要的。那七个稀释了信号,不是通过位置,而是通过音量。模型试图使用一切而不是找到最好的部分。

更严格的相关性阈值有帮助。限制你的文本块数量也有帮助。如果你不确定,宁可要更少的好文本块也不要更多平庸的。

当你的索引缺乏新鲜度信号时,就会出现时间陈旧。检索器返回一个2022年的政策文档,因为它完美地匹配了查询术语。那项政策在2024年被替换了。但你的管道不知道这一点。

基于元数据的过滤可以捕获这个,但前提是你索引时间戳并以新鲜度感知进行查询。对于快速变化的领域,考虑将新鲜度作为与相关性并列的排名因素。

推理碎片化扼杀多跳查询。用户提出的问题需要连接来自多个文本块的事实。每个文本块都检索成功。模型无法合成它们,因为它们在提示词中语义上相距甚远,缺乏桥接上下文。

分层文本分块在这里有所帮助。LlamaIndex的句子窗口检索在检索时嵌入单个句子,但在查询时扩展到周围的段落。桥接上下文自动随之而来。

真正有效的方法

在构建生产级RAG系统之后,这些模式是经得起检验的:

检索:混合搜索结合BM25关键词匹配和密集嵌入,通过Reciprocal Rank Fusion合并。这能捕获任一方法单独会遗漏的查询。Anthropic关于Contextual Retrieval的研究显示,混合方法减少了67%的检索失败。

重排序:云部署用Cohere Rerank,自托管用bge-reranker。始终重排序。延迟成本是值得的。

去重:MMR的lambda值约为0.6。你想要相关性,但也想要多样性。

文本块数量:大多数查询4-6个。只有当你确实需要跨多个来源综合时才更多。

位置策略:最佳文本块放在前面。支撑上下文填充中间。如果有空间,末尾放摘要。利用提示词的两端。

提示词结构:XML标签用于上下文界定。包含源和时间戳元数据。排除内部管道数据。

评估:将检索指标(精确率、召回率)与生成指标(忠实度、 groundedness)分开。当回复失败时,你需要知道哪个组件失败了。

这不是唯一有效的方法。但它可以防止你调试错误的层。

赚取其价值的层

大多数RAG讨论聚焦于检索。这是有道理的。如果你没有检索到正确的文本块,下游的任何东西都无法拯救你。

但与增强相比,检索是一个已解决的问题。向量数据库是成熟的。嵌入模型很好而且越来越好。重排序正在成为标准。检索层有明确的最佳实践和可衡量的基准。

增强层,检索和生成之间的空间,更年轻且更混乱。位置效应、压缩策略、提示词架构、在检索指标中不显示的失败模式。纸上看起来相同的系统在这里在生产中分道扬镳。

当你的RAG系统表现不佳时,抵制首先责备检索器的本能。检查你把文本块放在提示词的什么地方。检查你是否包含了太多上下文。检查你的提示词结构是帮助还是阻碍模型解析相关信息的能力。

检索可能没问题。真正决定模型是否真正使用你找到的东西的是接下来发生的事情。

读者福利:倘若大家对大模型感兴趣,那么这套大模型学习资料一定对你有用。

针对0基础小白:

如果你是零基础小白,快速入门大模型是可行的。
大模型学习流程较短,学习内容全面,需要理论与实践结合
学习计划和方向能根据资料进行归纳总结

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

请添加图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

这里我们能提供零基础学习书籍和视频。作为最快捷也是最有效的方式之一,跟着老师的思路,由浅入深,从理论到实操,其实大模型并不难

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐