AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


优化RAG效果 四种文档分块策略解析
发布日期:2024-05-29 07:14:48 浏览次数: 1882


检索增强生成(Retrieval-Augmented Generation, RAG)可能是现阶段大型语言模型在实际应用中落地最有效的方式。RAG技术通过结合检索和生成两种能力,为大模型LLM提供了外部知识源的支持,使其能够更准确、高效地生成符合上下文的答案,同时保持了模型的可扩展性、可控性和可解释性。

在RAG技术中,文档分块(Chunk)的策略对于提高检索和生成的效果至关重要。本文将探讨几种常见的分块策略,并介绍如何在实际应用中实现这些策略。


固定大小分块


固定大小分块是最常见的方法,通过设定块的大小和是否有重叠来决定分块。这种方法简单直接,不需要使用任何NLP库,因此计算成本低且易于使用。在实际实现中,可以使用特定的工具或库,如LangChain中的CharacterTextSplitter工具,将文本划分为包含固定数量token的块。

示例代码:

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格式的文档。这种方法可以充分利用文档中的结构信息,如标题、段落等,保持文本的逻辑和语义完整性。LangChain提供了MarkdownHeaderTextSplitter和HTMLHeaderTextSplitter工具,可以用于解析和转换Markdown或HTML文本。

示例代码:

from langchain.text_splitter import HTMLHeaderTextSplitter
html_string = """<!DOCTYPE html><html><body> <div> <h1>Foo</h1> <p>Some intro text about Foo.</p> <div> <h2>Bar main section</h2> <p>Some intro text about Bar.</p> <h3>Bar subsection 1</h3> <p>Some text about the first subtopic of Bar.</p> <h3>Bar subsection 2</h3> <p>Some text about the second subtopic of Bar.</p> </div> <div> <h2>Baz</h2> <p>Some text about Baz</p> </div> <br> <p>Some concluding text about Foo</p> </div></body></html>"""
headers_to_split_on = [ ("h1", "Header 1"), ("h2", "Header 2"), ("h3", "Header 3"),]
html_splitter = HTMLHeaderTextSplitter(headers_to_split_on=headers_to_split_on)html_header_splits = html_splitter.split_text(html_string)




基于语义的分块


基于语义的分块策略旨在确保每个分块包含尽可能多的语义独立信息。这可以通过标点符号、自然段落或者使用工具包如NLTK、Spacy等实现。此外,还可以使用Embedding-based方法,通过预训练的词嵌入模型(如Word2Vec或BERT)将文本转换为嵌入向量,并根据语义信息进行分块。

示例代码:


from langchain_experimental.text_splitter import SemanticChunkerfrom 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)



递归分块


递归分块使用一组分隔符,以分层和迭代的方式将输入文本划分为更小的块。这种方法可以根据文本的内容和结构动态调整分块的大小和形状,从而更好地适应不同类型的文本数据。LangChain的RecursiveCharacterTextSplitter可以用于实现递归分块。


from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter( chunk_size=100, 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技术可以更好地结合检索和生成能力,为大型语言模型提供强大的外部知识支持,从而生成更准确和高效的答案。希望本文对你在实际项目中应用RAG技术有所帮助。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询