news 2026/9/27 21:52:30

RAG原理-文档分割

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RAG原理-文档分割

文档分割位于“文档解析”和“向量化”之间。它决定知识以什么粒度进入向量数据库,也直接影响检索召回率、上下文完整性和最终回答质量。

一、为什么需要文档分割?

原始文档通常篇幅较长,直接将整篇文档向量化会带来几个问题:

  • 单个向量包含多个主题,语义表达不够聚焦;
  • 检索命中后会携带大量无关内容;
  • 文本可能超过 Embedding 模型或大模型的上下文限制;
  • 无法精确定位答案所在的段落、页码或章节。

因此,需要把文档拆成若干较小且语义相对完整的Chunk:

原始文档 ↓ 清洗与解析 结构化文本 ↓ 文档分割 Chunk 1 / Chunk 2 / Chunk 3 / ... ↓ Embedding 向量 + 原文 + 元数据

二、五类分割方式对比

分割方式核心做法优点局限
按句子分割一个或多个完整句子组成一个 Chunk边界自然、实现简单句子过短时上下文不足
按字符数切分达到固定长度后直接切开Chunk 大小稳定容易从句子或词语中间截断,语义不连贯
固定分隔符 + 重叠按换行、段落等边界切分,并保留相邻重叠内容能缓解边界信息丢失分隔符不稳定时效果有限
递归分割依次尝试段落、换行、句子、空格等分隔符兼顾长度控制与语义完整性需要根据语言和文档结构配置分隔符
语义分割根据 Embedding 相似度或语义变化点确定边界更贴近真实主题计算成本更高,阈值和模型会影响结果

实际 RAG 项目中,递归分割通常是更稳妥的默认方案;固定字符切分更适合格式简单、结构稳定的文本。

三、三个关键参数

1.chunk_size

表示单个 Chunk 的目标最大长度。设置过大会让一个 Chunk 混入多个主题;设置过小则会丢失上下文。

2.chunk_overlap

表示相邻 Chunk 之间重复保留的内容,用于避免答案恰好落在切分边界上。

Chunk 1:ABCDEFGHIJ Chunk 2: GHIJKLMNOP └─ overlap ─┘

重叠并非越大越好。重叠过大会增加向量数量、存储成本,并让检索结果出现大量重复内容。

3.separators

递归分割会按照分隔符优先级逐级尝试。中文文本可优先保留段落和完整句子:

separators=["\n\n","\n","。","!","?",";",","," ",""]

最后的空字符串""是兜底分隔符,确保超长文本最终仍能被切开。

四、固定字符分割示例

CharacterTextSplitter适用于分隔规则比较明确的文本:

fromlangchain_text_splittersimportCharacterTextSplitter text="""RAG 包含检索和生成两个阶段。文档需要先完成清洗、分割和向量化。用户提问后,系统会召回相关片段并交给大模型生成答案。"""splitter=CharacterTextSplitter(separator="\n\n",chunk_size=50,chunk_overlap=10,length_function=len,)documents=splitter.create_documents([text])forindex,documentinenumerate(documents,start=1):print(f"Chunk{index}:{document.page_content!r}")

参数含义:

  • separator:优先使用的切分边界;
  • chunk_size:目标块大小;
  • chunk_overlap:相邻块的重叠长度;
  • length_function:长度计算方式,这里使用 Python 的len。

五、递归分割示例

RecursiveCharacterTextSplitter会从前到后尝试多个分隔符;只有文本仍然过长时,才继续使用更细粒度的分隔符。

fromlangchain_text_splittersimportRecursiveCharacterTextSplitter text="""第一章 RAG 的基本流程 RAG 会先从知识库检索与问题相关的内容,再让大模型基于检索结果生成答案。 第二章 文档分割 合理的 Chunk 应尽量表达一个完整主题,同时满足 Embedding 模型的长度限制。"""splitter=RecursiveCharacterTextSplitter(separators=["\n\n","\n","。","!","?",";",","," ",""],chunk_size=80,chunk_overlap=15,length_function=len,is_separator_regex=False,)documents=splitter.create_documents(texts=[text],metadatas=[{"source":"rag_notes.md","chapter":"文档分割"}],)forindex,documentinenumerate(documents,start=1):print(f"Chunk{index}")print(document.page_content)print(document.metadata)print("-"*40)

这段代码还展示了一个重要实践:切分时同步保留source、章节、页码等元数据,方便后续引用和溯源。

六、递归分割的工作过程

假设分隔符优先级如下:

[段落边界, 换行, 句号, 逗号, 空格, 字符]

处理流程为:

  1. 先尝试按段落切分;
  2. 如果某个段落仍超过chunk_size,继续按换行切分;
  3. 仍然过长时,再依次尝试句号、逗号和空格;
  4. 最后才按字符强制切开;
  5. 合并较短片段,并保留设定的chunk_overlap。

这样既能限制 Chunk 长度,又能尽可能保留自然语言结构。

七、场景选择建议

没有适用于所有项目的固定数值,应根据数据和问题类型进行评估:

场景推荐策略
FAQ、短问答较小 Chunk,突出单一问题与答案
产品手册、技术文档按标题和段落递归切分,保留适度重叠
合同、制度文件优先按条款切分,并保留条款编号
代码文档按类、函数或代码块切分,不要从函数中间截断
扫描 PDF先进行 OCR 和版面恢复,再按章节或段落切分

调参时重点观察:

  • 检索结果是否包含完整答案;
  • Top-K 结果中是否出现大量重复 Chunk;
  • 一个 Chunk 内是否混入多个无关主题;
  • 标题、页码和来源信息是否正确保留;
  • 召回内容拼接后是否超过模型上下文限制。

八、常见问题与优化方向

问题 1:答案被切在两个 Chunk 中

适当增加chunk_overlap,或优先使用句子、段落等自然边界。

问题 2:检索结果重复度高

减小重叠比例,并在检索后增加去重或重排步骤。

问题 3:表格和代码被切碎

先识别内容类型,再使用表格、Markdown 标题、函数或代码块专用的切分规则。

问题 4:Chunk 语义仍然混乱

采用“结构化切分 + 递归切分”的组合策略;对复杂文档可进一步使用语义分割。

九、核心结论

  1. 文档分割的目标不是机械地把文本切短,而是生成大小可控、语义完整、能够追溯的知识单元。
  2. chunk_size决定信息粒度,chunk_overlap用于补偿边界信息丢失。
  3. 固定长度切分简单,但容易破坏语义;递归切分更适合作为通用默认方案。
  4. 中文文本应补充中文标点分隔符,避免只配置英文句号和空格。
  5. 最终参数必须结合真实问题集,通过召回结果和回答质量持续评估。

一句话总结:好的文档分割,要在“长度可控”和“语义完整”之间取得平衡。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 21:51:57

5.2.6 dma-buf heaps 与 udmabuf:把分配 dma-buf 的权力交给用户态

前面几节里,dma-buf 总是由某个内核驱动导出的:GPU 驱动创建一个 GEM BO,再把它包装成 dma-buf 抛出 fd。可现实里常有这样的需求——用户态想直接拿到一块可跨设备共享、零拷贝的缓冲区,却不想(也不该)为此去调某个具体 GPU/摄像头驱动的私有 ioctl。比如一个相机 HAL 要…

作者头像 李华
网站建设 2026/9/27 21:50:59

基于微信小程序的本科学生课程规划系统(源码+lw+部署文档+讲解等)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

作者头像 李华
网站建设 2026/9/27 21:50:09

威胁情报工具:更快?更聪明?

近些日子以来, 这几个名称频繁现身于安全工作者的视线范围之内, 它们分别是塔吉特, 还有摩根大通以及家得宝, 另外还有安腾, 并且最近竟然陆续提及到了美国国税局即 IRS 以及人事管理局亦称为 OPM。现如今,网络威胁面向的范围越发广阔, 其渗透的速率也愈发迅速。经由调查得以表…

作者头像 李华
网站建设 2026/9/27 21:49:31

AI 写代码后,你的时间账单

摘要:AI 接手写代码后,纯编码时间变短,但总工时没少。本文把开发者时间拆成五块——讲需求、审代码、修 bug、做集成、管上下文,并给四个可落地的杠杆,讲清时间到底搬去了哪、怎么砍。 现象:写快了&#xf…

作者头像 李华