RAG系统效果不达预期?一定要看看这篇详细高效的优化指南!

前言

上篇分享一文带你了解RAG核心原理 通过对RAG系统数据准备数据检索LLM生成三个核心环节拆解分析,详细介绍了RAG系统的原理和工作流程。

伴随着人工智能大模型的火爆,开源免费的RAG系统百花齐放。DifyMaxKBRagFlowAnythingllm 等知识库系统都被视为解决日常工作文档检索的得力工具。然而大家真正使用时总会发现这些RAG系统的性能达不到预期效果。经常出现包括内容缺失数据解析困难关键信息提取不足 等问题,我也经常被问到应该如何简单有效的提升RAG系统的性能

本篇分享我将结合RAG系统的工作原理和日常工作实践,从数据准备数据检索LLM生成三个核心环节出发提出详细的RAG系统优化技巧,大家一起来看一下吧~

(本篇分享和文章一文带你了解RAG核心原理强相关,建议大家先了解RAG核心原理后,再来学习相应的优化措施)

一、RAGFlow开源框架选择

市面上RAG开源系统百花齐放,我们的首要任务就是要选择一款符合工作场景的RAG系统。结合日常工作经验,我对常见的四款开源框架AnythingLLMCherry StudioRAGFlowDify 从数据隐私保护、开发门槛、文档预处理能力、定制化能力和适用场景五个维度进行对比。综合来看我更推荐 RagFlow 作为大家首选,它支持扫描件/表格解析、文本切片可视化调整、多路召回优化答案准确性,甚至有回答索引高亮等用户友好功能。

关于这四款工具的优缺点我列了一个表格如下:

二、数据准备环节优化指南

2.1 高质量的原始数据上传

RAG系统搭建的第一步是上传私域文档数据,包括.txt, .docx, .json, .pdf, .md等多种格式。所谓的"知识"就是这些文档中的文本信息。

大家如果没有了解过RAG系统工作原理,总是一股脑把所有文件直接丢入RAG系统中提取分析,这种粗糙的传递方式很容易将大量垃圾数据传入RAG系统导致其无法准确定位相关答案。为了RAG系统更准确的文本检索,我们在上传数据时应该先进行数据预处理工作,可包含如下步骤:

  1. 停用词和特殊字符过滤: 停用词和特殊字符是指在自然语言处理中,被视为不携带重要信息,对于理解文本内容贡献不大的词汇,比如① 、②、一则等,去除停用词可以减少文本中的噪音,使得重要的信息更加突出,同时还减少了数据处理规模。在上传文档前可以使用jieba分词工具和停用词表 对原始文档进行处理。
  2. 数据清洗和去重: 去除结构复杂内容混乱的文档,同时过滤重复内容,避免赋予重复内容较高权重,这一步骤我推荐可以使用 Unstructed.io工具进行数据的预处理工作。
  3. 大模型数据预处理: 文档内容也可以直接输入大模型通过提示词工程对文档重要内容进行精简,比如提示词:"你是文档总结专家,我将上传一份文档,请帮我将该文档内容进行总结并输出重要的细节内容",将大模型处理后的文档传入RAG系统更容易使其聚焦重点知识。

2.2 更精细的文本分块

文本分块是决定检索质量的关键前置步骤。粗暴或不恰当的分块会导致信息丢失、上下文割裂、检索效率低下等问题,严重影响 RAG 系统的最终表现。然而目前大多数开源RAG系统采用的都是简单的直接按照固定字符数大小的切片策略,极易破坏语义的完整性。比如如下例子:通过固定窗口分块后,如果用户提问"小明什么时间阅读了大模型真好玩的文章?",知识库检索到分块"小明认证阅读大模型真好玩的文章"和问题相近,但是并没有找到确切的时间,所以不会返回结果。

一些开源系统注意到了固定窗口切分存在的劣势,为了缓解在边界处强行切断语义的问题,通常会设置一个"重叠"(Overlap)大小。重叠部分意味着每个块的末尾会与下一个块的开头有一段重复的内容。

下图是AnythingLLM中的块大小设置和重叠部分大小设置的界面:

对于复杂的文档来说,重叠块的设置还是过于简单并不能符合切分需求。为了更精确切分文本块,我在工作实践中参考文章告别粗暴切分:入门 RAG 文本分块,从策略到优化 并选取了五种效果提升由弱到强的提升策略,参考文章中包含了示例代码,大家可以自行实现并对开源知识库系统文本切分的代码进行替换修改:

  • 基于句子的分块: 使用句子分割算法(如基于标点符号 。?!,或使用python NLP 库如 NLTK, SpaCy)将文本分割成独立的句子,然后将一个或多个连续的句子组合成一个 Chunk,使其大小接近目标范围。这种方式更符合自然语言处理的结构,保证语义完整性。但由于句子的长度差异大,可能改变语义完整性,同时对于跨越多个句子的复杂语义关系仍然会被切断。
  • 基于递归字符分块: 提供一个分隔符列表,按优先级从高到低尝试分割。例如,优先尝试按 \n\n (段落) 分割,如果分割后的块仍然太大,再尝试按 \n (换行符) 分割,然后按空格 \s 分割,最后如果还太大,就按字符 "" 分割。目标是在保持较大语义块(如段落)的同时,确保最终块大小不超过限制。这种方式优先使用段落、换行等更有意义的分隔符,尽可能维持文本的逻辑结构。但对于没有明显分隔符的密集文本,可能最终退化为按固定窗口分割。
  • 基于文档结构分块: 解析文档的结构树或特定标记,基于这些结构元素来定义 Chunks。例如,每个 <p> 标签内容作为一个 Chunk,或者每个 Markdown 的二级标题下的所有内容作为一个 Chunk。这种分割高度尊重文档结构,语义连贯性强,缺点和基于句子的分块类似,不同结构间文本长度差异巨大。
  • 基于混合策略分块: 结合了文档结构分块和递归分块的优点,试图达到更好的平衡。首先尝试基于文档结构(如 Markdown 标题)进行高级别分割,然后在这些较大的分割块内部,如果它们仍然超过了目标大小,再使用递归字符分块或句子分块进行细粒度的切分。
  • 基于语义信息分块: 计算相邻句子或小段文字的 Embedding 向量,看看它们在语义上有多接近。当发现前后两部分的"话题"跳跃比较大(语义相似度低于某个设定的"阈值")时,就在这个"语义断裂点"进行切割。这种方法的优缺点特别明显,优点是切分点更"懂"语义,总能在话题自然转变的地方下手。这样能保证每个 Chunk 内部意思高度相关、不跑题,理论上切出来的块更符合人的阅读理解习惯。缺点是时间复杂度太高,且生成语义向量要消耗大量计算资源。

2.3 更强的Embedding 模型

文本分块之后会经过 生成嵌入模型(Embedding Model) 转化为包含语义信息的向量形式。生成向量的质量对于后续检索环节有很大影响。然而现在很多教程只讲解如何配置Embdedding Model, 例如使用Ollama服务下的nomic-embed-text模型,但却忽略了nomic-embed-text模型在中文环境下生成向量的语义相关性远低于其它模型。

工作实践中我总结的对于中文环境下的Embedding Model 效果较好的有gte-large-zh, bge-large-zh-v1.5, m3e-basetao8k,它们的具体效果如下图所示, TOP@n表示前n个结果中相关检索的正确性。

除了常用的四个模型之外,大家也可以关注MTEB 模型评测榜,不同模型的性能排名会定时更新,但大家不要迷信这个榜单,因为该榜单的测试环境大多数在英文环境下,中文文档居多的环境还是要先用以上四种模型尝试。

三、数据检索环节优化指南

3.1 优化检索参数

RAG系统检索结构与一些检索参数息息相关,优化调整这些检索参数是提升RAG系统最直接有效的办法。这里以RAGFlow框架为例,可通过调整以下参数满足大家需求:

  • similarity_threshold:相似度阈值
  • vector_similarity_weight:向量相似度权重与关键词匹配权重的比例

这两个参数的值通常设置为 0-1 之间,值越大向量权重越高。在工业级别使用中建议设置到0.3-0.5之间,平衡专业术语与语义理解。

除以上参数外,为使RAG系统检索返回结果更精确,可以调整top_kscore参数:

  • top_k:用于控制检索系统返回结果的数量k
  • score:用于过滤掉相似度低于score的结果

top_kscore参数经常同时使用,假设 score = 0.7,top_k = 3,则检索系统会先筛选出相似度大于 0.7 的所有结果,再从这些结果中选择分数最高的 3 个结果返回。 如果大家需要更全面的结果,可以适当增加 top_k 的值。如果大家需要更精准的结果,可以适当减小 top_k,并结合较高的 score

3.2 优化检索算法

RAG系统的语义搜索基于向量之间的软相似性对检索结果进行排序,即通过计算向量之间的相似度(如余弦相似度)来确定文档与查询的相关程度,并返回相似度最高的前 k 个结果。这种检索算法还有一定的提升空间。

一种常见优化检索算法的思路是利用混合搜索的技术,混合检索结合了向量检索和文本检索,然后将结果进行融合。混合搜索方法的灵活性高:可以根据具体需求调整两种检索方式的权重,从而提供更全面准确的检索结果。

3.3 结果重排模型ReRank

建议大家使用RAG系统时务必勾选结果重排模型Rerank, 虽然会提高系统的时间复杂度。Rerank模型,顾名思义就是对初步检索结果进行"重新排序"(Re-ranking)的模型。它通过对语义向量相似性初步检索出的候选文档进行更深入的分析,结合查询上下文和候选文档的内容,得出更精确的相关性评分,并据此重新排列这些文档,以确保用户看到的是更符合需求的结果。

我在工作实践中常用的两款Rerank模型是Xinferencebge-reranker-large , 大家可以参考相关博客进行部署。

四、LLM生成环节优化指南

熟悉RAG原理的朋友们看到这里可能要问:RAG系统中大模型的作用仅仅是对检索出的内容进行总结归纳,想不到有什么可以优化的点呀?诚然LLM生成环节的优化相比数据准备环节和数据检索环节的提升要小,但也不失为锦上添花的策略,主要优化手段有如下两点:

4.1 使用非逻辑大模型

使用性能更强劲的大模型是很直观的优化策略,在LLM生成环节阶段,性能较强的模型可以用清晰明了的语言归纳检索结果,同时更容易关注到检索内容中的重要部分。在中文领域,笔者工作实践中常用效果较好的大模型有DeepSeek-V3-0324Qwen2.5-72B 模型。这里不太建议使用DeepSeek-R1QwQ-32b等逻辑模型。它们在文本生成方面的能力并无明显提升,但生成速度慢很多。

4.2 优化提示词

4.2.1 多查询重写提示词策略

大家在提问时通常直接表述问题进行检索,有时候问题的表述偏差很可能导致无法准确找到相关文档。这时候我们可以利用多查询重写策略, 该思想是利用大语言模型对原始问题进行扩展、分解或抽象,生成多个语义相关但视角不同的子查询,从而提高检索系统对用户意图的覆盖能力。

笔者在实际工作中常用的提示词模板如下:

xml 复制代码
你的任务是为给定的用户问题生成3 - 5个语义等价但表述差异化的查询变体,目的是帮助用户克服基于距离的相似性搜索的一些局限性,以便从向量数据库中检索相关文档。  
以下是原始问题:  
<question>  
{{question}}  
</question>  
请生成3 - 5个语义与原始问题等价,但表述不同的查询变体,用换行符分隔这些替代问题。  
请在<查询变体>标签内写下你的答案。
我的输入问题是:如何提高英语写作能力

在多查询重写策略中,每个子问题都会检索出相应的文档片段,从而更全面的获得检索信息。

4.2.2 问题分解策略

面对非常复杂且包含一定推理性的原始问题时,使用多查询重写策略也很难在向量数据中找到关联性高的文档,导致RAG系统效果偏差。这时我们需要尝试问题分解策略。将一个复杂问题分解成多个子问题或者子步骤。

笔者在实际工作中常用的提示词模板如下:

xml 复制代码
你的任务是针对输入的问题生成多个相关的子问题或子查询,将输入问题分解成一组可以独立回答的子问题或子任务。  
以下是输入的问题:  
<question>  
{{question}}  
</question>  
请生成3 - 5个与该问题相关的搜索查询,并使用换行符进行分割。生成的子问题/子查询应具有明确的主题和可独立回答的特点。  
请在<子问题>标签内写下生成的子问题/子查询。
我的输入问题是:如何提高小型企业的市场竞争力?

五、总结

本篇文章从RAG系统数据准备数据检索LLM生成 三个核心环节出发,针对每个环节都提出了相应的优化策略,大家可以尝试组合这些优化策略,预计可将现有RAG系统效果提高20%以上,赶快尝试一下吧。屏幕前的各位如果对文章内容感兴趣可点关注,我会分享更多工作实践中的大模型内容。 也可关注我的同名微信公众号:大模型真好玩,免费分享工作生活中大模型开发知识点和实践经验,大家有什么需求都可通过公众号私信我呦~

除了传统的RAG检索系统,基于知识图谱的RAG系统也是人工智能领域发展的热点项目,代表产品有微软推出的GraphRAG,之后也会在工作实践中尝试,并将GraphRAG与传统RAG检索系统作对比出文章分享大家~

相关推荐
纪元A梦2 分钟前
华为OD机试真题——通过软盘拷贝文件(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
不吃酸的柠檬3 分钟前
MATLAB 中的图形绘制
人工智能·机器学习·matlab
用户8671324957414 分钟前
97% 的 Python 项目可以使用 partial() 更简洁
python
Ai工具分享23 分钟前
6 种AI实用的方法,快速修复模糊照片
人工智能
dundunmm26 分钟前
【每天一个知识点】如何解决大模型幻觉(hallucination)问题?
人工智能·数据挖掘·大模型
勤奋的小懒猪29 分钟前
Halcon应用:相机标定之应用
图像处理·人工智能·计算机视觉
白熊18829 分钟前
【计算机视觉】CV实战项目- 深度解析FaceAI:一款全能的人脸检测与图像处理工具库
图像处理·人工智能·计算机视觉
量子位43 分钟前
实测免费 DeepResearch!轻量版深夜上线,基于 o4-mini,速度更快 / 重视脉络梳理
人工智能·openai
nenchoumi31191 小时前
VLA 论文精读(十八)π0.5: a Vision-Language-Action Model with Open-World Generalization
论文阅读·人工智能·深度学习·语言模型·vla
灏瀚星空1 小时前
从单机工具到协同平台:开源交互式模拟环境的技术演进之路
经验分享·笔记·python·开源·oneapi