文章讨论语义分块相较固定长度切分的适用场景,重点是通过保留上下文提升 RAG 检索准确率和回答质量。它也涉及分块策略对 token 成本的影响。
选择合适的模型,只是构建成功的检索增强生成(RAG)管线的一部分。Chunking(分块)同样至关重要。文档的切分方式会影响检索到的内容、LLM 获得的上下文量,以及回答的准确性。因此,最好把 Chunking 当作一项设计决策,而不只是一个预处理步骤。Chunking 有多种类型,语义分块就是其中之一。
本文将帮助你理解各种方案之间的权衡,从而为自己的数据选择合适的分块方法。
为 RAG 准备文档,最简单的方法是按照固定数量的 token 或字符切分内容。这种方法速度快,但不一定能尊重内容本身的结构。一个段落、章节,甚至一句话,都可能被一分为二。
在 RAG 系统中,语义分块是一种按照含义而非大小对文本进行分组的数据分块方式。语义分块器会自动应用这一逻辑:它识别自然的主题边界,而不是依赖固定的 token 或字符数限制。
因此,每个块的大小会自然有所不同。一个术语表条目可能只需要一两句话,而解释身份验证流程的章节通常更适合完整地保留在一起。真正重要的是,分块边界要顺应内容,而不是服从某个武断的长度限制。
假设有人在你的文档中搜索速率限制。如果限制规则存放在一个块里,而例外情况放在另一个块里,retriever 可能只会检索出一半的答案。
分块之所以如此重要,关键就在于找到合适的平衡。较大的块可以保留更多上下文,但可能降低检索精度,并增加 token 用量。较小的块更有针对性,却可能拆散本应放在一起的观点,导致模型缺少生成准确回答所需的上下文。
因此,不应该把 Chunking 看成一种放之四海而皆准的决策。最佳方案取决于内容本身,以及你愿意接受哪些权衡。产品手册、公司的年度会议报告和法律合同有着不同的结构,因此往往适合不同的分块策略。
文本分块的方法有很多,大多数生产环境中的 RAG 系统也不会只依赖一种方法。正确的策略取决于内容结构、所需的检索质量,以及你愿意管理多高的复杂度。
下面介绍最常见的几种方法,以及在它们之间做选择时需要考虑的权衡。
固定大小分块会在达到指定数量的 token 或字符后切分文本,不考虑句子或主题从哪里开始、在哪里结束。它的行为可预测、容易实现,通常也是构建检索管线最快的方法。缺点是,有意义的上下文可能被拆到不同的块中,使 retriever 更难返回完整答案。如果要索引的是一致且结构良好的内容,固定大小分块是一种可靠的基线方案。
递归字符切分会优先尝试保留文档结构,只有无法做到时才回退到更小的单元。它不会在达到精确长度时直接截断文本,而是寻找标题、段落或句子等自然断点。这种方法无需增加太多复杂度,就能生成更干净的分块边界,因此是许多生产级 RAG 系统中的实用选择。
有些文档本身就已经告诉你每个块应该从哪里开始、在哪里结束。API 文档、Markdown 文件、知识库和技术手册都包含标题与章节,而这些结构反映了人们获取信息的方式。结构感知切分会保留这些边界,把相关内容放在一起,也让检索出来的块单独阅读时更容易理解。
基于 Embedding 的语义分块不依赖格式,而是使用向量相似度检测含义的变化。当内容从一个主题转向另一个主题时,系统就会开始一个新的块。这种方式通常可以带来更高的检索质量,尤其适用于非结构化文本,但也需要在索引期间进行额外处理。当检索质量比索引速度更重要时,这些额外投入可能是值得的。
上下文分块(contextual chunking),也称为上下文感知分块(context-aware chunking),会更进一步,考虑一个块在被检索出来后,需要哪些周边上下文才能让人理解。它不只关注主题边界;当额外上下文能够改善搜索结果时,它还会维持相邻章节之间的关系。
额外的上下文可以改善复杂文档的检索效果,但也会提高索引复杂度,并非每条 RAG 管线都需要使用。
没有任何一种分块策略能适用于所有场景。选定一种方法后,下面这些实现层面的决策对检索质量的影响,可能与分块方法本身一样大。
最佳分块策略取决于你要索引的内容。技术文档通常适合结构感知切分。研究论文或长篇文章可能需要利用语义边界来保留上下文。在选择策略之前,先了解文档是如何组织的。
人们很容易执着于寻找一个理想的块长度。但问题在于:通用的最佳块长度并不存在。
你真正应该关注的是,每个块是否包含足够的上下文,能够独立回答一个问题。如果重要信息总是被拆到不同的块中,通常说明分块边界需要调整。
要判断一种分块策略是否有效,唯一的方法就是测试。使用具有代表性的查询比较检索结果,检查是否存在上下文遗漏或不相关的匹配,并评估这些差异如何影响下游回答。对分块边界进行微小调整,可能会给回答质量带来出人意料的巨大影响。
Chunking 并不是一次性的预处理步骤。随着文档、Embedding 模型或检索需求发生变化,分块策略也需要随之演进。n8n 是一个源码可用(source-available)的 AI 原生自动化平台,可以帮助团队在无需编程的情况下完成这项工作。
它为非技术用户提供可视化画布,用于测试和完善分块策略;技术团队则可以在需要时接入更高级的逻辑。你可以针对不同类型的文档,将其路由到特定的文本切分器,并检查执行历史,持续完善自己的方案。
通过 n8n 将文档路由到不同的文本切分器、生成 Embedding,并检查执行历史。
假设你正在为公司文档构建一个 RAG 聊天机器人。你不必让所有文档都经过同一条管线,而是可以在 n8n 中构建一个工作流,用来:
由于工作流采用模块化设计,当内容或检索需求发生变化时,你可以只更新管线中的某个部分,而不必重新设计其余部分。
语义分块有望提高用户所获得答案的质量。不过,正确的分块方法取决于要索引的文档,以及你试图解决的问题。从项目一开始,就应该把 Chunking 视为检索架构的一部分。
不要一味追求最先进的技术,而应该从能够满足需求的最简单策略开始。使用真实查询对其进行评估,关注检索上下文的质量,并随着语料库或需求的变化不断完善方案。与盲目采用更复杂的算法相比,持续迭代通常能产生更大的影响。
n8n 为你提供了一个能够在生产环境中构建、测试和运行分块管线的平台。借助可配置的文本切分器、Embedding 模型与向量存储集成,以及用于调试的执行历史,你可以尝试不同的分块策略,并随着检索需求的演进不断完善它们。
可配置的文本切分器、向量存储集成和用于调试的执行历史——全部集中在一个平台中。
语义分块器是一种工具或算法,它会根据含义将文本切分成多个块,而不是按照固定数量的 token 或字符进行切分。语义分块器会使用多种技术,包括 Embedding、主题建模和文档结构,以检测一个观点在哪里结束、下一个观点从哪里开始。
文本分块是为了索引或检索而将文档拆分成较小片段的通用过程。语义分块则是一种基于含义创建文本块的策略。
它不会在武断的边界上切分连续句子,而是力求把相关信息放在一起:相似度分数较高的句子会保留在同一个块中。如果相似度分数低于某个阈值,系统就会自动开始一个新的章节。
不一定。语义分块通常可以提高非结构化文档的检索质量,但也会增加索引复杂度。对于 API 文档或产品手册等结构化内容,递归切分或结构感知切分等更简单的方法,可能以更低的开销获得相近的效果。
一个好的块在被检索出来后,应该能够独立成立。它既要包含足够的上下文来回答问题,又不能包含大量无关信息。在实践中,这意味着既要保留完整含义,也要让文本块聚焦于单一主题或任务。
n8n 用户拥有广泛多样的背景、经验水平和兴趣。我们一直希望在博客文章中介绍不同的用户及其项目。如果你正在使用 n8n,并愿意为社区带来启发,请联系我们 💌