RAG分块技术全景图:5大策略解剖与千万级生产环境验证

简介: 本文深入解析RAG系统中的五大文本分块策略,包括固定尺寸、语义、递归、结构和LLM分块,探讨其工程实现与优化方案,帮助提升知识检索精度与LLM生成效果。

本文较长,建议点赞收藏,以免遗失。在构建RAG(检索增强生成)系统时,文本分块质量直接影响知识检索精度与LLM输出效果。本文将深入解析五种分块策略的工程实现与优化方案。文中还会放一些技术文档,方便大家更好的理解RAG中常见的技术点。

一、分块技术为何成为RAG的核心瓶颈?

RAG系统的标准工作流包含三个关键阶段:

  1. ​​知识库构建​​:将文档分割为语义块 → 生成向量嵌入 → 存储至向量数据库
  2. ​​实时检索​​:将用户查询向量化 → 检索Top-K相关文本块
  3. ​​生成响应​​:将检索结果与查询拼接 → 输入LLM生成最终答案

image.png

由于附加文档可能非常大,因此步骤 1 还涉及分块,其中将大文档分成较小/易于管理的部分。

image.png

此外,它提高了检索步骤的效率和准确性,这直接影响生成的响应的质量。接下来,我们就深入探讨RAG 的几大分块策略

二、五大分块策略深度解析

策略1:固定尺寸分块(Fixed-size Chunking)

生成块的最直观和直接的方法是根据预定义的字符、单词或标记数量将文本分成统一的段。

image.png

由于直接分割会破坏语义流,因此建议在两个连续的块之间保持一些重叠(上图蓝色部分)。

这很容易实现。而且,由于所有块的大小相同,它简化了批处理。

但有一个大问题。这通常会打断句子(或想法)。因此,重要的信息很可能会分散到不同的块中。

# LangChain实现示例
from langchain.text_splitter import CharacterTextSplitter
splitter = CharacterTextSplitter(        
    chunk_size=500,
    chunk_overlap=50,  # 关键重叠区
    separator="\n"
)
chunks = splitter.split_documents(docs)

策略2:语义分块(Semantic Chunking)

image.png

根据句子、段落或主题部分等有意义的单位对文档进行细分。

接下来,为每个片段创建嵌入。

假设我从第一个片段及其嵌入开始。

  1. 如果第一个段的嵌入与第二个段的嵌入具有较高的余弦相似度,则这两个段形成一个块。
  2. 这种情况一直持续到余弦相似度显著下降。
  3. 一旦发生这种情况,我们就开始新的部分并重复。

输出可能如下所示:

image.png

与固定大小的块不同,这保持了语言的自然流畅并保留了完整的想法。

由于每个块都更加丰富,它提高了检索准确性,进而使 LLM 产生更加连贯和相关的响应。

一个小问题是,它依赖于一个阈值来确定余弦相似度是否显著下降,而这个阈值在不同文档之间可能会有所不同。

# 基于SBERT的语义边界检测
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')

def semantic_chunking(sentences, threshold=0.85):
    chunks = []
    current_chunk = [sentences[0]]

    for i in range(1, len(sentences)):
        emb1 = model.encode(current_chunk[-1])
        emb2 = model.encode(sentences[i])
        sim = cosine_similarity(emb1, emb2)

        if sim > threshold:
            current_chunk.append(sentences[i])
        else:
            chunks.append(" ".join(current_chunk))
            current_chunk = [sentences[i]]

    return chunks

策略3:递归分块(Recursive Chunking)

image.png

​首先,根据固有分隔符(如段落或章节)进行分块。

接下来,如果每个块的大小超出了预定义的块大小限制,则将其拆分成更小的块。但是,如果块符合块大小限制,则不再进行进一步拆分。

输出可能如下所示:
image.png

如上图:

  • 首先,我们定义两个块(紫色的两个段落)。
  • 接下来,第 1 段被进一步分成更小的块。

与固定大小的块不同,这种方法还保持了语言的自然流畅性并保留了完整的想法。然而,在实施和计算复杂性方面存在一些额外的消耗。​

策略4:文档结构分块(Structure-based Chunking)

image.png

它利用文档的固有结构(如标题、章节或段落)来定义块边界。这样,它就通过与文档的逻辑部分对齐来保持结构完整性。

输出可能如下所示:

image.png

也就是说,这种方法假设文档具有清晰的结构,但事实可能并非如此。

此外,块的长度可能会有所不同,可能会超出模型令牌的限制。您可以尝试使用递归拆分进行合并。

# 基于BeautifulSoup的HTML结构解析
from bs4 import BeautifulSoup

def html_chunking(html):
    soup = BeautifulSoup(html, 'html.parser')
    chunks = []

    for section in soup.find_all(['h1', 'h2', 'h3']):
        chunk = section.text + "\n"
        next_node = section.next_sibling

        while next_node and next_node.name not in ['h1','h2','h3']:
            chunk += str(next_node)
            next_node = next_node.next_sibling

        chunks.append(chunk)

    return chunks​

策略5:LLM智能分块(LLM-based Chunking)

image.png

既然每种方法都有优点和缺点,为什么不使用 LLM 来创建块呢?

可以提示 LLM 生成语义上孤立且有意义的块。

显然,这种方法将确保较高的语义准确性,因为 LLM 可以理解超越简单启发式方法(用于上述四种方法)的上下文和含义。

唯一的问题是,它是这里讨论的所有五种技术中计算要求最高的分块技术。

此外,由于 LLM 通常具有有限的上下文窗口,因此需要注意这一点。

# GPT-4提示词设计
你是一位专业文本分析师,请根据语义完整性将以下文档分割为多个段落块:
要求:
1. 每个块包含完整语义单元
2. 最大长度不超过512token
3. 输出JSON格式:{"chunks": ["text1", "text2"]}

文档内容:{
  {document_text}}​

三、分块策略选型矩阵

每种技术都有其自身的优势和劣势。我个人建议语义分块在很多情况下效果很好,但同样,您需要进行测试。

选择将在很大程度上取决于内容的性质、嵌入模型的功能、计算资源等。

维度 固定尺寸 语义分块 递归分块 结构分块 LLM分块
处理速度 ★★★★★ ★★★☆☆ ★★★★☆ ★★★★☆ ★★☆☆☆
语义保持度 ★★☆☆☆ ★★★★★ ★★★★☆ ★★★★☆ ★★★★★
非结构化文档适应性 ★★★☆☆ ★★★★☆ ★★★★☆ ★☆☆☆☆ ★★★★★
实现复杂度 ★☆☆☆☆ ★★★☆☆ ★★★☆☆ ★★★☆☆ ★★☆☆☆
计算资源需求 ★☆☆☆☆ ★★★☆☆ ★★☆☆☆ ★★☆☆☆ ★★★★★

好了,相信你们对RAG分块策略有了一个更深的认识,这里我再分享一个我整理的关于RAG检索增强的技术文档给大家,粉丝朋友自行领取《RAG检索增强技术文档》。如果本文对你有所帮助,记得分享给身边有需要的朋友,我们下期见。

目录
相关文章
|
8月前
|
存储 自然语言处理 算法
RAG系统文本分块优化指南:9种实用策略让检索精度翻倍
本文深入探讨了RAG系统中的九种文本分块策略。固定大小分块简单高效,但可能破坏语义完整性;基于句子和语义的分块保留上下文,适合语义任务;递归与滑动窗口分块灵活控制大小;层次化和主题分块适用于结构化内容;特定模态分块处理多媒体文档;智能代理分块则通过大语言模型实现动态优化。开发者需根据文档类型、需求及资源选择合适策略,以提升RAG系统的性能和用户体验。作者Cornellius Yudha Wijaya详细分析了各策略的技术特点与应用场景。
1620 1
RAG系统文本分块优化指南:9种实用策略让检索精度翻倍
|
5月前
|
人工智能 运维 API
高级RAG优化手册:3招解决检索不准和查询模糊
本文深入解析RAG(检索增强生成)技术的核心优化方法,涵盖背景、架构与实践。RAG通过整合外部知识库,弥补大语言模型在实时性、准确性和专业性上的不足,广泛应用于企业场景。文章系统讲解RAG如何解决知识静态、生成幻觉与专业深度不足等问题,并剖析其离线索引与在线生成的闭环流程。此外,还介绍了高级优化策略,如查询重写、混合检索与结果重排序,助力突破RAG应用瓶颈。
1070 1
|
4月前
|
存储 数据库 索引
RAG检索质量差?这5种分块策略帮你解决70%的问题
RAG效果关键在于文档分块:固定、递归、语义、结构化与延迟分块各有优劣。合理选择能显著提升检索质量,减少幻觉,增强上下文理解,是构建高效RAG系统的核心环节。
537 4
|
3月前
|
人工智能 API 数据库
基于 LangGraph 的对话式 RAG 系统实现:多轮检索与自适应查询优化
本文介绍如何使用 LangGraph 构建一个具备实用性的RAG系统,突破传统“检索-生成”模式的局限。系统支持对话上下文理解、问题重写、相关性过滤、查询优化与智能路由,能处理追问、拒答无关问题,并在无结果时自动迭代,结合记忆机制实现更智能的问答体验。
402 4
|
2月前
|
XML 算法 安全
详解RAG五种分块策略,技术原理、优劣对比与场景选型之道
RAG通过检索与生成结合,提升大模型在企业应用中的准确性与安全性。分块策略是其核心,直接影响检索效果与回答质量。本文系统解析五种主流分块方法——固定大小、语义、递归、基于文档结构及LLM分块,对比其优缺点与适用场景,并提出选择建议与前沿优化方向,助力构建高效、可信的RAG系统。
|
5月前
|
存储 机器学习/深度学习 人工智能
RAG系统嵌入模型怎么选?选型策略和踩坑指南
嵌入是RAG系统的核心,直接影响检索质量。本文详解嵌入原理,解析稠密/稀疏、长上下文、多向量等类型,梳理选型关键:领域匹配、上下文长度、维度与成本,并结合MTEB基准给出实用建议,助你为业务挑选高效稳健的嵌入方案。
716 2
RAG系统嵌入模型怎么选?选型策略和踩坑指南
|
6月前
|
人工智能 自然语言处理 JavaScript
17种RAG实现方法大揭秘
RAG(检索增强生成)通过结合外部知识库与LLM生成能力,有效解决大模型知识滞后与幻觉问题。本文详解三类策略、17种实现方案,涵盖文档分块、检索排序与反馈机制,并提供工程选型指南,助力构建高效智能系统。
1452 0
|
7月前
|
JSON 人工智能 数据挖掘
LLM开发者必备:掌握21种分块策略让RAG应用性能翻倍
本文将系统介绍21种文本分块策略,从基础方法到高级技术,并详细分析每种策略的适用场景,以帮助开发者构建更加可靠的RAG系统。
423 0
LLM开发者必备:掌握21种分块策略让RAG应用性能翻倍

热门文章

最新文章