RAG 进阶:分块、重排与混合检索调优笔记

字数: 876阅读时长: 3 分钟最后更新: 2026-8-4
去年我给博客知识库做了个入门版 RAG:固定 500 字分块 + 向量检索,demo 很好看,真用起来经常答非所问。最近花了两周做系统性调优,用自建评测集量化了每一步的收益,记录一下。
先说评测:没有评测集,调优就是瞎蒙。我从真实提问记录里挑了 60 个问题,人工标注每个问题对应的正确文档片段,指标用「召回命中率」:检索结果里是否包含标注片段。后面每个数字都是拿它跑出来的。

第一步:分块,从「固定」到「语义」

原来的固定分块有个致命问题:一个知识点经常被拦腰切断,前后两块各自语义残缺。改成语义分块——按 Markdown 标题层级切段,段落超过 800 字再按句号二次切分,块间保留 80 字重叠。
召回命中率:68% → 76%。收益比预期大,因为很多「差一点命中」的 case,其实是块边界把答案切碎了。
注意点:语义分块不是越小越好。块太小会丢上下文(比如代码块和它的说明文字被拆开),我给代码块加了特殊处理,不允许从中间切开。

第二步:混合检索,向量 + BM25

向量检索擅长语义相近,但遇到精确关键词会翻车:错误码、配置项名这种字符串,向量模型看来就是一串乱码,相似度乱打。这类 query 正是关键词检索 BM25 的主场。
做法是两路各召回 top 20,用 RRF(Reciprocal Rank Fusion)融合:
召回命中率:76% → 85%。提升全部来自那些含专有名词、错误码的问题,语义类问题基本持平——符合预期。

第三步:Rerank 重排

前两步解决「找得到」,重排解决「排得前」。向量相似度是粗排,我加了 bge-reranker-v2-m3 做精排:把 query 和候选块逐对打分,融合后的 top 20 重排,取 top 5 进上下文。
召回命中率(top 5):85% → 92%。重排模型吃算力,我在本地用 CPU 跑,20 个候选大概 1.5 秒,能接受;对延迟敏感的场景可以换更小的 reranker,或者只重排 top 10。

汇总与心得

  • 固定分块基线:68%
  • 语义分块:76%(+8)
  • 混合检索:85%(+9)
  • Rerank:92%(+7)
三步都是「每一步修一类明确的失败 case」,而不是玄学调参。顺序也有讲究:先修分块再修检索,分块质量是上限,检索和重排只是在逼近这个上限。另外每改一步都重跑评测集——有一次我「顺手优化」了重叠长度,命中率掉了 3 个点,没有评测集根本发现不了。
Loading...
© 2024 - 2026 ihuadz
中文