ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

RAG 的魔鬼藏在细节里——Chunking 策略与检索优化

RAG 的魔鬼藏在细节里——Chunking 策略与检索优化 搭起 RAG 管道只是起点。真正决定效果的是文本怎么切Chunking、怎么检Hybrid Search、怎么排Reranker、怎么问Query 改写、怎么量评估。这五件事每一件都有坑踩过才知道为什么说RAG 的魔鬼藏在细节里。前言同样的架构为什么效果差十倍你按照教程搭了一套 RAG文档入库、向量检索、LLM 生成跑通了。但测试一问答案要么找不到相关内容要么找到了却答非所问。问题不在架构在细节。这篇文章逐层剖析 RAG 效果差的五类根因以及对应的工程解法。一、Chunking切错了后面全错文本分块Chunking是 RAG 的地基。分块决定了每个知识单元的粒度——太粗一块里包含太多不相关信息太细一块里的信息不完整模型拿到后缺乏上下文。策略一固定大小切割最简单直接按 Token 数量硬切附加固定重叠from langchain.text_splitter import RecursiveCharacterTextSplittersplitter RecursiveCharacterTextSplitter( chunk_size512, # 每块最大 Token 数 chunk_overlap50, # 相邻块的重叠 Token 数 separators[\n\n, \n, 。, ., , ])chunks splitter.split_text(document)优势实现简单Chunk 大小均匀可控。劣势可能在句子中间、段落中间切断导致语义断裂。检索到这种 ChunkLLM 拿到的是残缺信息。策略二语义切割让切分点落在自然语义边界段落、句子而不是固定字符数处。RecursiveCharacterTextSplitter的separators参数已经实现了这个逻辑优先在\n\n段落处切切不到再在\n换行处切再退而在句号处切。实际效果比固定切割明显更好——召回到的 Chunk 语义完整LLM 生成的答案更连贯。优势语义完整不切断句子。劣势Chunk 大小不均有时一段话就 100 Token有时一段话 2000 Token极长段落仍需二次切割。策略三层级切割父子块这是解决精确检索和完整上下文矛盾的高级方案子块小粒度如 128 Token用于精确向量检索粒度小召回更准父块大粒度如 1024 Token存储完整上下文检索命中子块后注入父块给 LLMfrom langchain.retrievers import ParentDocumentRetrieverretriever ParentDocumentRetriever( vectorstorevectordb, # 子块向量库 docstoreparent_docstore, # 父块存储 child_splitterchild_splitter, # 小粒度分块器 parent_splitterparent_splitter # 大粒度分块器)优势精确命中 完整上下文两全其美。劣势实现复杂需维护父子关系映射注入父块会显著增加上下文 Token 消耗。适合场景结构化文档法规、合同、技术手册其中每个小条款都有必要关联到完整章节。通用建议Overlap 是保险丝无论哪种策略都应加 10%15% 的重叠Overlap# chunk_size512, overlap50 → 重叠约 10%chunk_overlapint(chunk_size * 0.1)Overlap 确保在 Chunk 边界处被切断的句子在相邻 Chunk 里能被完整保存避免关键信息恰好落在两块的边界缝隙里。没有通用最优 Chunk 大小。经验起点是 512 Token 50 Token Overlap对于问答密集型场景FAQ可以调小到 256对于需要宏观理解的场景摘要、分析可以调大到 1024。最终靠评估指标迭代见本文第五节。二、Hybrid Search语义 关键词双保险向量语义检索有一个盲区对精确实体的匹配效果差。比如用户问MV ATLAS 2024 年 3 月的主机检验报告语义检索会把所有关于主机检验的文档都拉出来但MV ATLAS这个船名和2024 年 3 月这个时间点用语义检索几乎找不准。混合检索Hybrid Search结合两路Dense 密集检索基于 Embedding 向量理解语义概念“冷却系统也能召回散热器故障”Sparse 稀疏检索基于 BM25/TF-IDF精确关键词匹配船名、合同号、人名等实体必须精确两路结果用RRFReciprocal Rank Fusion融合# RRF 公式score 1/(k rank)k 通常取 60defrrf_fusion(dense_results, sparse_results, k60): scores {}for rank, doc_id inenumerate(dense_results): scores[doc_id] scores.get(doc_id, 0) 1 / (k rank 1)for rank, doc_id inenumerate(sparse_results): scores[doc_id] scores.get(doc_id, 0) 1 / (k rank 1)returnsorted(scores.items(), keylambda x: x[1], reverseTrue)Qdrant 原生支持混合检索pgvector 可与 PostgreSQL 全文搜索tsvector联合使用。三、Reranker召回多注入精向量检索给的是近似相关不是最相关。召回阶段宁可多不可少Top-20但注入 Prompt 时必须精Top-35否则上下文噪声会让 LLM 答非所问。Reranker二次精排解决这个问题from sentence_transformers import CrossEncoderreranker CrossEncoder(BAAI/bge-reranker-v2-m3)# 召回 Top-20 后用 Reranker 对每对 (query, chunk) 重新打分pairs [(query, chunk.content) for chunk in top20_results]scores reranker.predict(pairs)# 取得分最高的 Top-5top5 sorted(zip(scores, top20_results), reverseTrue)[:5]为什么 Reranker 比向量相似度更准向量相似度是双塔模型Bi-Encoderquery 和文档各自独立 Embedding再计算相似度。速度快但 query 和文档之间的交互信息被丢失。Cross-Encoder 是联合建模把[query, document]拼接起来整体输入模型打分能捕捉到更细腻的语义匹配关系。代价是不能提前建索引只能对候选集逐一打分所以只适合在召回的小候选集上做精排。召回 → Rerank 的两阶段架构是目前生产 RAG 的事实标准。四、Query 改写让问题更容易被检索命中用户的原始问题往往包含指代、省略、歧义不适合直接做向量检索“上次说的那个证书问题怎么处理”有指代“上次”那个无法向量化“这个怎么合规”省略太多缺乏上下文技术一HyDEHypothetical Document Embedding不直接对用户问题做向量化而是先让 LLM生成一份假设性的回答文档再对这份假设文档做向量化检索hyde_prompt f请根据以下问题写一段假设性的专业文档片段约 200 字该片段应能直接回答这个问题问题{user_question}hypothetical_doc llm.generate(hyde_prompt)query_embedding embed(hypothetical_doc) # 用假设文档做检索原理假设文档的语言风格与知识库中的真实文档更接近向量更容易命中相关内容。对文件库查询类场景效果显著。技术二多视角查询扩展生成多个不同角度的查询分别检索后合并去重expansion_prompt f请为以下问题生成 3 个不同表达方式的查询从不同角度描述同一信息需求每行一个原始问题{user_question}expanded_queries llm.generate(expansion_prompt).split(\n)all_results []for q in [user_question] expanded_queries: all_results.extend(retrieve(q))final_results deduplicate_and_rank(all_results)技术三Step-Back Prompting先让模型退一步生成一个更通用的父问题再对父问题检索。适合用户问题过于具体导致召回狭窄的场景用户问题「2024 年 SOLAS 第 II-2 章对消防系统的具体要求是什么」Step-Back「SOLAS 对船舶消防系统的总体框架要求是什么」先检索 Step-Back 问题再结合原始问题生成答案五、RAG 质量评估要有数字别靠感觉优化 RAG 是一个迭代过程必须用指标说话否则无从判断哪次改动有效。检索层评估RecallK在你的测试集问题中有多少问题的 Top-K 召回结果中包含了正确的文档块Recall5 正确文档块出现在 Top-5 结果中的问题数 / 总问题数这是 RAG 最核心的评估指标。Recall5 低于 70%意味着检索管道本身有问题无论 LLM 多强都无济于事。PrecisionKTop-K 中有多少是真正相关的衡量噪声比例。生成层评估Faithfulness忠实度LLM 的回答是否忠实于检索到的文档内容没有引入文档外的内容Answer Relevance答案相关性回答是否真正回答了用户的问题自动化评估框架RAGAS是目前最流行的 RAG 评估框架可以自动计算上述四个指标from ragas import evaluatefrom ragas.metrics import faithfulness, answer_relevancy, context_recall, context_precisionfrom datasets import Dataseteval_dataset Dataset.from_dict({question: questions,answer: generated_answers,contexts: retrieved_contexts, # Top-K 检索结果ground_truth: ground_truths # 标注的正确答案})result evaluate( dataseteval_dataset, metrics[faithfulness, answer_relevancy, context_recall, context_precision])print(result)评估驱动的优化流程1. 建立小型测试集50100 个有标注答案的问题2. 跑 RecallK 评估 → 如果 70%先优化 Chunking 和检索策略3. 跑 Faithfulness 评估 → 如果低加 Reranker 明确约束 Prompt4. 跑 Answer Relevancy 评估 → 如果低做 Query 改写5. 改动一个变量重新评估确认是否有提升每次只改一个变量是关键——改两个变量你不知道是哪个起了作用。总结RAG 效果的提升路径是有优先级的先把 Chunking 做对——语义切割 合理 Overlap这是基础用 Hybrid Search 替代纯语义检索——补上精确实体匹配的短板加 Reranker 二次精排——召回质量提升最明显的单点优化按需加 Query 改写——在 RecallK 仍然不理想时考虑建评估体系驱动迭代——没有数字优化就是盲人摸象学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%免费】
返回列表