RAG技术性能提升之文档分块策略方案 原创

发布于 2024-7-9 07:20
浏览
0收藏

在人工智能领域,尤其是大型语言模型(LLM)的应用中,检索增强生成(Retrieval-Augmented Generation, RAG)技术正变得越来越重要。RAG技术通过结合检索和生成能力,为模型提供了丰富的外部知识源,从而生成更准确、更符合上下文的答案。本文将深入探讨RAG技术中的文档分块策略,这些策略对于提高检索效率和生成质量具有决定性作用。

RAG技术性能提升之文档分块策略方案 -AI.x社区

一、文档分块策略的重要性

文档分块是RAG技术中的关键步骤,它影响着模型对信息的检索和理解。合理的分块策略可以:

  • 提高检索的准确性和效率。
  • 保持文本的逻辑和语义完整性。
  • 增强模型对文本内容的理解和生成能力。

二、固定大小分块

固定大小分块是一种简单且计算成本低的方法,适用于对文本进行均匀划分,便于模型处理。

核心优势:

  • 简单易实现,计算成本低,不需要复杂的NLP处理。
  • 适用于对文本进行标准化处理的场景。

示例代码:

from langchain.text_splitter import CharacterTextSplitter


text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
encoding="cl100k_base", 
chunk_size=100, 
chunk_overlap=0
)
texts = text_splitter.split_text(state_of_the_union)

三、基于结构的分块

基于结构的分块方法利用文档的固有结构,如HTML或Markdown中的标题和段落,以保持内容的逻辑性和完整性。

核心优势:

  • 利用文档结构信息,提高分块的语义相关性。
  • 适用于结构化文档的处理。

示例代码:

from langchain.text_splitter import HTMLHeaderTextSplitter


html_string = "<html>...</html>"
headers_to_split_on = [("h1", "Header 1"), ("h2", "Header 2"), ("h3", "Header 3")]
html_splitter = HTMLHeaderTextSplitter(headers_to_split_notallow=headers_to_split_on)
html_header_splits = html_splitter.split_text(html_string)

四、基于语义的分块

基于语义的分块策略关注于文本的语义独立性,确保每个分块包含完整的语义信息。可以通过标点符号、自然段落或使用NLTK、Spacy等工具实现。

核心优势:

  • 保持语义完整性,提高文本的可读性和理解性。
  • 适用于需要深入理解文本内容的场景。

示例代码:

from langchain_experimental.text_splitter import SemanticChunker
from langchain.embeddings import OpenAIEmbeddings


text_splitter = SemanticChunker(OpenAIEmbeddings())
docs = text_splitter.create_documents([state_of_the_union], breakpoint_threshold_type="percentile")
print(docs[0].page_content)

五、递归分块

递归分块是一种动态的分块方法,可以使用一组分隔符,以分层和迭代的方式将文本划分为更小的块,动态适应不同类型的文本数据。

核心优势:

  • 适应性强,能够处理不同类型和结构的文本。
  • 提高分块的灵活性和准确性。

示例代码:

from langchain.text_splitter import RecursiveCharacterTextSplitter


text_splitter = RecursiveCharacterTextSplitter(
    # 指定每个文本块(chunk)的大小为100个字符
chunk_size=100, 
    # 设置相邻文本块之间的重叠字符数为20
chunk_overlap=20,
    # 指定用于测量文本长度的函数
length_function=len,
    # 不使用正则表达式作为分隔符来分割文本
is_separator_regex=False,
)
texts = text_splitter.create_documents([state_of_the_union])


print(texts[0])
print(texts[1])

总结:

选择合适的文档分块策略对于提升RAG技术的效果至关重要。不同的分块策略适用于不同的场景,可以根据应用需求和数据特性选择单一策略或组合使用多种策略。通过合理的分块,可以增强RAG技术结合检索和生成能力,为大模型语言提供更准确、高效的答案。


本文转载自公众号顶层架构领域

原文链接:​​https://mp.weixin.qq.com/s/sSnZbEbiKUe5GMS6eBtuXg​


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2024-7-9 11:15:11修改
收藏
回复
举报
回复
相关推荐