news 2026/8/5 10:16:31

RAG2-最佳实践和调优技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAG2-最佳实践和调优技巧

Rag核心流程

  • 文档收集和切割
  • 向量转换和存储
  • 文档过滤和检索
  • 查询增强

文档收集

知识完备性
1)文档结构化

  • 文档排版清晰,结构合理,案例编号等
  • 各标题层次分明,内容表达清晰
  • 减少嵌套层级。
    2)内容规范化
  • 语言统一:文档语言与用户提示词语种一致,专业属于可进行多语言标注
  • 表述统一:同一概念应使用统一的表达方式(比如ML、machineLearning统一为机器学习),可通过LLM分段处理长文档辅助完成
  • 减少噪音:避免水印,表格和图片等影响解析的元素。
    3)格式标准化
  • 优先使用markdown、doc等文本格式(PDF解析效果较差),可通过百炼DashScopeParse工具将PDF转为Markdown,再借助大模型整理格式
  • 如果文档包含图片,需要链接化处理,确保回答中能正常展示文档中的插图,口蹄疫通过在文档中插入可公网访问的URL链接实现。

文档切片

合适的文档切片大小和方式对检索效果至关重要。
文档切片尺寸需要根据具体情况灵活调整,避免两个极端:切片果断导致语义缺失,切片过长引入无关信息。具体需要考虑

  • 文档类型:对于专业类文献,增加长度通常有助于保留更多上下文信息;对于社交类帖子,缩短长度则能更准确捕捉语义。
  • 提示词复杂度:如果用户提示词复杂且具体,则可能需要增加切片长度;反之,缩短长度会更为合适。

元数据标注

可以为文档添加额外的结构化信息,俗称元信息,形成多维索引,便于后续向量化处理和精准检索。
在编程实现中,可以通过多种方式为文档添加元数据:
1)手动添加元信息
2)利用DocumentReader批量添加原信息。
.withAdditionalMetadata(“filename”, fileName)

@ComponentpublicclassMykeywordsEnricher{@ResourceprivateChatModeldashScopeChatModel;publicList<Document>enrichDocuments(List<Document>documents){KeywordMetadataEnricherkeywordMetadataEnricher=newKeywordMetadataEnricher(dashScopeChatModel,5);returnkeywordMetadataEnricher.apply(documents);}}

多查询扩展器(MultiQueryExpander)利用大型语言模型将一个查询扩展为多个语义各异的变体,以涵盖不同的视角,这有助于检索额外的上下文信息,并提高找到相关结果的概率。

查询扩写功能。

@ComponentpublicclassMultiQueryExpanderDemo{@ResourceprivateChatClient.BuilderchatClientBuilder;publicList<Query>queryExpand(Stringquery){MultiQueryExpanderqueryExpander=MultiQueryExpander.builder().chatClientBuilder(chatClientBuilder).numberOfQueries(3).build();List<Query>queries=queryExpander.expand(newQuery(query));returnqueries;}}


// 鱼皮的报错了,因为他的chatClientBuilder没有成功注入,于是他通过构造函数来注入,如下:

privateChatClient.BuilderyupiChatClientBuilder;publicMultiQueryExpanderDemo(ChatModeldashScopeChatModel){this.yupiChatClientBuilder=ChatClient.builder(dashScopeChatModel);}

使用多查询扩展的能力的步骤:
1、遍历扩展后的查询列表List,依次每个去使用DocumentRetriever 来召回相关文档。
2、整合召回的文档:将每个查询召回的文档进行整合,形成文档集合。(也可以使用文档合并器去重)
3、使用召回的文档改写prompt:将整合后的文档添加到原始prompt中,为LLM提供更丰富的上下文信息。
显然,多查询扩展会增加查询次数和计算成本,且执行速度可能会慢,慎用。

查询重写和翻译

查询重写和翻译可以使得查询更加精确和专业,但是要注意保持查询的语义完整性。
主要应用包括:

  • 使用 RewriteQueryTransformer 优化查询结构
  • 配置 TranslationQueryTransformer 支持多语言
/** * QueryRewriter类是一个组件,用于重写查询语句 * 它基于向量库 或者 网络搜索能力 来重写查询 */@ComponentpublicclassQueryRewriter{// 另外,也可以通过构造器注入的方式来初始化QueryTransformer,然后在方法中调用QueryTransformer.transform方法。// 构造器注入构造queryTransformer的方式要优于直接在方法中build出一个queryTransformer,因为queryTransformer一般只需要一个就行,不需要每次调用时再重新创建。privateQueryTransformerqueryTransformer;@ResourceprivateChatModeldashscopeChatModel;publicQueryRewriter(){ChatClient.BuilderchatClientBuilder=ChatClient.builder(dashscopeChatModel);this.queryTransformer=RewriteQueryTransformer.builder().chatClientBuilder(chatClientBuilder).build();}publicStringdoRewrite(StringinputQuery){Queryquery=newQuery(inputQuery);QueryrewrittenQuery=queryTransformer.transform(query);returnrewrittenQuery.text();}@ResourceprivateChatClient.BuilderchatClientBuilder;/** * 重写查询方法 * @param inputQuery 原始查询字符串 * @return 重写后的Query对象 */publicStringrewrite(StringinputQuery){// 创建一个新的Query对象,内容为"I'm studying machine learning. What is an LLM?"Queryquery=newQuery(inputQuery);// 构建一个QueryTransformer实例,使用RWriteQueryTransformer// 通过builder模式配置,并传入chatClientBuilderQueryTransformerqueryTransformer=RewriteQueryTransformer.builder().chatClientBuilder(chatClientBuilder).build();// 使用queryTransformer转换查询QuerytransformedQuery=queryTransformer.transform(query);returntransformedQuery.text();}}

检索器配置

检索器配置直接影响检索质量,主要包括三个方面:
相似度阈值、返回文档数量和过滤规则。
相似度阈值直接影响了召回片段数。

返回文档数量TOPK,一般设置3 - 5.

查询增强和关联

经过前面的文档检索,系统已经获取了与用户查询相关的文档。此时,大模型需要根据用户提示词和检索内容生成最终回答。然而,返回结果可能扔未达到预期效果,需要进一步优化。

错误处理机制
在实际应用中,可能出现多种异常情况,如找不到相关文档、相似度过低、查询超时等。良好的错误处理机制可以提升用户体验。
异常处理主要包括:

  • 允许空上下文查询(即处理边界情况)
  • 提供友好的错误提示
  • 引导用户提供必要信息
    边界情况处理可以使用SpringAI 的ContextualQueryAugmenter 查询增强器:
QueryAugmenterqueryAugmenter=ContextualQueryAugmenter.builder().allowEmptyContext(true).build();

默认情况下是不允许空的上下文的,即如果在文档中没有检索到相关信息,则返回的内容是:
用户查询超出了你的知识库范围,礼貌地告诉用户你无法回答。

如果你希望空上下文时,模型依然能返回一些回答,则你可以设置允许空的上下文,即 allowEmptyContext(true) 。

RAG 技术其他的一些技巧和能力

  1. 分离检索阶段和生成阶段的知识块
  2. 针对不同阶段使用不同粒度的文档,进一步提升系统性能和回答质量
  3. 针对查询重写、关键词元信息增强等用到AI大模型的场景,可以选择相对轻量的大模型。

RAG 高级知识

混合检索策略

向量检索:理解语义
全文检索

检索方式原理优点缺点
向量检索嵌入向量相似度理解语义关键词不敏感
全文检索倒排索引 关键词匹配精确匹配 高召回率不理解语义
结构化检索基于元数据或结构化字段查询精确过滤,支持复杂条件组合依赖良好的元数据,不灵活
知识图谱利用实体间的关系进行图遍历发现隐含关系,回答复杂问题构建成本高,需要专业知识

并行混合检索

级联检索

动态混合检索

AI路由器,让AI判断去使用适合什么检索方式。

大模型幻觉

为什么会出现?
1、训练数据中可能存在错误或过时的信息和数据。
2、大模型的本质是预测下一个最大可能概率的词,它倾向于生成流畅而非准确的内容。

如何减轻模型幻觉?
1、通过RAG引入外部知识库,提供更新更准确更相关的上下文信息。
2、鼓励模型诚实地承认不确定性,并加入“引入标注”机制,让模型准确指出信息引入来源于哪一个参考文件。
3、用事实验证模型检查生成内容的准确性,简历关键信息的自动核查机制,或实施人机协作的审核流程。引入准确性和自洽行评分,打分机制,评估LLM的回答质量。
4、其他,如提示工程优化,采用“思维链”提高推理透明度,阴道模型进一步思考。

RAG 应用评估指标

1)检索质量评估

  • 召回率
  • 精确率
  • 高精度均值MAP
    2)生成回答质量评估指标
  • 事实准确性:回答中事实性陈述的准确程度
  • 答案完整性:回答shifou8还该问题的所有方面
  • 上下文相关性:回答与问题的相关程度
  • 引用准确性:引用内容是否确实来自检索上下文

还有诸如:系统性能评估、领域适应性、多语言、时效性、用户满意度等。经常需要引导用户针对AI大模型的回复进行打分。

高级RAG架构

1、自纠错RAG(C-RAG)
解决了模型可能误解或错误使用检索信息的问题,提高回答的准确性。
你给朋友讲一个新闻,不小心添加了一些自己的理解和记错了细节。C-RAG就是为了这个问题而设计的。
C-RAG采用“检索 - 生成 - 验证 - 纠正” 的闭环流程:先检索文档,生成初步回答,然后验证回答中的每个事实陈述,发现错误就立即纠正并重新生成。这种循环确保了最终回答的高准确性,特别适合医疗、法律等对事实准确性要求极高的领域。


2、自省式RAG(Self-RAG)
解决了“并非所有问题都需要检索”的问题,提高回答效率。
提问1+1等于几,LLM可直接回答而无需额外检索。Self-RAG 架构让模型学会了判断:什么时候需要查资料、什么时候可以直接回答。收到提问时,Self-RAG模型会思考:“这个问题我知道答案吗?需要查询更多信息吗?我的回答包含任何不确定的内容吗?” 这种自我反思机制使回答更自然,也提高了回答效率。


3、检索树

结构化的检索方案。

4、多智能体RAG系统
组合拥有各项特长的智能体,复杂任务的协同处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 10:15:37

【Linux系统篇(一)】Linux入门基础指令(一)

在上一篇文章中&#xff0c;我们已经谈过Linux的历史以及如何使用云服务器配置Linux环境和使用Xshell来使用Linux&#xff0c;那么我们在本篇文章中将要开始学习Linux的一些基础指令。 目录 一、关于图形化界面 二、Linux文件以及目录结构 2.1 怎么理解文件 2.2 Linux的文…

作者头像 李华
网站建设 2026/8/5 10:15:30

Claude Code与MCP协议:构建AI驱动的开发工作流中枢

1. 项目概述&#xff1a;从“智能代码助手”到“全能副驾驶”的进化 如果你最近在开发者社区里活跃&#xff0c;大概率会频繁听到两个词&#xff1a; Claude Code 和 MCP 。这不再是简单的“AI帮我补全代码”的故事&#xff0c;而是一场关于如何将AI深度、安全、可控地融入…

作者头像 李华
网站建设 2026/8/5 10:15:15

OpenClaw命令行实战指南:从部署到高级调试的完整操作手册

1. 项目概述&#xff1a;从“玩转”到“精通”的OpenClaw命令行之旅最近在折腾OpenClaw&#xff0c;发现这玩意儿真是个宝藏。它本质上是一个开源的、可扩展的AI智能体&#xff08;Agent&#xff09;框架&#xff0c;你可以把它理解为一个能帮你自动化处理各种任务的“数字员工…

作者头像 李华
网站建设 2026/8/5 10:14:16

Ubuntu系统盘空间优化:迁移软件安装目录与数据存储路径实战指南

1. 项目概述与核心价值如果你在Ubuntu上安装过大型软件&#xff0c;比如JetBrains全家桶、Android Studio&#xff0c;或者玩过Steam上的3A大作&#xff0c;肯定遇到过系统盘空间告急的尴尬。默认情况下&#xff0c;Ubuntu的软件包、应用程序以及用户数据&#xff0c;大多都堆在…

作者头像 李华
网站建设 2026/8/5 10:14:04

Godot多人游戏网络同步:解决多客户端角色位置抖动与瞬移问题

1. 项目概述与核心问题定位 最近在做一个Godot的多人游戏练习项目&#xff0c;进展到第4.5节时&#xff0c;遇到了一个非常典型且棘手的问题&#xff1a;当多个客户端同时控制一个场景中的不同玩家角色时&#xff0c;角色的位置同步出现了混乱。具体表现是&#xff0c;A客户端移…

作者头像 李华
网站建设 2026/8/5 10:11:59

Linux chcon 命令超详细教程|SELinux 安全上下文修改实战

1. 命令简介chcon&#xff08;Change Context&#xff09;命令用于修改文件或目录的 SELinux 安全上下文。SELinux&#xff08;Security-Enhanced Linux&#xff09;是一种强制访问控制&#xff08;MAC&#xff09;安全机制&#xff0c;通过为系统中的每个对象&#xff08;文件…

作者头像 李华