十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

文档切割策略

文档切割策略 一、 RAG 中的文档是怎么存的物理存储架构与索引机制在检索增强生成RAG系统中文档从原始文件到可供大模型检索利用需要经历解析、切块、向量化和持久化等步骤。文档在物理和逻辑层面上被拆解并存储在不同的存储介质中。┌────────────────────────────────────────────────────────────────────────┐ │ RAG 多层文档存储架构全景 │ └────────────────────────────────────────────────────────────────────────┘ │ 1. 原始数据层 对象存储 (S3 / MinIO) ➔ 保存原始 PDF / Word / Markdown 全文 │ 2. 文本与元数据 文档库 / KV Store (MongoDB / PostgreSQL) ➔ 存储 Chunk 正文与元数据 │ 3. 检索索引层 向量数据库 (Qdrant / Milvus) 倒排索引 (Elasticsearch / BM25) ➔ 存储高维 Dense 向量、Sparse 权重与关联 ID1.1 三层解耦存储体系工业级 RAG 系统通常避免将所有数据全部塞入向量数据库而是采用三层存储分离架构原始文档层Raw Document Store存储介质AWS S3、MinIO、Ceph 等对象存储或分布式文件系统。存储内容未经切分的原始多格式文件PDF、DOCX、PPTX、HTML、TXT。核心作用作为不可变的“单一信任源Single Source of Truth”用于文档溯源、版本控制、权限审计以及重新分块与索引构建。切片与元数据层Chunk Metadata Store存储介质PostgreSQL、MongoDB、RocksDB 或 Redis。存储内容切分后的纯文本块Text Chunks、富文本 HTML/Markdown 骨架、以及绑定的结构化元数据Metadata。核心作用在检索命中后通过主键 ID 快速拉取完整文本内容喂给大语言模型LLM同时支持基于 SQL/NoSQL 的精确属性过滤如部门权限、创建时间、文件类别。检索索引层Retrieval Index Store存储介质向量数据库Milvus、Qdrant、Chroma、Pgvector结合检索引擎Elasticsearch、OpenSearch。存储内容密集向量Dense Vector文本切片经过 Embedding 模型计算后的高维实数数组如 1024 维或 1536 维的 float32/float16 数据。稀疏索引Sparse IndexBM25 词频与倒排列表用于精确关键词检索。关联指针Pointer / Foreign Key指向切片存储层的唯一 Chunk ID 与 Doc ID。1.2 向量数据库内部的具体存储结构在向量数据库内部单条记录通常被封装为包含向量与载荷Payload的结构体{ id: c3d4e5f6-7890-4abc-def1-234567890abc, vector: [0.0234, -0.0451, 0.0892, 0.0115, ..., -0.0632], payload: { doc_id: DOC_20260901_001, parent_id: PARENT_CHUNK_012, chunk_index: 3, text: 本协议所称之不可抗力系指不能预见、不能避免并不能克服的客观情况..., metadata: { file_name: 采购合同通用条款.pdf, file_type: pdf, page_number: 14, section_title: 第十一章 违约责任与不可抗力, breadcrumb: 合同正文 - 通用条款 - 第十一章, department: 法务部, access_level: 2, char_length: 348, token_count: 215, created_at: 2026-09-01T10:00:00Z } } }Vector用于近似最近邻搜索ANN。常用索引包括 HNSW分层可导航小世界图和 IVF-PQ倒排文件乘积量化。Payload载荷随向量存储在同节点或同文档内部的数据用于就地过滤Pre-filtering / Post-filtering避免跨网络二次回表查询。二、 粒度是多大Granularity 的物理界定与核心博弈切分粒度Chunk Size是决定 RAG 系统最终检索准确率与生成质量的核心超参数。2.1 度量单位字符Character与 Token 的差异在工程实现中切块大小可以通过“字符数”或“Token 数”进行度量字符数Character Count通过代码中的字符串长度如 Python 中的len(text)计算。不同语种在字符与信息量上的对应关系极不均衡中文 1 个字符代表 1 个字英文 1 个字符仅代表 1 个字母。Token 数大模型与 Embedding 模型的最小语义单元。通常 1 个英文单词对应 1 至 2 个 Token1 个汉字通常对应 1 至 3 个 Token取决于具体分词器如cl100k_base或llama-tokenizer。工程准则在分块系统设计中切片大小必须以 Token 计数作为核心约束以严格对齐 Embedding 模型的最大输入窗口与大模型的上下文消耗。2.2 粒度权衡Trade-off过细 vs 过粗┌────────────────────────────────────────────────────────────────────────┐ │ Chunk 粒度权衡博弈模型 │ └────────────────────────────────────────────────────────────────────────┘ [细粒度切分: 100~200 Tokens] [粗粒度切分: 1200~2000 Tokens] ───────────────────────────── ────────────────────────────── 向量表征高度聚焦信噪比极高 上下文语境完备包含完整因果链 检索精确率 (Precision) 显著提升 适于整体理解、宏观归纳与跨段推理 - 丢失上下文句子断章取义 - 向量稀释 (Vector Dilution)特征被平均化 - 大模型缺少必要因果逻辑导致幻觉 - 检索噪声激增挤占注意力与上下文预算1. 向量稀释现象Vector Dilution主流 Transformer 架构的 Embedding 模型最终通过池化Pooling如 Mean Pooling将整段文本压缩为单根固定维度的向量。当 Chunk 长度达到 1500 字以上且涵盖多个次级主题时池化计算会将这些主题的语义特征进行平均化处理。结果是该向量在向量几何空间中处于模糊的中间区域丧失对单一具体事实的强匹配度导致检索召回率Recall下降。2. 上下文注意力衰减Lost-in-the-Middle大模型在接收长上下文时对输入提示词的头部和尾部注意力权重最高中间部分权重较低。如果单个 Chunk 粒度过粗检索出的若干个大 Chunk 拼接后会迅速撑爆上下文使得关键证据落入注意力衰减区引发模型忽略关键事实。2.3 工业界各业务场景的推荐粒度基线业务场景建议 Token 粒度Overlap重叠比例典型特征与选用考量客服问答 / FAQ100 ~ 250 Tokens10% ~ 15%针对确定性的一问一答追求高精度与零噪声企业规章制度 / 合同协议300 ~ 600 Tokens15% ~ 20%兼顾法条独立性与上下文前提条件技术开发文档 / API 指南400 ~ 800 Tokens10% ~ 15%必须完整保留代码块、参数说明与接口描述学术论文 / 行业深度研报800 ~ 1200 Tokens20%针对包含复杂推导与论述的长段落宏观趋势归纳 / 跨章节总结1500 Tokens10%采用分级摘要或父子切片模式处理三、 详细说说文档切割Chunking策略数据分块经历了从静态规则切片到动态语义感知的技术演进。以下系统性拆解七种主流分块策略的底层逻辑与工程实践。┌────────────────────────────────────────────────────────────────────────┐ │ 文档分块策略演进全景图 │ ├──────────────────┬─────────────────────────────┬───────────────────────┤ │ 策略类别 │ 核心算法机制 │ 典型适用场景 │ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 1. 固定大小切分 │ 固定字符/Token 滑动窗口步进 │ 基准测试、无格式纯文本│ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 2. 递归字符切分 │ 多级自然标点符号层级回退 │ 通用自然语言文档 │ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 3. 结构感知切分 │ AST 语法树解析与层级继承 │ Markdown、HTML、代码 │ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 4. 语义感知切分 │ 句向量余弦距离差分与突变检测│ 论述文、对话记录 │ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 5. 父子切片架构 │ 小块向量检索大块送入大模型│ 法律、复杂技术规范 │ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 6. 命题分块 │ LLM 提取自包含原子事实命题 │ 高密事实检索、医疗诊断│ ├──────────────────┼─────────────────────────────┼───────────────────────┤ │ 7. 后置分块 │ 长上下文编码后再执行池化截断│ 长上下文端到端 RAG │ └──────────────────┴─────────────────────────────┴───────────────────────┘3.1 固定大小切分Fixed-Size Chunking机制原理设定固定的字符或 Token 阈值 $N$以固定步长 $(N - Overlap)$ 在文本上滑动窗口进行硬切分。缺陷该方法无视语言学边界。可能将一个实体名称如“阿司匹林肠溶片”、专业术语、数值或完整的句子直接拦腰切断在生产环境中仅作为 baseline 对照组不建议直接用于关键业务。3.2 递归字符切分Recursive Character Chunking机制原理递归字符切分如 LangChain 的RecursiveCharacterTextSplitter是目前应用最广的通用切分方案。其核心思想是尽可能保留自然段落与句子的完整性。算法预定义一组具备优先级梯度的分隔符列表separators [\n\n, \n, 。, , , ., !, ?, , ;, , ]执行流程优先使用最高级分隔符\n\n段落级将文本拆开。遍历拆分出的子段落若某段落长度未超过chunk_size则保留。若某子段落长度超出chunk_size则针对该段落下沉使用下一级分隔符\n单行级递归拆分。依次下沉至句号、分号、空格直到所有切片均小于等于指定尺寸。最终通过滑动重叠窗口Overlap将相邻碎片适度聚合。3.3 文档结构感知切分Structure-Aware Chunking结构化文档如 Markdown、HTML、LaTeX天然具备层级大纲。强行使用字符切割会摧毁原有的标题从属关系。机制原理基于抽象语法树AST解析器将文档解析为层级树结构。标题栈与路径回填Breadcrumbs维护一个当前深度的标题栈。当下级文本被切分时将上层所有父标题路径拼接为元数据前缀注入到切片内容中。原始 Markdown: # 供应链风险管理手册 ## 第三章 仓储物流风控 ### 3.1 危险化学品存放规范 库房温度不得高于 30 摄氏度相对湿度应保持在 80% 以下。 切片注入后结果: 【路径】供应链风险管理手册 - 第三章 仓储物流风控 - 3.1 危险化学品存放规范 【正文】库房温度不得高于 30 摄氏度相对湿度应保持在 80% 以下。这种处理方式消除了代词与上下文缺失问题使 Embedding 模型能准确捕捉文本块在整篇文档中的层级地位。3.4 语义感知切分Semantic Chunking基于字符长度的切分容易在段落讨论同一概念的中途截断或将两个不同主题的内容混在同一个块中。语义分块通过 Embedding 模型本身寻找话题切换点。算法步骤句子边界切分利用正则或自然语言处理工具spaCy/NLTK将文本切分成单句序列$S [s_1, s_2, ..., s_n]$。滑窗文本构建为每个单句构建上下文窗口当前句与前后相邻句子合并减少单句过短带来的向量不稳定性。句向量嵌入计算对所有滑窗文本批量执行向量化得到序列向量$V [v_1, v_2, ..., v_n]$。语义距离计算计算相邻句向量之间的语义距离Distance(i) 1 - Cosine_Similarity(v_i, v_(i1))动态断点检测Breakpoint Thresholding计算距离数组的统计特征均值加 $k$ 倍标准差或设定百分位数如 95%。当距离突增超过阈值时判定为主题发生转移在此处切割出新的 Chunk。相邻句子语义距离 (Distance) ▲ │ ▲ (语义距离突增点 ➔ 判定为主题转换切分 Chunk) │ ╱ ╲ │ ────────╱───┼───阈值线 (Threshold)──────────────── │ ╱ ╲ ╱ ╲ │ ╱ ╲__╱ ╲ └──────────────────────────► 句子位置索引3.5 父子文档与小到大检索Parent-Child / Small-to-Big Chunking父子切片是解决“检索精确率”与“上下文完备性”冲突的最有效工业方案。┌────────────────────────────────────────────────────────────────────────┐ │ 父子文档切分与检索映射机制 │ └────────────────────────────────────────────────────────────────────────┘ ┌────────────────────────────────────────────────────────────────────┐ │ 父文档 (Parent Chunk): 完整章节 / 大段落 (如 1200 Tokens) │ │ │ │ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ │ │ 子块 1 (200 T) │ │ 子块 2 (200 T) │ │ 子块 3 (200 T) │ │ │ └────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘ │ └───────────┼─────────────────────┼─────────────────────┼────────────┘ │ │ │ ▼ ▼ ▼ [存入向量数据库] [存入向量数据库] [存入向量数据库] │ ▼ 【Query 向量检索精准命中 子块 2】 │ ▼ 依据元数据中的 parent_id 回表反查 【最终提供给大模型 LLM 进行总结推理的上下文 ➔ 完整父文档 (1200 T)】子切片Child Chunk粒度极小100 至 200 Tokens专注于单一概念。生成 Embedding 并存入向量数据库专职负责被用户的检索问题精准命中。父切片Parent Chunk粒度较大800 至 2000 Tokens包含完整背景、上下文前提与前置因果。存储在文档数据库中。映射联动子切片在向量库中的元数据记录其所属的parent_id。当向量数据库命中子切片时流水线根据parent_id自动提取对应的父切片送入大模型 Prompt 中。3.6 命题分块Propositional Chunking命题分块将长段落解构为具备自包含性的独立事实陈述Propositions。机制特点利用微调后的轻量大模型对原始段落进行解构改写每个命题仅表达一个独立的原子事实彻底消除代词指代将“他”、“该项技术”还原为具体专有名词命题脱离原文后依然能够独立存在并保持语义准确。示例对照原始段落“DeepSeek 成立于杭州它于 2025 年推出了基于 MoE 架构的开源大模型该模型在数学推理上表现亮眼。”命题分块输出DeepSeek 是一家成立于中国杭州的人工智能公司。DeepSeek 于 2025 年发布了一款开源大模型。DeepSeek 发布的该款开源大模型采用了 MoE混合专家架构。DeepSeek 的开源 MoE 模型具备高水平的数学推理能力。优缺点检索精确度极高无冗余噪声但切分过程严重依赖 LLM 批处理推理前置计算成本高昂。3.7 后置分块Late Chunking传统的 RAG 流程遵循切片 ➔ 各自计算 Embedding ➔ 向量索引。每个切片在计算 Embedding 时完全丢失了整篇文章的全局上下文交互。机制原理基于支持超长上下文的 Embedding 模型如 Jina-Embedding-v3、BGE-M3全文档输入将长达 8K 甚至 32K 的完整长文档一次性输入到 Transformer 编码器中。全注意力交互Full Attention在模型的全部隐层Hidden Layers中文本中的每一个 Token 都会与全篇所有其他 Token 发生 Cross-Token Attention 计算。隐层矩阵切片在获取到 Transformer 最后一层包含全局语义信息的 Token Embeddings 矩阵后根据预设的边界如按段落或 Token 范围进行物理切分。局部池化Targeted Pooling对每个切片范围内的 Token 隐层状态单独执行 Mean Pooling得到各切片的最终向量。传统切块: [文档] ➔ 切分碎片 ➔ 各自单独编码 (无全局信息交互) 后置切块: [文档] ➔ 全文编码 (全局全注意力计算) ➔ 在隐层输出矩阵上切片 ➔ 各自 Pooling核心优势生成的单个 Chunk 向量既具备小尺寸切片的定位精度又隐含了对整篇长文档上下文的全局依赖感知。四、 复杂多模态与异构文档切分实践在实际生产场景中单纯处理连续纯文本的情况较少更多需要面对结构复杂的异构文件。4.1 复杂排版 PDF 切分实践PDF 格式的设计初衷是用于打印排版不包含天然的语义流与段落标记。页眉/页脚过滤利用版面分析Layout Analysis识别每页顶部与底部的坐标固定区域剔除“公司内部保密”、“第 X 页”等周期性噪声避免将其切入正文破坏语义。双栏/多栏重新排序直接按物理行扫描会导致左栏第 1 行与右栏第 1 行拼接在一起。必须先通过版面检测算法识别文本块的多栏边界框Bounding Box按阅读顺序拼接文本流后再执行切块。跨页连续性拼接当页面末尾句子缺少句末标点或以连字符-结束时判定为句子跨页强行将下一页的开头段落与当前页末合并禁止在页边处直接切断。4.2 复杂表格Table切分范式表格直接按字符硬切会导致表头与数据行脱钩形成不可读的碎片。方案 1Markdown 表格重组与表头重复将表格解析为标准 Markdown 格式。当一个大表格必须跨 Chunk 切分时强制在每个子切片的头部重复追加完整的表头行与分隔行。!-- 子切片 2 内部必须强制补齐表头 -- | 部门名称 | 员工工号 | 季度绩效评分 | 调薪建议 | |:---|:---|:---|:---| | 基础架构组 | EMP-1092 | 4.2 | 晋升 | | 基础架构组 | EMP-1093 | 3.8 | 维持 |方案 2行级键值对序列化Row Serialization针对关系型数据库导出表或宽表放弃二维排版直接将其扁平化序列化为单行自然语言记录数据记录 1: 部门名称基础架构组; 员工工号EMP-1092; 季度绩效评分4.2; 调薪建议晋升。 数据记录 2: 部门名称基础架构组; 员工工号EMP-1093; 季度绩效评分3.8; 调薪建议维持。方案 3HTML 结构保留大语言模型在预训练过程中摄入了大量网页代码对tabletrtd具有极强的归纳解析能力。保留原生 HTML 标签并在属性中标记colspan、rowspan适用于多级合并表头的复杂金融研报表格。4.3 源代码Code Repository切分实践源代码文件包含严格的语法约束若切断在括号或缩进内部会导致语法错误。AST 语法解析使用Tree-sitter等跨语言 AST 解析工具。语义切分节点以完整的函数Function、方法Method或类声明Class Declaration作为切分最小单元。上下文继承将文件开头的import引用、包路径、类注释Docstrings提取出来作为公共前缀合并入每一个独立的函数切片中。五、 生产级通用切片流水线代码实战以下提供一套可直接运行的工业级 Python 分块框架集成了递归降级切分、父子切片映射生成、Markdown 层级元数据提取与唯一哈希计算功能。import hashlib import uuid import re from typing import List, Dict, Any, Optional from dataclasses import dataclass, field dataclass class ChunkEntity: chunk_id: str doc_id: str parent_id: Optional[str] content: str metadata: Dict[str, Any] field(default_factorydict) char_len: int 0 token_est: int 0 def __post_init__(self): self.char_len len(self.content) # 粗略估计 Token: 中文约为 1.5-2 字符/Token英文约 4 字符/Token self.token_est int(self.char_len * 0.7) class AdvancedDocumentSplitter: def __init__( self, parent_chunk_size: int 1200, child_chunk_size: int 300, child_overlap: int 50, separators: Optional[List[str]] None ): self.parent_chunk_size parent_chunk_size self.child_chunk_size child_chunk_size self.child_overlap child_overlap self.separators separators or [\n\n, \n, 。, , , , , ] def _split_text_by_separators(self, text: str, max_size: int, overlap: int) - List[str]: 递归字符拆分核心引擎 if len(text) max_size: return [text] # 寻找最高优先级切分符 chosen_sep self.separators[-1] for sep in self.separators: if sep : chosen_sep break if sep in text: chosen_sep sep break splits text.split(chosen_sep) if chosen_sep ! else list(text) final_chunks [] current_chunk [] current_len 0 for part in splits: part_len len(part) len(chosen_sep) if current_len part_len max_size: if current_chunk: merged chosen_sep.join(current_chunk).strip() if merged: final_chunks.append(merged) # 维护滑动重叠窗口 while current_len overlap and current_chunk: removed current_chunk.pop(0) current_len - (len(removed) len(chosen_sep)) current_chunk [part] current_len part_len else: current_chunk.append(part) current_len part_len if current_chunk: merged chosen_sep.join(current_chunk).strip() if merged: final_chunks.append(merged) return final_chunks def _extract_markdown_headers(self, text: str) - List[Dict[str, Any]]: 基于大纲标题的粗粒度解析 (生成父切片) lines text.split(\n) sections [] header_stack [] current_content [] for line in lines: match re.match(r^(#{1,4})\s(.*), line) if match: if current_content: path - .join([h[1] for h in header_stack]) sections.append({ path: path, text: \n.join(current_content).strip() }) current_content [] level len(match.group(1)) title match.group(2).strip() while header_stack and header_stack[-1][0] level: header_stack.pop() header_stack.append((level, title)) else: current_content.append(line) if current_content: path - .join([h[1] for h in header_stack]) sections.append({ path: path, text: \n.join(current_content).strip() }) return sections def process(self, doc_id: str, raw_markdown: str) - Dict[str, List[ChunkEntity]]: 完整流水线 1. 提取结构化大纲生成父文档 (Parent Chunks) 2. 针对每个父文档递归切分生成小切片 (Child Chunks) 3. 建立并注入关联元数据 sections self._extract_markdown_headers(raw_markdown) parent_entities [] child_entities [] for p_idx, sec in enumerate(sections): sec_text sec[text] sec_path sec[path] if not sec_text: continue # 1. 生成 Parent Chunk 实体 p_uuid fP_{doc_id}_{p_idx:03d} p_entity ChunkEntity( chunk_idp_uuid, doc_iddoc_id, parent_idNone, contentsec_text, metadata{breadcrumb: sec_path, is_parent: True} ) parent_entities.append(p_entity) # 2. 生成 Child Chunks children_raw self._split_text_by_separators( sec_text, max_sizeself.child_chunk_size, overlapself.child_overlap ) for c_idx, c_text in enumerate(children_raw): # 注入面包屑前缀增强局部语义 annotated_content f【上下文: {sec_path}】\n{c_text} if sec_path else c_text c_uuid fC_{doc_id}_{p_idx:03d}_{c_idx:03d} c_entity ChunkEntity( chunk_idc_uuid, doc_iddoc_id, parent_idp_uuid, contentannotated_content, metadata{ breadcrumb: sec_path, child_index: c_idx, parent_id: p_uuid, is_parent: False } ) child_entities.append(c_entity) return { parents: parent_entities, children: child_entities } # 运行测试 if __name__ __main__: sample_document # 数据库内核技术规范 ## 1. 事务管理子系统 事务管理采用多版本并发控制MVCC架构。读操作不加锁写操作通过写时复制更新行版本。 为了解决长事务造成的膨胀问题引入后台定时垃圾回收线程Vacuum Worker。 Vacuum Worker 在系统负载低于 30% 时自动启动清理已被废弃且不可见的旧版本数据元组。 ## 2. 存储与缓冲管理 缓冲池采用改进型 2Q 替换策略以替代传统的 LRU。 数据页首先读入 FIFO 队列只有在指定时间窗口内再次命中才会被转移至频次队列。 该机制有效防止全表扫描大查询冲刷掉关键的热点索引缓存页。 splitter AdvancedDocumentSplitter( parent_chunk_size600, child_chunk_size120, child_overlap20 ) result splitter.process(doc_idDOC_DB_001, raw_markdownsample_document) print(f生成的父文档数量: {len(result[parents])}) print(f生成的子切片数量: {len(result[children])}\n) print(--- 示例子切片详情 (存入向量数据库进行检索) ---) first_child result[children][0] print(fChunk ID: {first_child.chunk_id}) print(fParent ID: {first_child.parent_id}) print(fContent:\n{first_child.content}) print(fMetadata: {first_child.metadata})六、 切片效果评估与选型决策指南没有量化指标的切片调优属于盲目尝试。在 RAG 工程落地中必须建立针对切片策略的基准测试集。6.1 核心量化评估指标利用 RAG 评估框架如 Ragas、TruLens对不同切片方案构建的索引库进行离线自动化打分命中率Hit Rate K验证标准问答测试集中的权威证据块在前 K 个检索出的切片中的出现概率。平均倒数排名Mean Reciprocal Rank, MRR K目标切片排在召回列表最前列的概率倒数均值。上下文相关度Context Relevance衡量召回切片中有效事实信息的比例惩罚冗余无关内容。生成忠实度Faithfulness大语言模型生成的最终答案是否严格来自于召回的切片内容量化控制幻觉率。6.2 切片策略技术选型决策矩阵[文档资产结构] │ ┌─────────────────────────┴─────────────────────────┐ ▼ ▼ 【具备天然大纲排版】 【纯文本/密集长段落】 (Markdown, HTML, Code) (小说, 通讯记录, 问答集) │ │ ▼ ▼ AST 结构感知切片 语义突变分块 (Semantic) 路径 Breadcrumb 注入 句子滑窗差分阈值 │ │ └─────────────────────────┬─────────────────────────┘ │ ▼ 【事实密度与因果依赖需求】 │ ┌─────────────────────────┴─────────────────────────┐ ▼ ▼ 【局部原子事实】 【深层推演/多条件规约】 (客服 FAQ / 属性抽取) (金融财报 / 法律判决) │ │ ▼ ▼ 微切片 (100-200 T) 父子文档架构 (Small-to-Big) 或 命题分块 (Propositional) 子块 200 T ➔ 父块 1500 T七、 总结数据分块不仅是简单的文本预处理步骤而是整个 RAG 知识检索管道的底层数据基础设施。在物理存储上现代生产架构采用三层分离方案对象存储沉淀全量原文文档数据库维护切片正文与元数据字典向量数据库与倒排索引负责高并发多路召回。在切分粒度上必须打破单一切块大小的静态设定。通过父子文档切片解耦“检索最小单元”与“生成最小单元”以细粒度切片保证向量相似度匹配的聚焦性以粗粒度父切片保障大语言模型逻辑推理的连贯性。在切片算法上应根据文档类型选择适配方案对 Markdown/HTML 使用 AST 结构切分并注入路径面包屑对复杂表格采用保留表头的 Markdown 或行序列化模式对高价值连续文本逐步引入语义切块与后置分块Late Chunking。通过构建精细化、结构化的分块与存储管道才能从源头上根除向量检索噪声与大模型生成幻觉使企业私有知识库系统在复杂的工业级场景中稳定运行。
返回列表