简介:分块是RAG系统的关键预处理步骤,决定文档如何被切分、索引与检索。本文从定义出发,系统讲解分块的目标、策略、核心参数、典型场景与常见误区,帮助开发者理解如何通过合理的分块设计提升检索质量与生成效果。
分块(Chunking),在检索增强生成(RAG,Retrieval-Augmented Generation)体系中,指的是将原始文档按照一定规则切分为若干较小文本片段的过程。这些片段被称为“块”(Chunk),是后续向量化、索引、检索与生成的基本单位。
从技术视角看,分块是文档摄取流水线中的关键预处理环节。它位于“文档收集”之后、“向量化与索引”之前,直接决定了知识库中每个可检索单元的内容边界与语义完整度。
从使用视角看,分块决定了当用户发起一次查询时,系统能够召回什么样的文本片段,以及这些片段能否为生成模型提供充足且精准的上下文。因此,分块不是简单的“按字数裁剪”,而是一项需要兼顾语义、结构与检索效率的工程决策。
用一句话概括:分块是把非结构化或半结构化的长文档,转化为适合检索与生成的短文本单元的过程,是 RAG 从“有文档”走向“可检索、可生成”的起点。
RAG 的起点是文档收集与摄取:把所有原始材料——文档、文章、知识库条目——汇聚到一起。但汇聚之后,如果直接以整篇文档为单位进行检索,会面临几个核心问题:
分块正是为了解决上述问题而存在。通过将文档切分为语义相对独立、长度可控的片段,RAG 系统能够:
一个完整的分块方案通常包含以下关键要素:
指每个文本片段的目标长度,通常以字符数或 token 数衡量。块太小,语义不完整,检索时可能丢失关键信息;块太大,语义稀释,检索精度下降。常见范围在 200~1000 token 之间,需根据文档类型与查询特点调整。
相邻块之间保留的重复内容长度。重叠的目的是防止关键信息恰好落在切分边界上而被割裂。典型重叠比例为块大小的 10%~20%。
决定在何处切断文本。常见边界策略包括:
每个块除文本内容外,通常还需附加来源文档、标题、页码、时间等元数据,用于检索过滤与结果溯源。
为每个块分配唯一标识,并保留其在原文档中的顺序信息,便于后续重组或引用。
分块在 RAG 流水线中的位置可以用以下简化流程表示:
文档收集 → 文档解析 → 分块 → 向量化 → 索引存储 → 检索 → 生成
具体到分块环节,其运行逻辑通常包括以下几个步骤:
一个通用的递归分块伪代码示意如下:
def recursive_split(text, max_size, overlap, separators):for sep in separators:if len(text) <= max_size:return [text]parts = text.split(sep)chunks = []current = ""for part in parts:if len(current) + len(part) <= max_size:current += partelse:if current:chunks.append(current)current = partif current:chunks.append(current)if all(len(c) <= max_size for c in chunks):return add_overlap(chunks, overlap)return fixed_size_split(text, max_size, overlap)
该伪代码展示了“优先按自然分隔符切分,若仍超长则降级为固定长度切分”的常见思路。
按固定字符数或 token 数切分,实现简单,但容易割裂语义。适合结构松散、对语义要求不高的场景。
按优先级依次尝试段落、句子、空格等分隔符,尽量保持语义完整。是当前应用最广泛的通用策略。
依据文档自身结构(如 Markdown 标题、HTML 标签、代码函数)切分,块边界与逻辑单元对齐,适合技术文档、法律条文、代码库等。
通过计算相邻句子的语义相似度,在语义转折处切分。效果较好,但计算成本较高。
将文档切分为“父块”与“子块”,检索时用子块匹配,生成时注入父块上下文。兼顾检索精度与上下文完整性。
分块是 RAG 系统中连接“文档收集”与“检索生成”的关键桥梁。它通过将长文档切分为语义相对独立、长度可控的文本单元,解决了语义稀释、上下文超限、检索精度下降等核心问题。一个合理的分块方案需要综合考虑块大小、重叠、边界策略、元数据与文档结构,并结合具体场景持续调优。
理解分块,不仅是理解一个预处理步骤,更是理解 RAG 系统如何将原始材料转化为可检索、可生成的知识单元。它是 RAG 的起点,也是决定整个系统效果上限的基础环节。