欢迎光临
我们一直在努力

【LLM&&AI应用开发 八股文】--RAG的分块策略

目录

1.固定长度分块-Fixed‑size Chunking

2.递归字符分块-Recursive Character TextSplitter

3.句子级分块-Sentence‑level Splitting

4.语义分块 Semantic Chunking

5.结构感知分块-Structure‑aware Chunking

6.LLM 智能分块-Agentic Chunking

7.父子分块 Parent‑Child Chunking(分层分块)

8.多模态分块(图文混排 PDF)

9.PDF表格如何分块

方案 1:小表格(整体 token≤500)

方案 2:超大 / 跨页长表格(token>800,几十上百行)

方案 3:扫描版 PDF,表格解析失败

表格与周围文本如何处理

父子分块如何结合表格(生产环境标准做法)

表格摘要子块(双索引策略)

表格分块避坑清单

分块是 RAG 的预处理核心,目标:块不能太大(噪声多、语义弥散),不能太小(语义断裂、上下文不足),直接影响召回质量。下面按:基础固定策略、语义感知分块、文档结构感知、高级智能分块、多模态分块,分别说明优缺点与适用场景。

原始待切文本(统一样例文本,用于对比大部分分块算法):

文本 A :

大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG 分为索引阶段和查询阶段。索引阶段:文档加载、文档分块、向量化、存入向量数据库。查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。

1.固定长度分块-Fixed‑size Chunking

最经典、实现最简单。设置固定chunk_size(token / 字符)、chunk_overlap,滑动窗口切割,完全不看句子、段落、语义边界,到长度就切一刀。

参数示例:chunk_size=120字符,overlap=30字符

  • Chunk1:大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG 分为索引阶段和查询阶段。索引阶段:文档加载、文档分块、向量化、存入向量数据库。查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型
  • Chunk2:把检索到的上下文连同问题喂给大模型生成答案。RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。

问题:Chunk1 末尾句子被硬生生截断 “喂给大模型”,后半句跑到下一个 chunk。语义断裂。

  • ✅优点:实现最简单,速度最快;兼容任意脏文本;原型快速验证首选。
  • ❌缺点:暴力切割,经常切断句子、逻辑单元;重叠带来重复内容。
  • 🙂 适用:爬虫网页、无格式杂乱文本、快速 POC 原型。

2.递归字符分块-Recursive Character TextSplitter

多级分隔符,优先用大分隔符切,切完如果块依旧超过 size,就使用下一级更细分隔符继续切。 默认分隔符优先级:["\\n\\n", "\\n", "。", "!", "?", ",", " "]

  • 优先按段落\\n\\n切;
  • 如果块还是太大,换行\\n切;
  • 还大,按句号句子切;逐级往下,直到块尺寸达标。
  • Chunk1:大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG 分为索引阶段和查询阶段。索引阶段:文档加载、文档分块、向量化、存入向量数据库。

    Chunk2:查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。

    Chunk3:RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。

    • ✅优点:工业界 RAG 基线方案;尽量保证句子完整;支持 markdown。
    • ❌缺点:不懂语义,只看标点符号;如果一大段没有句号的长文本,退化成固定长度切割。
    • 🙂 适用:Markdown 文档、技术文档、报告,绝大多数生产项目的基线。

    3.句子级分块-Sentence‑level Splitting

    原理

    第一步:NLP 工具先完整切出一个个独立句子;

    第二步:把连续多个句子累积拼接,接近目标 chunk_size 就停止,形成块。切割边界永远在句子末尾,不会切破一句话内部。

    文本 A 拆出原始句子列表:

  • 大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。
  • RAG 分为索引阶段和查询阶段。
  • 索引阶段:文档加载、文档分块、向量化、存入向量数据库。
  • 查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。
  • RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。
  • 分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。
  • 目标块大小:2 个句子为一块

    Chunk1: 大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG 分为索引阶段和查询阶段。

    Chunk2:

    索引阶段:文档加载、文档分块、向量化、存入向量数据库。查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。

    Chunk3:

    RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。

    4.语义分块 Semantic Chunking

    不依赖标点、长度;依靠 Embedding 向量相似度判断语义边界。

    流程:

  • 根据句子、段落、主题等有语义内涵的单位对文档进行分段创建嵌入;
  • 计算相邻片段 embedding 余弦相似度;
  • 相似度低于设定阈值,代表主题发生跳转,在此处分割出新 chunk。
  • 5.结构感知分块-Structure‑aware Chunking

    利用文档本身的层级结构(标题、章节、条款、列表)作为天然分割边界。

    # RAG基础介绍
    ## 1.什么是RAG
    RAG通过外部知识库补充大模型固有知识,缓解幻觉。

    ## 2.RAG两大阶段
    ### 2.1索引阶段
    文档加载、文档分块、向量化、存入向量数据库。

    ### 2.2查询阶段
    用户query向量化、相似度检索、上下文送入大模型生成答案。

    ##3.RAG影响因素
    RAG性能受分块策略、Embedding、检索器、重排器共同影响。

    真实 PDF 场景:MinerU 解析 PDF,提取标题树,基于标题树做结构分块。

    • ✅优点:贴合文档原生知识单元;保留章节归属信息。
    • ❌缺点:扫描 PDF 没有标题结构,直接失效;依赖文档解析质量。
    • 适用:PDF 技术手册、标准规范、书籍、markdown 知识库。

    6.LLM 智能分块-Agentic Chunking

    交给大模型理解全文逻辑,识别知识单元,输出切分后的块数组。给 LLM 写 Prompt,让它做分块工作。

    Prompt 示例:

    将下面文本切分成语义完整的知识块,每个块 300‑500token,不要割裂完整逻辑,不要修改原文,输出 JSON 数组。 文本:【文本 A】

    LLM 输出返回:

    [
    "大模型检索增强生成(RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG分为索引阶段和查询阶段。索引阶段:文档加载、文档分块、向量化、存入向量数据库。",
    "查询阶段:用户query向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。",
    "RAG性能受分块策略、Embedding模型、检索器、重排器共同影响。分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。"
    ]

    • ✅优点:语义理解最强,可以处理逻辑混乱、混杂多类型内容文档。
    • ❌缺点:调用 LLM 成本高、速度慢;有小概率篡改原文、幻觉;不适合百万级海量文档。
    • 适用:少量高价值文档,合同、复杂白皮书。

    7.父子分块 Parent‑Child Chunking(分层分块)

    解决经典矛盾:小块检索准,但是上下文信息不足;大块上下文完整,检索噪声大。

    • 父块 Parent:大块(1000‑2000token)保存完整原文上下文,不入库向量库;
    • 子块 Child:父块再切割成细粒度小块(200‑400token),子块做 Embedding 存入向量库;
    • 检索流程:用户 query 检索向量库命中子块;通过 ID 映射,取出子块对应的完整父块,把父块交给 LLM 做回答。

    原始父块(完整一大段,不入库向量库)

    【父块】大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG 分为索引阶段和查询阶段。索引阶段:文档加载、文档分块、向量化、存入向量数据库。查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。分块是最前置的环节,分块不合理会造成后续无论怎么调检索器都很难提升效果。

    父块切出 2 个子块,子块向量化入库:

    Child‑1:大模型检索增强生成 (RAG),通过外部知识库补充大模型固有知识,缓解幻觉。RAG 分为索引阶段和查询阶段。

    Child‑2:查询阶段:用户 query 向量化、向量库相似度检索、把检索到的上下文连同问题喂给大模型生成答案。RAG 性能受分块策略、Embedding 模型、检索器、重排器共同影响。

    检索例子:用户问 “RAG 查询阶段做什么?”,向量检索命中 Child‑2;系统不直接把 Child‑2 丢给 LLM,而是取出 Child‑2 对应的完整父块全部文本送入 LLM。

    • ✅优点:兼顾细粒度检索召回,同时提供完整上下文;生产 RAG 非常常用优化手段。
    • ❌缺点:存储翻倍;需要维护父子 ID 映射关系。
    • 适用:几乎所有生产 RAG 系统。

    8.多模态分块(图文混排 PDF)

    图文混合文档,文本、图表不能混切在一起。

  • 文本部分使用结构分块;
  • 图表单独提取,图片做 image embedding;
  • 图注文字必须和图表绑定为同一个 chunk,不要拆开。
  • 样例 PDF 片段:

    图 1 RAG 系统整体架构图

    (图片)

    图注:RAG 系统分为索引阶段与查询阶段两大模块。索引阶段负责文档处理,查询阶段负责检索生成。

    ❌错误切分:把图注和图片拆开,图注跑到别的文本块;

    ✅正确切分:一个独立多模态 chunk:[图片] + 图注文字:图1 RAG系统整体架构图。RAG系统分为索引阶段与查询阶段两大模块。索引阶段负责文档处理,查询阶段负责检索生成。

    • ✅优点:图表信息不会丢失;
    • ❌缺点:依赖 PDF 解析工具 MinerU/PyMuPDF;向量库需要支持多模态 embedding。
    • 适用:论文 PDF、带大量图表技术手册。

    PDF原始文档

    MinerU布局解析 → 识别text / title / table / image元素

    遍历元素列表
    if 元素类型 == text/title:普通结构分块/递归分块
    elif 元素类型 == table:
    提取标题、表注、markdown表格
    if token ≤500:整体作为table‑chunk
    else:按N行切片,每片复制表头,生成多个table‑child‑chunk
    存入父子映射,完整表格作为parent存入KV存储
    elif 元素类型 == image:多模态图片chunk

    全部子块(文本子块+表格子块+图片子块)向量化入库

    查询:检索命中子块 → 取出parent父块送入LLM

    9.PDF表格如何分块

    ❌绝对禁止:普通递归 / 固定长度分块直接切表格。 普通文本分块会把表格从中间拦腰切断,丢失表头,单元格错位,召回出来的片段完全失去业务含义。

    示例错误切分(灾难案例) 原始 markdown 表格:

    表格

    参数数值单位
    电压 220 V
    功率 1500 W

    被递归分块从中间切断,得到:

    Chunk:| 参数 | 数值 | 单位 | |—-|—-|—-| | 电压 | 220|

    下一个 chunk:

    Chunk:V| | 功率 | 1500|W|

    模型拿到V|功率|1500|W,完全分不清哪一列对应什么。

    依赖布局解析器(MinerU /pdfplumber/ Unstructured.io),识别文档元素类型:text / table / image / title。

    表格必须识别为独立table对象,不和前后文本粘连在一起,拿到:

  • 表格标题 / 表注(非常关键,必须绑定表格)
  • 表格结构化内容:markdown/html
  • 元数据:所属章节路径、页码、坐标。
  • 三种表格分块策略(按表格大小区分)

    方案 1:小表格(整体 token≤500)

    —— 整张表格作为独立 Chunk(最常用)

    规则:

  • 把表标题 + 表注 + 完整 markdown 表格打包成一个独立 chunk;
  • 不要把表格和前后大段文本混在同一个 chunk;
  • 前后少量关联说明文字可以一起打包进来;
  • 该 chunk 作为原子单元,不再做递归切割。
  • ✅生成 Chunk 示例:

    ### 表1 设备参数表
    |参数|数值|单位|
    |—-|—-|—-|
    |额定电压|220|V|
    |额定功率|1500|W|
    |工作温度|-10~60|℃|
    表注:设备选型需要结合电压、功率参数综合评估。

    元数据:{type:"table", table_name:"表1 设备参数表", section_path:"第三章>设备参数"}

    向量库存入这个 markdown 文本,普通 text‑embedding 模型就可以检索。

    用户提问 “设备额定功率多少?” 召回整个表格 chunk,直接喂给 LLM。

    方案 2:超大 / 跨页长表格(token>800,几十上百行)

    —— 按行切片,每一片都强制带上表头

    核心铁律:任何一个表格子 chunk,不能没有表头,否则召回出来的行没有列含义,完全无效。

    原始大表格:表头 A B C D,共 30 行数据。 设置:每 8 条数据行为一个子 chunk。

    • Table‑Child‑1:表头 + 第 1‑8 行
    • Table‑Child‑2:表头 + 第 9‑16 行
    • Table‑Child‑3:表头 + 第 17‑24 行
    • Table‑Child‑4:表头 + 第 25‑30 行

    每一个子块都带上:表格标题、表注、完整表头,再带上对应数据行。

    示例:

    ### 表2 设备清单(节选)
    表头:|设备编号|型号|电压|功率|
    |——–|—-|—-|—-|
    |D001|A‑1|220V|1000W|
    |D002|A‑2|220V|1500W|
    ……(共8行)

    工程实践:

  • 长表格同样适配父子分块架构:完整原始大表格作为父块存入 KV 存储;切出来的带表头行片段作为子块向量化入库;命中子块后取回完整原始大表格父块给 LLM。
  • 禁止直接把表格转纯自然语言句子丢失行列结构;优先保留 markdown 表格格式。
  • 方案 3:扫描版 PDF,表格解析失败

    (OCR 识别错乱,拿不到 markdown)

    两条可选路线:

  • VLM 图像检索路线:把表格区域截图,作为图片 chunk,使用多模态 embedding(如 Qwen‑VL‑Embedding)对图片做向量入库;query 用文本检索图片向量库;生成阶段送入 VLM 模型读取图片内容。
  • VLM 做结构化复原:把表格截图丢给 VLM,强制输出 markdown 表格,再走方案 1/2。
  • 缺点:图像 embedding 检索召回精度不如文本,成本更高;优先尽量做结构化解析。

    表格与周围文本如何处理

    (非常容易踩坑)

    场景 A:表格前面有一大段介绍文字,后面有一大段分析文字

    【前文】本节介绍设备各项电气参数,下面表格汇总关键指标。 【表 1 设备参数表】 【后文】由上表可见,额定功率决定设备能耗,选型时重点关注功率指标。

    ✅正确分块:

  • Chunk1:前文介绍文字(普通文本块)
  • Chunk2:表标题 + 完整表格 + 表注(独立表格块)
  • Chunk3:后文分析文字(普通文本块)
  • 不要把大段前文 + 表格 + 大段后文全部塞到同一个块,会造成块过大,embedding 混杂多主题。

    ✅边界例外:如果前后文字很短(一两句话),可以和表格合并为一个 chunk。

    ❌错误:直接把表格混在大段文本中间,交给 RecursiveCharacterTextSplitter 自由切割。

    父子分块如何结合表格(生产环境标准做法)

  • 父块:完整原始表格(markdown + 标题 + 全部行),存入 KV 存储,不向量化。
  • 子块:
    • 小表格:子块 = 完整表格;
    • 超长表格:切分多行片段,每段子块携带完整表头 + 表标题;子块做 embedding 存入向量库。
  • 查询阶段: 用户问题命中某一个表格子块 → 通过 parent_id 取出完整原始表格父块 → 将完整表格送入 LLM 回答。
  • 好处:检索用细粒度子块更容易命中某几行;生成时拿到完整全量表格,不会只有局部片段。

    表格摘要子块(双索引策略)

    对于非常大的业务表格,增加一个摘要子块:

    • 子块 A:表格结构化 markdown 片段(用于精确数值查询)
    • 子块 B:VLM/LLM 生成的表格文本摘要(用于语义类问题检索) 两者都绑定同一个 parent_id,检索命中任意一个,都取回完整父表格。

    示例摘要:

    表 1 设备参数表,记录设备额定电压 220V,额定功率 1500W,工作温度‑10~60℃。

    适合:用户问 “设备工作条件是什么”,更容易命中摘要子块。

    表格分块避坑清单

  • ❌不要丢弃表格标题、表注;标题表注必须和表格绑定在同一个 chunk。
  • ❌长表格切片,绝不允许丢掉表头。
  • ❌不要把 markdown 表格直接交给普通递归分块器切割。
  • ✅表格 chunk 必须打元数据标记type="table",方便后续检索、重排、过滤。
  • ✅能解析出 markdown 就优先 markdown;扫描解析失败再走图片 VLM 路线。
  • ✅跨页表格,解析阶段先合并为一张完整逻辑表格,再执行分块,不要按物理页切分。
  • 赞(0)
    未经允许不得转载:171主机测评 » 【LLM&&AI应用开发 八股文】--RAG的分块策略
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址