
RAG 中文档切割的 chunk_size 和 overlap 应该如何设置chunk_size和chunk_overlap是文档切割中最重要的两个参数直接影响 RAG 系统的检索效果和成本。没有万能参数需要根据文档类型、应用场景和所用模型来综合确定。一、参数含义与作用参数含义作用chunk_size每个文档块的大小通常以字符数或 token 数计控制每个块的信息量影响检索精度和上下文完整性chunk_overlap相邻块之间的重叠大小防止关键信息被切分到两个块之间导致丢失为什么需要 overlap假设一段文本“公司的年假政策是每年15天需提前3天申请。”如果 chunk_size30 字符没有 overlap块1公司的年假政策是每年15天块2需提前3天申请。缺少主语用户问年假怎么申请时块2被检索到但缺少年假这个关键词可能无法匹配。设置 overlap 后块2会包含块1末尾的部分内容保证语义完整。二、chunk_size 设置指南通用推荐范围场景推荐 chunk_size说明快速起步/通用场景500-800 字符平衡性好适合大多数文档精确问答/FAQ200-500 字符信息密度高精准匹配技术文档/代码400-800 字符保留完整的技术描述文档总结/学术论文1000-1500 字符需要更多上下文长文档/法律合同1500-2000 字符条款需整段保留按文档类型推荐文档类型推荐 chunk_size原因新闻稿件600 字符段落通常较短对话记录400 字符单轮对话信息量小FAQ 问答集200 字符一问一答精准匹配产品说明书500 字按章节拆分核心原则主题集中每个块应围绕一个核心主题避免多个主题混杂不超过模型限制chunk_size 需小于所用 Embedding 模型的最大输入长度如 all-MiniLM-L6-v2 支持 512 tokens约 380 字宁可偏小不可过大块过大导致向量模糊检索相关性下降块过小导致上下文不足但可通过增大 K 值补偿三、chunk_overlap 设置指南通用推荐场景推荐 overlap说明通用场景chunk_size 的 10%-20%经验值重要文档chunk_size 的 15%-25%关键信息需被多个块覆盖技术参数/步骤说明chunk_size 的 15%-20%信息密集确保不丢失具体数值参考chunk_size推荐 overlap10-20%30030-6040040-8050050-10060060-12080080-1601000100-200为什么不设更大 overlap存储冗余overlap 过大导致向量数据库存储膨胀检索噪声同一信息在多个块中出现可能被重复检索成本增加更多块 更多向量 更高存储和检索成本最佳实践20% overlap 是兼顾上下文连贯性和存储效率的平衡点。四、不同文档类型的完整配置文档类型chunk_sizechunk_overlap切分策略通用文本/新闻500-60050-80固定长度技术文档800100递归切分产品说明书500-60050-60语义结构化学术论文1000-1500100-200按章节FAQ/问答200-30020-30固定长度法律合同1500-2000150-200按条款代码文件400-60040-60按函数Markdown文档1600 字符50% 比例按标题代码示例LangChainfromlangchain.text_splitterimportRecursiveCharacterTextSplitter# 通用配置splitterRecursiveCharacterTextSplitter(chunk_size500,# 500 字符chunk_overlap50,# 50 字符重叠separators[\n\n,\n, ,])chunkssplitter.split_text(your_document)# 技术文档配置splitterRecursiveCharacterTextSplitter(chunk_size800,chunk_overlap100,separators[\n\n,\n,。,,,, ,])五、如何找到最优参数方法1经验起步 A/B 测试从保守值开始chunk_size500, overlap50用测试查询集评估检索效果根据结果调整检索不精准 → 减小 size上下文不足 → 增大 size 或 overlap方法2快速测试脚本deftest_chunking_params(text,size,overlap):splitterRecursiveCharacterTextSplitter(chunk_sizesize,chunk_overlapoverlap)chunkssplitter.split_text(text)avg_lensum(len(c)forcinchunks)/len(chunks)print(fsize{size}, overlap{overlap})print(f块数{len(chunks)}平均长度{avg_len:.0f})# 检查是否有明显截断incomplete[cforcinchunksifcandc[-1]notin。.?!]print(f不完整块数{len(incomplete)})returnchunks方法3质量检查指标完整性评分检查块是否以句号/标点结尾检索准确率用真实查询测试 RecallK块长度分布避免过长或过短异常六、不同 Embedding 模型的 token 限制Embedding 模型最大 tokens对应中文字符约建议 chunk_sizeall-MiniLM-L6-v2512380300-400BGE-small-zh512380300-400BGE-large-zh512380300-400text-embedding-3-small81916000500-800nomic-embed-text81926000500-800注意chunk_size 应设置为模型最大输入的 70%-80%预留空间给用户问题的拼接。七、常见问题与解决方案问题可能原因解决方案检索结果语义残缺chunk_size 太小或切在句子中间增大 size 或改用语义切分检索结果不相关块主题杂乱size 太大减小 size按主题拆分关键信息检索不到关键信息被切到两个块之间增大 overlap向量表示模糊块过长主题不聚焦拆分过长块减小 size速度慢/成本高块数量过多过滤低质量块适当增大 size特别场景Markdown 文档对于 Markdown 格式文档推荐使用专门的MarkdownHeaderTextSplitter按标题层级切割fromlangchain.text_splitterimportMarkdownHeaderTextSplitter headers_to_split_on[(#,H1),(##,H2),(###,H3),]splitterMarkdownHeaderTextSplitter(headers_to_split_on)chunkssplitter.split_text(markdown_content)八、总结快速选择表你的情况推荐配置刚开始不确定chunk_size500, overlap50追求高精度问答chunk_size300, overlap30处理长文档/学术论文chunk_size1000-1500, overlap100-150处理结构化文档说明书按标题语义切分 chunk_size500处理代码chunk_size400, overlap40按函数处理 Markdown专用 Markdown 分割器核心原则宁可 chunk_size 偏小不要偏大——小块导致上下文不足可以通过增大 Top-K 补偿但大块导致的向量模糊和检索噪声很难修复。建议从chunk_size500, overlap50开始用真实查询测试效果再根据结果迭代优化。