资讯动态

RAG实战指南:从分块策略到向量检索的工程优化

发布时间:2026/10/20 8:49:12 来源:尧图企业网站定制
1. RAG为什么火大模型的“记忆力”有多大局限1.1 静态参数的天然短板先聊一个很多接触大模型不久的人容易忽略的事实传统大模型的“知识”其实是在训练阶段一次性固化在参数里的。训练结束之后模型本身不会再主动获取任何新信息也不会因为某条新闻、某份内部文档、某个数据库的更新而改变自己对世界的认知。你可以把它想象成一位在毕业那天把所有知识都背下来的学生之后无论世界怎么变化他回答你的内容始终停留在毕业那一刻的记忆里。这个特性带来两个直接问题。第一是知识时效性差。比如某个产品的最新版本已经在两个月前发布模型如果训练数据只覆盖到更早的时间它给出的版本号、功能列表、兼容性说明大概率都是错的。第二是知识覆盖度不足尤其针对特定业务场景。通用模型见过海量公开语料但对于某个企业内部的产品手册、售后工单、研发文档、合规条款这类私有资料它根本“没读过”自然也就答不出准确信息。很多人一开始误以为大模型是万能的实际一用才发现它对自己的训练数据边界之外的知识几乎是“一窍不通”。更麻烦的是幻觉问题。当模型遇到知识盲区它不会老老实实说“我不知道”而是会基于概率生成一段听起来很像那么回事、实际却完全没依据的答案。这种现象原因并不复杂模型的解码过程本质是在选择下一个最可能的token这个选择依赖的是训练阶段学到的语言模式而不是对事实的验证。于是“一本正经地胡说八道”就成了大模型落地时最让人头疼的问题之一。1.2 RAG要解决的不只是“知识新”那怎么让模型既保持原有能力又能掌握最新的、私有化的知识业内跑通的主流方案就是RAG全称Retrieval-Augmented Generation检索增强生成。它的思路用一句话概括不把知识塞进模型的参数里而是在回答问题时先从外部知识库检索相关内容再把检索结果作为上下文一并交给模型生成答案。这个思路和人类查资料很像。一个专家不可能记住所有细节但他知道在回答问题时去查哪本手册、翻哪份档案把查到的内容结合自己的判断组织成答案。RAG就是给大模型配了一个外挂资料库让它在每次回答前先“翻书”再“开口”。这也是它区别于微调Fine-tuning的关键所在。微调的做法是把新知识通过额外的训练步骤写进参数里模型被“重塑”了一遍。但微调有几个绕不开的短板成本高每次知识更新都要重新训练周期长训练、评估、上线一套流程走下来往往以天甚至周为单位还有灾难性遗忘的风险新知识学进去旧能力可能反而退化。RAG则完全不同知识放在外部向量数据库或者文档索引里更新知识只需要更新外部数据源模型参数一行都不用动。这一下子就解决了知识时效性和私有化接入的问题。所以RAG本质上解决的是三个层面的事让模型能回答训练数据之外的新知识让模型能结合业务私域数据给出精准回答同时大幅降低幻觉的发生概率。它不是要替代大模型本身而是给大模型补上了一个动态知识接入层。理解了这一点再去看RAG的各种技术细节思路就会清晰很多。2. 拆开RAG三段式工作流的每个环节2.1 索引阶段先得让文档“可被检索”RAG的完整流程可以拆成三段索引、检索、生成。第一步是索引阶段这个阶段做的事情是把一堆原始文档变成能让计算机快速查找的结构化数据。原始文档是没法直接被向量检索的。你手里的PDF、Word、Markdown、HTML甚至是一堆数据库记录首先要做解析和清洗。解析解决的是“格式兼容”问题把不同格式的文本抽出来清洗解决的是“噪音”问题去掉页眉页脚、重复段落、无意义的符号、乱码等。这个过程看着简单实际很考验细节。比如PDF里的表格直接抽文本经常会丢掉行列关系检索的时候自然就找不准扫描件还需要先走OCR识别识别的准确率又会直接影响后续检索效果。文本抽出来之后下一步是分块Chunking。这一步在很多人看来不起眼却是整个RAG系统里最影响效果、也最容易翻车的环节。分块策略好不好直接决定了一个问题是能在知识库里命中准确片段还是检索回来一堆碎片化、语义残缺的文本。这部分我会在后面单独开一节详细讲这里先了解它的大方向即可。分块完成之后每个块要做两件事一是向量化Embedding把一段文本映射成一个高维向量二是写入向量数据库同时建立对应的索引结构。向量化的核心目标是让语义相近的文本在向量空间里距离相近。比如“如何申请年假”和“年假申请流程”这两句话字面上差得远但embedding出来的向量应该很近因为语义是一样的。这是后续语义检索的基础。到这个阶段知识库的“内功”就算练好了文档被切成了若干语义单元每个单元都有自己的向量坐标等着被检索调用。2.2 检索阶段从相似度到语义的距离用户发起一个问题之后检索阶段就把问题也做一次向量化然后在向量数据库里搜索和问题向量最相似的文本块返回Top-K个结果作为候选上下文。这里有个关键点需要理解向量检索返回的不是“内容相同”的文本而是“语义相似”的文本。比如用户问“产品保修期多久”知识库里可能没有“保修期”这三个字但有一句“自购买之日起一年内因非人为因素导致的故障可免费维修”这两句话语义相关向量距离近就能被检索到。这是向量检索相比传统关键词检索最大的优势也是RAG能理解自然语言提问的原因。但语义检索也有自己的盲区比如精确匹配的场景。用户查“订单号T20240115的状态”如果用纯向量检索模型并不擅长精确匹配这种标识符类的信息。所以现在很多成熟的RAG系统都会选择混合检索也就是向量检索和关键词检索BM25这类算法并行再把结果做融合排序。这个细节后面我在工程落地部分会展开。检索质量直接决定了生成质量。这个道理很容易理解如果检索回来的上下文就是错的那不管模型多强生成出来的答案都不可能对。RAG系统里流传着一句话垃圾进垃圾出。检索不到相关内容或者检索结果不相关是RAG效果差的最主要原因远多于生成环节的问题。2.3 生成阶段上下文注入与提示词设计检索完成后把用户原始问题和检索到的文本块拼接成提示词交给大模型生成答案。这是RAG的最后一步也是很多人以为不需要优化、实际上大有文章的一步。提示词里要说明清楚哪些是参考材料哪些是用户问题模型的任务是什么。一个简单的提示词模板大致长这样请根据以下参考材料回答问题。如果参考材料中找不到答案请直接说明“根据现有资料无法回答”不要编造内容。 参考材料 {检索到的文本块拼接} 用户问题{用户问题}这个模板里有三个设计要点。第一是明确告诉模型“参考材料”和“问题”的分界避免模型把参考材料和问题混在一起第二是强制模型在缺乏信息时承认不知道这是扼制幻觉的一个直接有效的手段第三是不要给模型过多的自由发挥空间要求它严格基于材料作答。这里有一个很常见的误区有人以为把检索到的所有文本块全部塞进提示词里信息越多模型答得越好。实际恰恰相反。一方面大模型的注意力会被无关内容分散真正的关键信息反而容易被淹没另一方面上下文越长生成延迟越高成本也越高。所以这里的目标不是“越多越好”而是“精简且准确”。这也引出后面要讲的重排序Rerank环节它存在的意义就是在检索出的候选结果里把真正有用的排在前面把没用的挤出去。生成阶段还需要留意一个能力边界模型并不具备“自动区分参考材料里哪句是可信的、哪句是噪音”的能力。换句话说如果检索回来的上下文本身包含互相矛盾的信息模型很可能把两个矛盾点都吸收进去然后生成一个逻辑上并不自洽的答案。这个问题的解决办法又得回到检索质量上做文章而不是在生成提示词这一层强行修补。3. 分块策略最能看出功力的隐性环节3.1 分块的本质是在平衡两件事很多人容易忽略的是其实分块是整个RAG系统里最不性感但最决定效果的一环。分块的本质是在两个互相矛盾的目标之间找平衡块太小单个块包含的语义信息不足检索时容易漏掉关键内容块太大每个块里有大量无关信息语义向量被“稀释”相似度计算的精度就会下降。用一个生活里的例子来说。假设你要从一本几百页的操作手册里找到“如何重置管理员密码”这一小节。如果把整本手册作为一个单元你确实能保证“信息都在里面”但向量化之后整本手册的语义跨度非常大包含大量和“重置密码”无关的内容查询向量和整本手册的向量之间的相似度会被拉低如果把手册按每个句子切分每句都是独立单元那“打开控制台”“输入新密码”“确认修改”这三句被切散了单独每一句都无法完整回答问题。所以分块要做的事就是找到那个“包含了足够上下文又不混入太多无关信息”的粒度。这个粒度没有统一标准和文档类型、内容密度、检索场景都有关系。但有一个很好的直觉可以参考尽量让每个块是一个“语义完整”的单元。一个块应该能独立回答某类问题而不是要求多个块拼凑在一起才能理解。基于这个直觉才有了下面几种分块策略。3.2 固定大小分块最稳妥的基线方案固定大小分块是最容易理解也最容易实现的策略设定一个chunk_size块的大小通常按字符数或token数计算然后从头到尾把文本切成等长的片段为了避免语义断裂再设置一个overlap重叠长度让相邻块之间保留一部分重复文本。实际配置中chunk_size比较常见的起点是300到800个tokenoverlap一般取chunk_size的10%到20%。比如一个常见的配置是chunk_size500、overlap50。这样做的好处是代码实现简单处理速度快效果也基本可控适合作为系统的基线方案先跑起来。不过固定分块的缺点也很明显它完全不考虑文本的语义边界。一个段落可能被从中间拦腰切断一句话可能被拆成两半导致块内文本语义不完整。检索的时候命中的块可能正好是“半句话”模型拿着这半个句子自然没法给出完整的回答。所以固定分块只能作为基线而不是终极方案。我自己的习惯是先用固定分块把整个流程跑通确认向量检索、生成链路没有问题之后再切换到更精细的分块策略上做效果优化。3.3 结构感知分块与递归切分更好的分块方式是借助文档本身的结构信息。Markdown的标题层级、HTML的段落标签、PDF的章节标题、代码文件里的类和方法定义这些都是天然的“语义边界”。结构感知分块就是先识别文档的结构层级再在每个层级内部做切分尽可能保证一个块包含完整的章节或段落。以Markdown文档为例可以按标题级别来切分#一级标题下的内容归为一个块##二级标题下再细分。这样切出来的块往往语义非常聚焦因为每个块天然对应一个主题。而且文档的标题本身能作为块内容的“摘要关键词”对后续检索也有帮助。更通用一点的做法是递归切分这也是很多成熟框架内置的策略。思路是先用一组预定义的文本分隔符比如\n\n、\n、句号、分号按优先级依次尝试切分如果某个分隔符切出来的块仍然超过目标长度就用下一个更低优先级的分隔符继续递归切分。这样做的好处是能在“保持语义完整”和“控制块大小”之间取得更好的折中。还有更高级的方式比如基于embedding的语义分块通过检测文本向量之间的突变点来确定切分位置。这种方式的成本更高但能捕捉到“上一段在讲规格、下一段在讲价格”这类语义切换。在实际项目中如果文档类型比较固定结构又清晰结构感知分块往往是性价比最高的选择如果文档类型五花八门没有稳定结构递归切分加适当调参更实在。3.4 小体积分块与大上下文窗口的取舍现在的大模型上下文窗口越来越大动辄128K、200K的也不少。这就引出一个问题既然模型上下文窗口那么大直接把整篇文档塞进去让模型自己找答案不是更省事吗这个思路乍看有道理实际却行不通。第一是成本问题上下文越长每次调用的价格和延迟都在涨生产环境里根本扛不住第二是检索精度问题长上下文会让模型“淹没”在大量无关信息中注意力被分散反而不如短小精悍的相关上下文效果好第三是相关性评判问题你的评估指标没法细粒度地观测模型到底用了哪一段信息出了问题很难定位。所以现在的共识是RAG还是要靠精准检索不能指望靠上下文窗口硬扛。窗口大放大了RAG的上限比如你可以把更多的候选上下文块传给模型而不必过分纠结于只传3个还是5个块但它不会替代检索的必要性。也就是上下文窗口是“冗余空间”不是“主存储”。设计RAG时还是要以“检索到精准的、小块的内容”为核心目标上下文窗口只是给你多一份容错空间。4. 向量检索与重排序召回质量的关键抓手4.1 选Embedding模型时的几个判断点所有文本都要过embedding模型所以embedding模型的质量直接决定了检索的天花板。现实里没有最好的embedding模型只有适合你的数据分布和技术栈的模型但有几个通用的判断点可以参考。第一个判断点是语义理解能力。这个能力不好直接量化一个简单的方法是拿你自己的数据做测试准备十几条真实用户问题每个问题配一条“期望命中的文本”然后跑一遍检索看Top-K里能否命中目标文本。跑分高的模型对于你的场景才是有意义的。这个动作不用搞得太复杂却能筛掉很多“面试很强、实战不行”的模型。第二个判断点是对领域术语和长短文本的支持。如果你的知识库是法律文书或医疗文献术语密度很高通用embedding模型可能并不了解这些词之间的语义关系这时候微调或者选领域适配的模型效果会更好。另外大部分embedding模型对中文的支持明显弱于英文尤其是老一代模型这一点需要实测不要看榜单直接拿自己的文档测。第三个判断点是向量维度与检索性能。维度越高理论上能承载的信息越多但计算和存储成本也越高。常见的维度有768、1024、1536、3072等。如果你的知识库有几百万个块高维度带来的存储和查询成本就不是小数目需要提前评估。顺带提一句查询侧和文档侧最好用同一个embedding模型。如果你用模型A给文档建索引却用模型B给用户问题做向量化那文档向量和查询向量根本不在同一个语义空间里检索效果一定会崩。这个错误我见过不止一次排查半天才发现是两套向量模型混用了。4.2 Rerank的必要性与实操向量检索返回的Top-K结果只是“语义上比较相似”的结果实际不一定都相关。比如用户问“产品的退款政策”一个关于“退换货物流时长”的文本块虽然也涉及“退”但并不是用户真正想找的信息却可能因为语义相似排在前列。这时候就需要Rerank环节用更精细的模型对Top-K候选做一次重新打分和排序。Rerank模型和embedding模型的工作方式不一样。Embedding模型是把文本压缩成一个向量用向量距离衡量相似度Rerank模型则是把用户问题和候选文本拼接成一个输入直接让模型输出一个相关性分数。因为Rerank能看到完整的词汇交互所以打分精度远高于纯向量相似度。代价是更慢、更贵这也是为什么它要放在粗排向量检索之后、精排的位置上而不是替代粗排。实操时典型的流程是向量检索先召回50到100个候选再用Rerank模型从里面选出5到10个最优的传入生成阶段。这个流程在可接受的速度成本下能把检索精度提高一个明显的档次。Rerank模型的选择也有讲究。要关注模型的输入长度限制如果候选文本块很长超过模型支持的最大长度需要先做截断还要关注模型对中文的支持程度和打分的分辨力有些模型打出来的分数普遍很高区分度不够这种在实际场景里就不太好用。4.3 混合检索从RAG-Fusion看互补性纯向量检索擅长语义匹配但对精确匹配、专有名词、编号代码这类场景往往无能为力。比如用户查询“设备型号为RD-820的设备故障率”向量检索可能觉得“RD-820”和“RD-830”很像从而召回错误型号。而关键词检索比如BM25恰恰擅长这类精确匹配因为它基于词典命中和词频统计。于是就有了混合检索的思路向量检索和关键词检索并行各自返回一批候选结果再通过RAG-Fusion这类算法做结果融合。简单来说就是把多路检索结果看成一个整体按排序位置给每篇文档计分最后把不同来源的分数相加按总分重新排序。这样做的好处是既保留了语义搜索的泛化能力又兼顾了关键词搜索的精确性两类方法的盲区互相被填补。实际落地时混合检索的权重怎么配不是固定的。有的场景语义相关性更重要向量结果权重可以高些有的场景代码、型号、人名这类精确匹配更多关键词结果就要占更大的比重。这个只能靠标注样本和实验去调没有一劳永逸的答案。关键是脑子里要有这根弦检索通道不是只能选一条多条通道互补才是生产级系统的常态。5. 工程落地参数配置与实验调优5.1 一套可参考的初始配置工程上落地一套RAG不要上来就追求花哨的策略先把一套保守的基线配置跑起来再逐步调优。我这里给你一份我自己反复用过、作为起步基本不出大错的配置组合参考价值比较直接。配置项建议值说明Embedding模型按语言和领域选择中文场景优先实测查询侧和文档侧必须一致分块策略递归切分chunk_size500overlap50先用固定参数跑通再按文档类型微调向量数据库任选主流向量库注意索引类型小规模用暴力检索也能接受粗排召回量Top 50给Rerank留足候选空间Rerank模型独立精排模型粗排和精排分离优先保证精度最终传入上下文Top 3到5个块控制在模型输入合理范围提示词策略严格基于材料回答禁止编造材料不足时明确说明这套配置的核心思路是放大召回的容量再用精排来提高精度。粗排阶段宁可多召回一些可能相关的块避免漏掉真正有用的信息精排阶段再做精细化筛选保证进入生成阶段的材料质量。一开始就只召回前三名万一中间有个召回偏差后面补救的余地都没有。5.2 评估指标从“感觉好用”到可量化很多团队做了RAG半天评估全靠“我拿几个问题试了一下感觉还行”。这种评估方式在demo阶段没问题但到了生产环境就根本站不住脚。因为感觉是会骗人的而且“感觉还行”没法指导后续的迭代优化。要系统化评估一套RAG建议拆成两部分来看检索质量和生成质量。检索质量最常用的指标是命中率RecallK和准确率PrecisionK。具体做法是准备一组评测问题集给每个问题预先标注好“期望命中的文本块”然后跑检索看看Top-K结果里有没有出现期望命中的块。命中率越高说明检索能力越强。这里的K怎么选就看你后续给了生成模型多少上下文。生成质量的评估更复杂一些一般会从答案正确性、忠实性、完整性几个维度打分。忠实性尤其重要它衡量的是“答案里的每个结论是否都有参考材料支撑”。这一步可以用手工评分也可以借助大模型做自动评估。我建议两种结合用大模型批量初筛人工抽检最终结果。纯靠大模型自动评偶尔会出现对荒谬答案给出高分的情况这本身也是一个值得留意的坑。5.3 成本与延迟优化RAG系统的成本主要集中在两个地方一是知识库建索引时的embedding计算和存储这部分是一次性成本二是每次查询时的embedding检索和Rerank调用这部分是持续成本。建索引的成本相对好控制只在文档更新时产生。查询侧成本则要看你的线上QPS每次查询如果走“向量检索Rerank大模型生成”全链路延迟和费用都不低。优化手段主要在几个方向向量检索的索引类型HNSW这类近似最近邻算法能明显降低检索延迟、Rerank的候选集大小不用每次都Rerank全部候选、以及上下文裁剪和缓存高频相似问题可以直接命中缓存省掉整条链路。还有一点容易被忽略不要什么事都丢给大模型做。有些问题其实用规则或者关键词匹配就能解决得更快更便宜比如“有没有货”“开放时间是什么”这类问题完全可以在检索层面直接给出确定性答案不必走到生成环节。把最贵的生成模型用在真正需要语义理解和组织语言的地方系统整体性价比才会高。6. 常见问题与排查技巧实录6.1 检索不到或召回不相关这是RAG落地时出现频率最高的问题。检索不出内容生成环节再怎么努力也白搭。排查思路建议从下往上逐层看。先看知识库建得对不对。原始文档有没有成功解析段落有没有丢失表格是不是被抽成了乱码这些可以通过直接在向量数据库里捞几条文本看一眼来确认。再看分块是否合理如果块太大导致语义稀释检索结果会“模模糊糊”地相关但不精准如果块太小导致语义残缺检索结果可能完全跑偏。如果文档和分块都没问题下一步就要测embedding模型本身。拿一条真实问题和一条期望命中的文档分别向量化后计算相似度如果相似度得分极低说明模型并不认为这两个文本语义相关这时候要么换模型要么考虑是否需要用混合检索补充关键词通道。这里有一个我在实践中很受益的定位方法先把Rerank和生成环节都去掉直接在向量数据库里做暴力检索看返回结果。如果这一步返回的结果就是不准的那后面加什么高级环节都救不回来如果这一步结果是对的只是Rerank把它排掉了那就单独调Rerank。这个二分法能快速把问题定位到具体环节而不是整条链路一起猜。6.2 生成结果依然像“编造”好不容易检索到了相关文本结果大模型生成答案时还是像在编故事这种情况也很常见。原因往往是提示词没有约束住模型的“发挥欲”。先检查提示词里有没有明确要求“严格基于参考材料作答”。很多人只是把参考材料堆进去了没有告诉模型怎么用模型自然按照自己的惯性来。另一个常见原因是参考材料本身包含的信息不足以回答问题但提示词里又没给模型“说不知道”的选项于是模型只能自己脑补。这就需要在提示词里加一句如果参考材料无法支撑答案必须明确回复“根据现有资料无法回答”。还有一种情况我没有罪证很多初学的人会踩检索回了多个块其中只有一个块是相关的其他都是打酱油的。模型把所有块都视为同等可信的上下文结果被无关信息带偏。这种时候就该去检查为什么无关内容能混进Top-K是Rerank没筛干净还是候选集太小导致有效信息被挤掉。生成质量的下滑很多时候源头在检索质量不要只盯着提示词改。6.3 多个文档碎片互相矛盾知识库里不同来源的文档对同一个问题可能给出不同的说法。比如产品文档里说保修一年售后服务条款里却提到某些部件保修两年。检索阶段可能同时召回这两个碎片模型面对互相矛盾的上下文生成的答案自然飘忽不定。处理这类矛盾有几个层面的手段。第一是靠分块和检索把范围尽量收窄让模型只看到最相关的一份资料第二是在提示词里增加指令让模型优先采信某种来源的文档或者要求它在不同文档有冲突时明确指出来而不是自行融合第三是在知识库层面做权威性标记比如给不同来源的文档打上权重标签检索排序时优先返回权威来源的内容。这几个手段不冲突可以组合使用。我个人的经验是先别急着把矛盾交给模型自己判断。模型不具备对两个矛盾碎片的“仲裁能力”它只会被最近的上下文带走。更好的做法是在知识库建设阶段就明确来源的优先级让矛盾在检索阶段就被尽量规避掉。6.4 延迟高用户等不起RAG链路比普通大模型调用多出了检索和Rerank两个环节延迟自然更高。如果用户等不起影响体验就需要在工程上做一些取舍。最直接的优化是做缓存。相同或高度相似的问题直接复用上次的生成结果不再走检索和生成链路效果提升非常明显。其次是压缩候选集Rerank阶段不需要对全部候选打分可以先通过一个更简单的规则或者向量阈值粗筛一遍。再者是换更轻量的生成模型如果问题场景对复杂推理要求不高一个7B到14B的模型可能就够用响应速度远快于70B级别的大模型。还有一点值得提的是异步化和流式输出。流式输出能让用户先看到内容逐字出现感知延迟明显降低异步化则可以把耗时的知识库更新和检索任务放到后台执行不阻塞主流程。这些都属于工程细节但往往比调整模型参数更直接地改善用户体验。做RAG这么久我的体会是它不是一个单一模型或者单一算法能撑起来的东西而是一整套系统工程。每一个环节——文档解析、分块策略、embedding模型、向量检索、Rerank、提示词设计、评估迭代——都能让最终效果发生质变也都能成为翻车的源头。如果你现在正打算在这条路上尝试我建议你记住两件事一是先跑通再调优不要在第一版就追求极致二是所有优化动作都要基于明确的评测结果不要凭感觉瞎调。最后分享一个小观察真正拉高RAG效果的往往不是用了什么新模型而是对知识库细节的处理足够到位——分块分得准、脏数据清得干净、检索参数调得合适。把这些基础活做到位RAG的效果自然会给你惊喜。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑