资讯动态

RAG 系统中为什么要进行文档切割?有哪些切割策略?

发布时间:2026/8/12 19:16:21 来源:尧图企业网站定制
RAG 系统中为什么要进行文档切割有哪些切割策略RAG 系统中为什么要进行文档切割有哪些切割策略RAG 中为什么要进行文档切割简单来说大模型记不住整本书你需要给它恰好相关的“精华片段”。如果直接把整本《公司员工手册》10万字塞给大模型会遇到三个核心问题上下文窗口限制大模型能处理的文本长度Context Window是有限的。GPT-4 的上下文可能只有 8K-128K tokens直接塞入整本书就会超限。信息淹没与“中间丢失”把大海都给你你反而捞不到那根针。如果在一大堆无关信息中藏了一句关键答案模型很容易被干扰甚至忽略掉藏在长文本中间的关键信息Lost in the Middle 现象。成本高昂且响应慢每次提问都带上整本书消耗的 Token 多费用贵等待时间也长。文档切割Chunking就是为了解决这些问题把大文档切分成一个个小块Chunk。这样RAG 在检索时就能只把最相关的几个小块而不是整本书送给大模型让它又快、又准、又便宜地回答问题。有哪些切割策略你可以根据文档类型和业务需求从粗到细地选择切割策略。策略做法优点缺点适合场景1. 固定大小切割不管内容按固定的字符数或 Token 数如500字硬切。极其简单实现快。容易切在句子中间破坏语义毫无上下文。非常粗糙的初期原型。2. 基于句子切割在句号、问号、感叹号等标点符号处切割。保证每个块是完整的句子语义相对完整。块之间没有关联可能丢失跨句的上下文。通用文本特别是叙述性内容。3. 基于段落切割直接按文档中的空行\n\n或段落标记切割。保持了作者的自然语义单元一个段落通常讲一个意思。段落可能过长或过短。Markdown、文章、报告等结构清晰文档。4. 递归字符切割按一个优先级列表[\n\n, \n, 。, , ]尝试切割尽量让块在语义边界断开。兼顾语义完整性和长度控制是最常用、最平衡的方法。需要配置分隔符优先级。这是生产环境中最常用的默认选择。5. 语义切割计算句子间的向量相似度在相似度低语义转变的地方切割。切割点最符合语义逻辑效果最好。需要调用 Embedding 模型计算成本高。对检索质量要求极高的场景。6. 文档结构切割利用 Markdown 标题(#)、HTML 标签等按章节结构切割。块本身就是一个完整的知识单元如一个章节检索命中率高。强依赖文档有良好的结构化标记。技术文档、维基、规范文件。核心策略详解1. 递归字符切割 (RecursiveCharacterTextSplitter) —— 最推荐这是 LangChain 等框架的默认策略思想是“多级备胎”。工作原理先尝试用最大的分隔符如段落\n\n切。如果切出来的块还是太大就换下一个分隔符如句号。继续切直到块的大小符合要求。效果最大化地保证了“块”在语义边界段落、句子处断开。2. 语义切割 (Semantic Chunker) —— 效果最好工作原理把文本切成句子。用 Embedding 模型给每个句子算一个向量。计算相邻句子的相似度。当相似度出现骤降时说明话题变了就在那里切一刀。形象理解模型能“读懂”文本在话题转弯的地方自动切分。高级技巧与最佳实践在实际应用中还有一些进阶技巧可以显著提升效果。1. 重叠切割 (Overlap)为了避免关键信息恰好被切在上一块的尾巴上导致检索时漏掉可以让相邻块有部分内容重叠。块1: [句子A, 句子B, 句子C, 句子D] 块2: [句子C, 句子D, 句子E, 句子F] // 重叠了2个句子这样做能保留上下文是生产环境的必备技巧。2. 父子文档 (Parent-Child / Small-to-Big)这是一个巧妙的两阶段检索策略父块较大的块如一个段落或整个章节用于提供丰富的上下文。子块较小的块如一个句子用于精确检索。工作流程用户提问后先在小块的子块中进行快速检索找到最相关的几个句子。然后把这些句子所属的大块的父块即完整的段落或章节取出来。最后把这些完整的父块送给大模型生成答案。这样做的好处是既能快速命中关键信息又能保证模型看到完整的上下文。3. 元数据附加切分时别忘了给每个块打上“标签”元数据如source: 2024年报.pdf、page: 5、chapter: 财务概览。这在检索时可以用于过滤如只查PDF文件也方便模型在回答时引用来源。如何选择一张决策表你的情况推荐策略开始尝试想快速跑通流程递归字符切割 小重叠chunk_size500, overlap50文档结构清晰如技术文档、维基按文档标题Markdown header切割对检索精度要求高愿意投入计算资源语义切割担心关键信息被切碎父子文档检索需要平衡精度、速度和简单性递归字符切割是你的最佳起点一个可直接上手的参数配置fromlangchain.text_splitterimportRecursiveCharacterTextSplitter# 这是一个能应对大多数情况的稳健配置text_splitterRecursiveCharacterTextSplitter(chunk_size512,# 每个块最大大小通常为500-1000chunk_overlap80,# 块间重叠大小约为 chunk_size 的 10-20%separators[\n\n,\n,。,,,, ,],length_functionlen,)chunkstext_splitter.split_text(your_document)

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

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

免费获取报价