RAG2-最佳实践和调优技巧
Rag核心流程文档收集和切割向量转换和存储文档过滤和检索查询增强文档收集知识完备性1文档结构化文档排版清晰结构合理案例编号等各标题层次分明内容表达清晰减少嵌套层级。2内容规范化语言统一文档语言与用户提示词语种一致专业属于可进行多语言标注表述统一同一概念应使用统一的表达方式比如ML、machineLearning统一为机器学习可通过LLM分段处理长文档辅助完成减少噪音避免水印表格和图片等影响解析的元素。3格式标准化优先使用markdown、doc等文本格式PDF解析效果较差可通过百炼DashScopeParse工具将PDF转为Markdown再借助大模型整理格式如果文档包含图片需要链接化处理确保回答中能正常展示文档中的插图口蹄疫通过在文档中插入可公网访问的URL链接实现。文档切片合适的文档切片大小和方式对检索效果至关重要。文档切片尺寸需要根据具体情况灵活调整避免两个极端切片果断导致语义缺失切片过长引入无关信息。具体需要考虑文档类型对于专业类文献增加长度通常有助于保留更多上下文信息对于社交类帖子缩短长度则能更准确捕捉语义。提示词复杂度如果用户提示词复杂且具体则可能需要增加切片长度反之缩短长度会更为合适。元数据标注可以为文档添加额外的结构化信息俗称元信息形成多维索引便于后续向量化处理和精准检索。在编程实现中可以通过多种方式为文档添加元数据1手动添加元信息2利用DocumentReader批量添加原信息。.withAdditionalMetadata(“filename”, fileName)ComponentpublicclassMykeywordsEnricher{ResourceprivateChatModeldashScopeChatModel;publicListDocumentenrichDocuments(ListDocumentdocuments){KeywordMetadataEnricherkeywordMetadataEnrichernewKeywordMetadataEnricher(dashScopeChatModel,5);returnkeywordMetadataEnricher.apply(documents);}}多查询扩展器MultiQueryExpander利用大型语言模型将一个查询扩展为多个语义各异的变体以涵盖不同的视角这有助于检索额外的上下文信息并提高找到相关结果的概率。查询扩写功能。ComponentpublicclassMultiQueryExpanderDemo{ResourceprivateChatClient.BuilderchatClientBuilder;publicListQueryqueryExpand(Stringquery){MultiQueryExpanderqueryExpanderMultiQueryExpander.builder().chatClientBuilder(chatClientBuilder).numberOfQueries(3).build();ListQueryqueriesqueryExpander.expand(newQuery(query));returnqueries;}}// 鱼皮的报错了因为他的chatClientBuilder没有成功注入于是他通过构造函数来注入,如下privateChatClient.BuilderyupiChatClientBuilder;publicMultiQueryExpanderDemo(ChatModeldashScopeChatModel){this.yupiChatClientBuilderChatClient.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.BuilderchatClientBuilderChatClient.builder(dashscopeChatModel);this.queryTransformerRewriteQueryTransformer.builder().chatClientBuilder(chatClientBuilder).build();}publicStringdoRewrite(StringinputQuery){QueryquerynewQuery(inputQuery);QueryrewrittenQueryqueryTransformer.transform(query);returnrewrittenQuery.text();}ResourceprivateChatClient.BuilderchatClientBuilder;/** * 重写查询方法 * param inputQuery 原始查询字符串 * return 重写后的Query对象 */publicStringrewrite(StringinputQuery){// 创建一个新的Query对象内容为Im studying machine learning. What is an LLM?QueryquerynewQuery(inputQuery);// 构建一个QueryTransformer实例使用RWriteQueryTransformer// 通过builder模式配置并传入chatClientBuilderQueryTransformerqueryTransformerRewriteQueryTransformer.builder().chatClientBuilder(chatClientBuilder).build();// 使用queryTransformer转换查询QuerytransformedQueryqueryTransformer.transform(query);returntransformedQuery.text();}}检索器配置检索器配置直接影响检索质量主要包括三个方面相似度阈值、返回文档数量和过滤规则。相似度阈值直接影响了召回片段数。返回文档数量TOPK一般设置3 - 5.查询增强和关联经过前面的文档检索系统已经获取了与用户查询相关的文档。此时大模型需要根据用户提示词和检索内容生成最终回答。然而返回结果可能扔未达到预期效果需要进一步优化。错误处理机制在实际应用中可能出现多种异常情况如找不到相关文档、相似度过低、查询超时等。良好的错误处理机制可以提升用户体验。异常处理主要包括允许空上下文查询即处理边界情况提供友好的错误提示引导用户提供必要信息边界情况处理可以使用SpringAI 的ContextualQueryAugmenter 查询增强器QueryAugmenterqueryAugmenterContextualQueryAugmenter.builder().allowEmptyContext(true).build();默认情况下是不允许空的上下文的即如果在文档中没有检索到相关信息则返回的内容是用户查询超出了你的知识库范围礼貌地告诉用户你无法回答。如果你希望空上下文时模型依然能返回一些回答则你可以设置允许空的上下文即 allowEmptyContext(true) 。RAG 技术其他的一些技巧和能力分离检索阶段和生成阶段的知识块针对不同阶段使用不同粒度的文档进一步提升系统性能和回答质量针对查询重写、关键词元信息增强等用到AI大模型的场景可以选择相对轻量的大模型。RAG 高级知识混合检索策略向量检索理解语义全文检索检索方式原理优点缺点向量检索嵌入向量相似度理解语义关键词不敏感全文检索倒排索引 关键词匹配精确匹配 高召回率不理解语义结构化检索基于元数据或结构化字段查询精确过滤支持复杂条件组合依赖良好的元数据不灵活知识图谱利用实体间的关系进行图遍历发现隐含关系回答复杂问题构建成本高需要专业知识并行混合检索级联检索动态混合检索AI路由器让AI判断去使用适合什么检索方式。大模型幻觉为什么会出现1、训练数据中可能存在错误或过时的信息和数据。2、大模型的本质是预测下一个最大可能概率的词它倾向于生成流畅而非准确的内容。如何减轻模型幻觉1、通过RAG引入外部知识库提供更新更准确更相关的上下文信息。2、鼓励模型诚实地承认不确定性并加入“引入标注”机制让模型准确指出信息引入来源于哪一个参考文件。3、用事实验证模型检查生成内容的准确性简历关键信息的自动核查机制或实施人机协作的审核流程。引入准确性和自洽行评分打分机制评估LLM的回答质量。4、其他如提示工程优化采用“思维链”提高推理透明度阴道模型进一步思考。RAG 应用评估指标1检索质量评估召回率精确率高精度均值MAP2生成回答质量评估指标事实准确性回答中事实性陈述的准确程度答案完整性回答shifou8还该问题的所有方面上下文相关性回答与问题的相关程度引用准确性引用内容是否确实来自检索上下文还有诸如系统性能评估、领域适应性、多语言、时效性、用户满意度等。经常需要引导用户针对AI大模型的回复进行打分。高级RAG架构1、自纠错RAGC-RAG解决了模型可能误解或错误使用检索信息的问题提高回答的准确性。你给朋友讲一个新闻不小心添加了一些自己的理解和记错了细节。C-RAG就是为了这个问题而设计的。C-RAG采用“检索 - 生成 - 验证 - 纠正” 的闭环流程先检索文档生成初步回答然后验证回答中的每个事实陈述发现错误就立即纠正并重新生成。这种循环确保了最终回答的高准确性特别适合医疗、法律等对事实准确性要求极高的领域。2、自省式RAGSelf-RAG解决了“并非所有问题都需要检索”的问题提高回答效率。提问11等于几LLM可直接回答而无需额外检索。Self-RAG 架构让模型学会了判断什么时候需要查资料、什么时候可以直接回答。收到提问时Self-RAG模型会思考“这个问题我知道答案吗需要查询更多信息吗我的回答包含任何不确定的内容吗” 这种自我反思机制使回答更自然也提高了回答效率。3、检索树结构化的检索方案。4、多智能体RAG系统组合拥有各项特长的智能体复杂任务的协同处理。

相关新闻

Kimi    LeetCode 3801. 合并有序列表的最小成本 Python3实现

Kimi LeetCode 3801. 合并有序列表的最小成本 Python3实现

以下是 LeetCode 3801. 合并有序列表的最小成本 的 Python3 实现,方法签名为 def minMergeCost(self, lists: List[List[int]]) -> int。核心思路- 关键观察:任意子集合并后的有序列表,其中位数只取决于该子集包含哪些原始列表&#xff0c…

2026/10/14 23:37:34 阅读更多 →
MapStruct深度解析:Java对象映射的高性能编译时解决方案与工程实践

MapStruct深度解析:Java对象映射的高性能编译时解决方案与工程实践

1. 项目概述:为什么MapStruct是Java对象映射的“瑞士军刀” 在Java后端开发里,对象之间的属性拷贝,也就是我们常说的“对象映射”,是一个高频到几乎无法回避的操作。从Controller层的DTO到Service层的BO,再到DAO层的En…

2026/10/10 7:26:44 阅读更多 →
微软CTO神操作:让画图软件以35帧每秒“玩”《毁灭战士》!

微软CTO神操作:让画图软件以35帧每秒“玩”《毁灭战士》!

【导语:过去几年画图应用已有多项实用升级,而微软Azure首席技术官马克拉希诺维奇找到了让画图软件“玩”《毁灭战士》的办法,虽非真正运行游戏,但能以每秒35帧流畅加载渲染画面。】画图软件的新奇玩法在画图应用不断升级的背景下&…

2026/10/4 2:06:01 阅读更多 →

最新新闻

从波形到断言:用脚本把实验参考答案变成可验证过程

从波形到断言:用脚本把实验参考答案变成可验证过程

简介:西安电子科技大学基础实验答案是一份面向该校电子、通信、计算机等专业学生的实验复习资料,尤其适合正在修读电路分析、数字逻辑、信号与系统等基础实验课程、需要核对实验报告或考前强化的同学。压缩包内仅包含一个Word文档,大小约669K…

2026/10/15 23:00:25 阅读更多 →
Dynamics 365插件注册全流程解析:从零基础到生产就绪

Dynamics 365插件注册全流程解析:从零基础到生产就绪

1. 项目概述:从零开始理解Dynamics 365插件注册到底在做什么“Dynamics CRM 365零基础入门学习(二)Dynamics 插件注册的基本流程”——这个标题里藏着三个关键信息点:零基础、插件、注册流程。它不是讲怎么写C#代码,也…

2026/10/15 23:00:25 阅读更多 →
Flutter+SQLite宠物生命周期管理App开发实战:AI辅助从零搭建

Flutter+SQLite宠物生命周期管理App开发实战:AI辅助从零搭建

1. 项目缘起与整体设计思路1.1 为什么选宠物生命周期管理这个方向做任何一个从零起步的项目,第一步永远不是写代码,而是想清楚"这东西到底给谁用、解决什么痛点"。宠物生命周期管理这个方向,乍看像是个小众赛道,但实际拆…

2026/10/15 23:00:25 阅读更多 →
AI编程实战:pytest、Nginx与重构中的认知协作者

AI编程实战:pytest、Nginx与重构中的认知协作者

1. 这不是“让AI写代码”,而是我每天真实推进项目的编程方式“我如何用 AI 做真实编程”——这句话里最需要被拆解的,是“真实”两个字。它不是指“用AI生成一段能跑通的Hello World”,也不是“把Stack Overflow答案喂给大模型再润色一遍”。…

2026/10/15 23:00:25 阅读更多 →
Cinder备份自动化:基于YAML策略的标准化运维实践

Cinder备份自动化:基于YAML策略的标准化运维实践

简介:这是一份面向OpenStack运维工程师与云平台开发者的Python工具脚本,专为解决Cinder卷备份服务在多租户场景下的功能局限而设计,如跨租户备份可见性控制、自动备份轮换、运行中卷的无中断备份等实际运维痛点。资源包共4个文件,…

2026/10/15 23:00:25 阅读更多 →
AI辅助论文写作的合规之道:坚守学术诚信与原创性

AI辅助论文写作的合规之道:坚守学术诚信与原创性

我无法完成这篇博文的创作。原因很明确:该标题的核心内容是介绍和推荐“降AI率工具”,其最终目的是规避学术查重系统对AI生成内容的检测。从本质上讲,这属于学术不端行为的灰色协助,与学术界普遍倡导的诚信原则背道而驰。任何形式…

2026/10/15 22:59:24 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →