当前位置: 首页 > news >正文

RAG 工程实践:分块策略、Rerank、混合检索,这些细节决定效果上限

上一篇我们把 Milvus 从零搭起来,完成了语义检索的底座建设。但我发现很多同学搭完之后,效果一般,明明向量库有答案,就是检索不出来——这篇讲的,就是那些把 RAG 效果从"能用"拉到"好用"的工程细节。

分块没设计好,召回率顶多50%。加了 Rerank,精准率能直接翻倍。这不是玄学,是工程。


01 为什么 RAG 效果差?先定位问题根源

很多人调了半天 prompt,结果大模型还是答错了。根源不在生成,在检索。

RAG 的效果链路是:

用户问题 │ ▼ [ 检索层 ] │ ├── 分块质量差 → 上下文残缺 → 召回无关块 ├── 只用向量检索 → 关键词命中率低 ├── 没有 Rerank → 排名靠后的相关块被截断 │ ▼ [ 生成层 ] │ └── 拿到残缺/无关上下文 → 答案偏差/幻觉

三个核心问题,三个解法,今天一次讲完。


02 分块策略:这是 RAG 效果的地基

分块(Chunking)就是把长文档切成小片段,再入库。块的大小和切法,直接决定检索召回的上限。

一个反直觉的事实:块太大 ≠ 信息更全,块太小 ≠ 检索更准。

块太大(1000+ tokens): ┌──────────────────────────────────────┐ │ 无关噪声 │ 相关内容 │ 无关噪声 │ └──────────────────────────────────────┘ ↓ 向量被稀释,相关度下降 块太小(50 tokens): ┌────┐┌────┐┌────┐ │ A1 ││ A2 ││ A3 │ 一个完整语义被切断 └────┘└────┘└────┘ ↓ 上下文缺失,LLM 看不懂 合理块(200-500 tokens + overlap): ┌──────────────┐ │ 完整语义单元 │ 带20%重叠确保边界不丢 └──────────────┘ ↓ 召回精准,上下文完整

4种主流分块策略对比:

策略适用场景优点缺点
固定长度(Fixed-size)通用文本简单快速可能切断语义
递归字符(Recursive)结构化文档尊重自然边界需要调参
语义分块(Semantic)知识密集文档语义完整计算成本高
父子分块(Parent-Child)长文档精检索召回精准+上下文全实现复杂

工程上用得最多的是「父子分块」,检索小块、返回大块,兼顾精准和完整。

importRecursiveCharacterTextSplitterfrom"@langchain/textsplitters"importMemoryVectorStorefrom"langchain/vectorstores/memory"importParentDocumentRetrieverfrom"langchain/retrievers/parent_document"importInMemoryStorefrom"@langchain/core/stores"// 父块:大块,保证上下文完整(2000 tokens)constnewRecursiveCharacterTextSplitterchunkSize2000chunkOverlap200// 子块:小块,用于精准检索(200 tokens)constnewRecursiveCharacterTextSplitterchunkSize200chunkOverlap20// 父块存到 docstore(内存或 Redis)constnewInMemoryStore// 子块向量化,入向量库constawaitMemoryVectorStorefromDocuments// 父子检索器:检索子块,返回父块constnewParentDocumentRetrievervectorstoredocstoreparentSplitterchildSplitter// 入库awaitaddDocuments// 检索:命中子块 → 自动返回对应父块constawaitinvoke"你的问题"consolelog0pageContent// 返回完整的父块内容

03 Overlap 设置:边界不丢才是关键

很多同学忽视了 overlap(重叠窗口)。这个参数不起眼,但是关键句跨块的救命稻草。

不设 overlap: 块1:[...Apple今年发布了新款MacBook Pro,搭载M3芯片] 块2:[性能相比上代提升40%,续航延长至22小时...] ↑ "性能提升40%"是接着M3芯片说的,切断了! 设置 overlap=100: 块1:[...Apple今年发布了新款MacBook Pro,搭载M3芯片] 块2:[搭载M3芯片,性能相比上代提升40%,续航延长至22小时...] ↑ 重叠部分把语境带过来了

工程经验:

  • 中文文档:overlap = chunkSize × 10%~15%
  • 技术文档(含代码):overlap = chunkSize × 20%
  • 纯代码块:按函数/类边界切,不要硬切

04 混合检索:向量 + BM25,召回率直接拉满

纯向量检索有个死穴——关键词精确匹配弱

用户问「LangChain v0.3 的 breaking change 有哪些」,向量检索只能捕捉语义相似,但版本号「v0.3」这种精确词汇,BM25 才能稳稳命中。

纯向量检索: 查询: "LangChain v0.3 breaking change" │ ▼ 向量空间计算语义相似度 │ └── 召回了"LangChain 更新内容"(正确) 但漏掉了明确标注 "v0.3" 的文档(漏召回) 纯 BM25 检索: │ └── 精确命中 "v0.3" 关键词(正确) 但漏掉了语义相近但表述不同的文档 混合检索(Hybrid Search): 向量结果 ───┐ ├── RRF 融合 ──→ 最终排序 BM25结果 ───┘ ↑ 两者互补,召回率最大化

LangChain 的EnsembleRetriever实现很简洁:

importBM25Retrieverfrom"@langchain/community/retrievers/bm25"importEnsembleRetrieverfrom"langchain/retrievers/ensemble"// 向量检索器(接 Milvus / Chroma 等)constasRetrieverk10// 多取一些,后续 Rerank 会精选// BM25 关键词检索器constBM25RetrieverfromDocumentsk10// 混合检索:RRF 算法融合排名// weights: 向量占0.6,BM25占0.4(可根据场景调)constnewEnsembleRetrieverretrieversweights0.60.4constawaitinvoke"LangChain v0.3 breaking change"// 返回两路召回的融合结果,按 RRF 分数重排

RRF(倒数排名融合)算法原理:

文档 D 在向量检索中排名 r1,在 BM25 中排名 r2 RRF(D) = 1/(k + r1) + 1/(k + r2) k=60(平滑参数) 例: 向量排名第2,BM25排名第1: RRF = 1/62 + 1/61 ≈ 0.0323 向量排名第8,BM25排名第3: RRF = 1/68 + 1/63 ≈ 0.0306 两路都靠前的文档,RRF 分数最高 → 排到最前面

05 Rerank:第二关筛选,把最相关的送进上下文

混合检索帮你扩大了召回,但 LLM 的 context window 有限,最终只能放进去 3-5 个块。

这时候 Rerank 模型上场——它不看向量距离,而是直接用交叉注意力机制,对「查询+文档」联合打分,精度远高于向量相似度。

没有 Rerank 的问题: 向量检索 Top-5: ✅ 文档A(最相关,排第3) ❌ 文档B(相似但无关,排第1) ❌ 文档C(语义相近但答不了,排第2) ✅ 文档D(相关,排第4) ❌ 文档E(无关,排第5) LLM 拿到 Top-3 → B、C、A → 前两个都是干扰! 加了 Rerank 之后: Rerank 重新打分(交叉注意力): 文档A → 0.95 ← 最相关 文档D → 0.88 ← 次相关 文档B → 0.23 ← 重排后被踢出 文档C → 0.18 ← 重排后被踢出 文档E → 0.09 ← 重排后被踢出 LLM 拿到 Top-3 → A、D、... → 全是精华
importCohereRerankfrom"@langchain/cohere"importContextualCompressionRetrieverfrom"langchain/retrievers/contextual_compression"// Rerank 模型(Cohere 或开源 BGE-Reranker)constnewCohereRerankapiKeyenvCOHERE_API_KEYmodel"rerank-multilingual-v3.0"// 支持中文topN3// 最终保留3个// 两步检索:先召回20个,再 Rerank 精选3个constnewContextualCompressionRetrieverbaseCompressorbaseRetriever// 接上一步的混合检索constawaitinvoke"你的问题"// rerankedDocs 是经过 Rerank 精选的 Top-3,送进 LLM 生成

如果用开源 BGE-Reranker(不需要 API key):

importHuggingFaceInferenceEmbeddingsfrom"@langchain/community/embeddings/hf"// 本地部署 BAAI/bge-reranker-v2-m3// 调用方式略有不同,用 HTTP 接口包装constasynccompressDocumentsdocs: Document[], query: stringconstawaitPromiseallmapasyncconstawaitfetch"http://localhost:8080/rerank"method"POST"headers"Content-Type""application/json"bodyJSONstringifytextpageContentconstawaitjsonreturnreturnsort(a, b) =>scorescoreslice03map(item) =>doc

06 完整 RAG Pipeline:把三件事串起来

把分块、混合检索、Rerank 穿成一条链:

原始文档 │ ▼ [父子分块] ├── 子块(200 tokens)→ 向量化入库 └── 父块(2000 tokens)→ docstore 存储 │ ▼ 用户提问 │ ├── 向量检索(Top-10) └── BM25检索(Top-10) │ ▼ [EnsembleRetriever RRF 融合] │ └── 融合结果(Top-20) │ ▼ [Rerank 精选] │ └── Top-3 最相关块 │ ▼ [LLM 生成] │ └── 最终答案
importChatOpenAIfrom"@langchain/openai"importfrom"langchain/chains/combine_documents"importfrom"langchain/chains/retrieval"importChatPromptTemplatefrom"@langchain/core/prompts"constnewChatOpenAImodel"gpt-4o-mini"constChatPromptTemplatefromTemplate`你是专业的技术助手,根据以下上下文回答问题。如果上下文中没有答案,直接说"我不知道",不要猜测。上下文:{context}问题: {input}`// 文档整合链constawaitcreateStuffDocumentsChain// 完整 RAG 链:混合检索 + Rerank + 生成constawaitcreateRetrievalChainretriever// 已含混合检索+Rerank// 执行constawaitinvokeinput"LangChain 的 LCEL 和传统 Chain 有什么区别?"consoleloganswer// 输出精准的答案,不再幻觉

07 效果调优:这几个参数决定最终表现

搭完之后别急着上线,这几个参数值得花时间调:

(1)chunk_size 怎么定?

文档类型 推荐 chunk_size overlap ───────────────────────────────────────────── FAQ / 问答对 200~300 tokens 50 技术文档(连续段落) 400~600 tokens 100 合同/法律文件 600~800 tokens 150 代码文件(按函数切) 300~500 tokens 50

(2)混合检索权重怎么调?

  • 问答类(用户问精确问题):向量0.4 + BM25 0.6(关键词更重要)
  • 语义搜索类(模糊语义查询):向量0.7 + BM25 0.3
  • 通用场景:向量0.6 + BM25 0.4(默认起点)

(3)初检 k 值设多大?

Rerank 需要有足够的候选才能发挥作用,建议:

初检 k = Rerank topN × 5~10 例:最终需要 Top-3 → 初检至少召回 15~30 个

k 太小,相关文档没进候选,Rerank 巧妇难为无米之炊。

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/710805/

相关文章:

  • 手机电池寿命翻倍秘诀:BatteryChargeLimit智能充电限制器
  • CQ 省集记录
  • MATLAB新手也能搞定:一步步教你用netCDF读取IPIX雷达海杂波数据(附完整代码)
  • 摩尔线程 x 中国移动|国产GPU率先支撑央企大模型,S5000完成九天35B大模型适配
  • 终极生态系统模拟器Ecosim:探索自然选择与进化的视觉盛宴
  • 大语言模型持续学习评估:OAKS框架解析与实践
  • 基于LoRA微调开源大模型,打造专业法律文本生成AI助手
  • 分组过滤:HAVING
  • [Openclaw] OpenClaw v2026.4.21 升级技术摘要
  • 如何提高网站收录?老手常用的自动推送接口配置
  • 下载 | Win10 2021官方精简版,预装应用极少!(4月更新、Win10 IoT LTSC 2021版、适合老电脑)
  • 黑马点评-短信登陆笔记
  • 重构Android界面叙事:从模板使用到设计系统思维的革命
  • 【数据分析页面】
  • 【Python】面向对象之三大特性
  • 20254323 2025-2026-4—27 《Python程序设计》实验三报告 - Moonshot-_
  • Windows Defender完全移除终极指南:一键彻底卸载系统安全组件的完整解决方案
  • 终极指南:MAA明日方舟自动化助手 - 全功能详解与高效配置教程
  • Swin-UNet实战避坑指南:从论文复现到ACDC数据集心脏分割
  • 代码混合文本处理:技术挑战与多语言NLP实践
  • 深度解析NCM文件解密技术:ncmdump工具实战指南与高级应用方案
  • SkVM 深度解析:为 LLM Agent Skills 构建的编译与运行时系统
  • 文本分块策略与预处理
  • 鸿蒙应用如何测试?这两个工具必须掌握!
  • 从零预训练BERT模型的完整指南与实现
  • 2026年降AI工具处理速度对比:哪款工具最快出结果详细横评
  • 硬件指纹保护实战:三分钟掌握EASY-HWID-SPOOFER核心功能
  • 零代码自动化革命:5分钟用taskt告别重复工作,效率提升300%
  • 八大网盘直链下载终极指南:一键获取真实下载地址的完整教程
  • 2026年招牌广告灯箱实力厂商推荐,聚隆运灯箱为何成为连锁品牌首选,赋能商业未来的专业解决方案