基于大语言模型(LLM)的应用分块策略

基于大语言模型(LLM)的应用分块策略

什么是分块(Chunking)?

在构建基于大语言模型(LLM)的应用时,**分块(Chunking)**是指将较长的文本分割成较小的片段,这些片段称为“块”。

这是一种重要的预处理技术,有助于优化最终存储在向量数据库中内容的关联性。关键在于找到大小适中的块:它们既要足够大以包含有意义的信息,又要足够小以确保应用的高性能和检索增强生成(Retrieval Augmented Generation, RAG)、智能体(Agentic)工作流程等任务的低延迟响应。

本文将探讨几种分块方法,并讨论在选择块大小和方法时需要权衡的利弊。最后,我们将提供一些建议,帮助您确定适合您应用的最佳块大小和方法。


为什么我们的应用需要分块?

对于任何涉及向量数据库或 LLM 的应用来说,分块是必不可少的,主要基于两个重要原因。首先,是为了确保嵌入模型能够将数据适配到其上下文窗口内;其次,是为了确保块本身包含搜索所需关键信息。让我们详细探讨一下其中原因和作用。

所有嵌入模型都有上下文窗口,它决定了可以处理成固定大小向量的标记(Token)数量。超出此上下文窗口可能意味着多余的标记会被截断或丢弃,然后才被处理成向量。这可能会带来潜在的危害,因为重要的上下文可能会从文本的表示中移除,从而导致在搜索时无法被检索出来。

此外,仅仅为模型调整数据大小是不够的;生成的块必须包含与搜索相关的信息。如果某个块中的句子在没有上下文的情况下没有用处,那么在查询时可能就无法被检索出来!


分块在智能体应用和检索增强生成(RAG)中的作用

智能体(Agent)可能需要访问数据库中的最新信息,以便调用工具、做出决策和响应用户查询。从数据库搜索返回的块会在会话期间消耗上下文,并为智能体的响应提供基础。

我们使用嵌入的块来构建基于智能体可访问的知识库的上下文。这个上下文使智能体基于可信信息进行 grounding。

与语义搜索依赖于良好的分块策略来提供可用输出类似,智能体应用需要有意义的信息块才能继续。如果智能体被误导,或者提供的信息没有足够的上下文,它可能会浪费标记生成幻觉或调用错误的工具。

此外,长上下文的嵌入模型和 LLM 可能会遇到“中间丢失(Lost-in-the-Middle)”问题,即即使包含在生成中,埋藏在长文档中的相关信息也可能会被遗漏。解决此问题的方法是确保将最佳数量的信息传递给下游 LLM,这必然会降低延迟并确保质量。


选择分块策略时应考虑哪些因素?

选择最佳分块策略会受到多种因素的影响,这些因素因用例而异。以下是一些需要记住的关键点:

  1. 要分块的数据类型是什么?
     您正在处理的是长文档(如文章或书籍),还是较短的内容(如推文、产品描述或聊天消息)?短文档可能根本不需要分块,而大型文档可能具有特定的结构(如子标题或章节)可以指导分块策略。
  2. 您正在使用哪个嵌入模型?
     不同的嵌入模型对信息的容量不同,尤其是在代码、金融、医疗或法律信息等专门领域。而且,这些模型的训练方式可以强烈影响其在实际应用中的表现。选择适合您领域的模型后,请务必调整您的分块策略,使其与模型经过训练的文档类型一致。
  3. 您对用户查询的长短和复杂性的预期是什么?
     用户查询是简短且具体的,还是冗长且复杂的?这也可能影响您选择分块内容的方式,以便嵌入的查询和嵌入的块之间存在更强的相关性。
  4. 检索到的结果将在您的特定应用中如何使用?
     例如,它们将用于语义搜索、问答、检索增强生成(RAG),甚至是智能体工作流程?例如,人类从搜索结果中审查的信息量可能小于或大于 LLM 生成响应所需的信息量。这些因素决定了您的数据应如何在向量数据库中表示。

提前回答这些问题将帮助您选择一种平衡性能和准确性的分块策略。


分块方法

1、固定大小分块

这是最常见且最直接的分块方法:我们只需确定块中的标记(Token)数量,并使用此数量将文档分割成固定大小的块。通常,这个数量是嵌入模型的最大上下文窗口大小(例如,llama-text-embed-v2 为 1024,text-embedding-3-small 为 8196)。

在大多数情况下,固定大小分块将是最好的方法,我们建议从这里开始,并在确定其不足后才进行迭代。

2、“内容感知”分块

虽然固定大小分块非常容易实现,但它可能会忽略文档中可以用于指导相关分块的关键结构。内容感知分块是指遵循结构以帮助说明块含义的策略。

简单的基于句子和段落的分割

正如我们之前提到的,一些嵌入模型经过优化以嵌入句子级的内容。但有时,需要从未经预处理的较大数据集中挖掘句子。在这些情况下,有必要使用句子分块,并且有几种可用的方法和工具可以实现这一点:

  • 简单分割:
     最简单的方法是按句号(“.”)、换行或空白字符分割句子。
  • 自然语言工具包(NLTK)是一个流行的 Python 库,用于处理人类语言数据。它提供了一个训练好的句子标记器,可以将文本分割成句子,有助于创建更具意义的块。

3、递归字符级别分块

LangChain 它尝试按照给定的顺序使用分隔符分割文本。分割器的默认行为使用 ["nn", "n", " ", ""] 分隔符,根据给定的块大小分割段落、句子和单词。

这是一种很好的折衷方法,介于始终按特定字符分割和使用更具语义的分隔器之间,同时还尽可能确保固定块大小。

4、基于文档结构的分块

在对大型文档(如 PDF、DOCX、HTML、代码片段、Markdown 文件和 LaTeX)进行分块时,专门的分块方法有助于在创建块时保留内容的原始结构。

  • PDF 文档包含大量的标题、文本、表格和其他需要预处理才能进行分块的内容。LangChain 提供了一些有用的工具来处理这些文档。
  • 从抓取的网页中提取的 HTML 可以包含标签(如 <p> 用于段落,或 <title> 用于标题),这些标签可以指导文本的分割或识别,例如在产品页面或博客文章中。您可以自行编写解析器。
  • Markdown 是一种轻量级标记语言,常用于格式化文本。通过识别 Markdown 语法(例如,标题、列表和代码块),您可以根据其结构和层次智能地分割内容,从而生成语义更连贯的块。

5、语义分块

一种新的实验性分块技术由Greg Kamradt首次提出。Kamradt 正确地指出,全局分块大小可能是一个过于简单化的机制,无法考虑到文档中片段的含义。如果我们使用这种机制,我们就无法知道是否将毫不相关的片段组合在一起了。

幸运的是,如果您正在构建基于 LLM 的应用,您很可能已经具备创建嵌入的能力——而嵌入可以用来提取数据中存在的语义含义。这种语义分析可以用来创建由讨论相同主题或话题的句子组成的块。

语义分块包括将文档分解为句子,将每个句子与其周围的句子进行分组,并为这些组生成嵌入。通过比较每个组与其前一个组之间的语义距离,您可以识别主题或主题发生变化的位置,从而确定分块边界。

6、基于 LLM 的上下文分块

有时,在不完全丢失上下文的情况下,无法从较大的复杂文档中分块信息。当文档有数百页、主题频繁变化或需要理解文档中许多相关部分时,可能会发生这种情况。Anthropic 在 2024 年推出了上下文检索来帮助解决这个问题。Anthropic 会使用 Claude 实例,将整个文档及其分块内容作为输入,生成一个情境化的描述,并将该描述附加到各个块中进行嵌入。为避免每次都重复处理文档,该描述会被缓存供后续调用,应用于所有必要的块。

重要的是要记住,您并非完全受限于您的分块策略。在查询向量数据库中的分块数据时,检索到的信息通常是给定用户查询,语义上最相似的顶部块。块扩展是一种后处理方法,它在查询时除了返回与用户查询最相似的块外,还顺带检索相邻的块,为用户或智能体提供更完整的上下文。块可以根据您的用例扩展到段落、页面甚至整个文档。

总结

在大多数情况下,对文本内容进行分块看似简单,但当应用于结构复杂或主题频繁变换的文档时,可能会遇到一些特殊挑战。分块没有一刀切的解决方案,因此适用于一个用例的方法可能不适用于另一个。


🌟 「同频的人,终会在山顶相逢」

在这里,我们聚焦AI前沿、能量提升与长期价值

如果你相信:科技是梯子,认知是方向,复利是答案

关注@AI纪元Ultra,与10000+成长型伙伴同行

基于大语言模型(LLM)的应用分块策略
推荐阅读
Manus的Prompt体验” data-itemshowtype=”0″ linktype=”text” data-linktype=”2″>提示词即操作系统:Manus的Prompt体验
DeepSeek​​” data-itemshowtype=”0″ linktype=”text” data-linktype=”2″>​​史诗级进化!AI模型全回顾: 从Transformer到DeepSeek​​

RAG技术前沿技术新闻资讯

Chonkie:开源、轻量、极速的 RAG 分块神器 🦛

2025-7-2 22:47:44

RAG技术前沿技术新闻资讯

Chonkie:开源、轻量、极速的 RAG 分块神器 🦛

2025-7-2 23:50:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
购物车
优惠劵
搜索