掘金 人工智能 16小时前
💡小白都能看懂的RAG分块实战:从递归分割到LLM智能拆解的全解析
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了在构建RAG(检索增强生成)系统时,文本分块为何成为关键瓶颈,并详细解析了固定尺寸分块、语义分块、递归分块、文档结构分块以及LLM智能分块这五种策略的工程实现与优化方案。每种策略都结合了实际应用场景和技术实现,分析了其优缺点、适用性及计算复杂度。文章还提供了一个分块策略选型矩阵,帮助用户根据内容特性、计算资源等因素做出最优选择,以提升知识检索精度和LLM输出效果。

🔹 RAG系统的核心瓶颈在于知识库构建阶段的文本分块,它直接影响实时检索的效率和准确性,进而决定了LLM生成响应的质量。标准RAG工作流包括知识库构建(分块、向量化、存储)、实时检索(查询向量化、Top-K检索)和生成响应(拼接、LLM输出)。

🔸 固定尺寸分块是最直观的方法,通过预设字符、单词或标记数分割文本,易于实现且便于批处理,但常打断句子和语义流,导致信息分散。为缓解此问题,建议在块间设置重叠区。

🔹 语义分块根据句子、段落或主题等有意义的单位进行分割,通过计算相邻文本片段的余弦相似度来确定分块边界,能保持语言的自然流畅和完整想法,提高检索准确性。缺点是依赖于阈值,且阈值可能因文档而异。

🔸 递归分块先按自然分隔符(如段落、章节)分块,若块过大则进一步细分。此方法能保持语言流畅和想法完整,但实现和计算复杂度相对较高。结构分块则利用文档的固有结构(标题、章节)定义块边界,保持结构完整性,但依赖于清晰的文档结构,且块长度可能不一。

🔹 LLM智能分块利用LLM理解上下文和含义的能力来生成语义孤立且有意义的块,能确保高语义准确性,但计算成本最高,且需注意LLM的上下文窗口限制。最终策略选择需综合考虑内容性质、嵌入模型能力及计算资源等因素。

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

输出可能如下所示:

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

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

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

# 基于SBERT的语义边界检测from sentence_transformers import SentenceTransformermodel = 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)

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

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

输出可能如下所示:

如上图:

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

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

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

输出可能如下所示:

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

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

# 基于BeautifulSoup的HTML结构解析from bs4 import BeautifulSoupdef 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)

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

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

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

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

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

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

三、分块策略选型矩阵

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

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

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

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

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

RAG 文本分块 检索增强生成 LLM AI应用
相关文章