AI知识库

53AI知识库

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


生成式AI的检索增强生成(RAG)分块策略优化
发布日期:2024-04-19 11:25:28 浏览次数: 1952 来源:机器AI学习 数据AI挖掘


处理外部文档时,第一步通常涉及将它们分解成更小的片段以提取详细特征,然后嵌入这些特征以传达其语义。然而,对过大或过小的文本段进行嵌入可能会导致不理想的结果。因此,确定语料库中文档的最佳分段大小至关重要,以确保检索结果的准确性和相关性。

选择合适的分段策略需要

考虑几个关键因素,包括被索引内容的性质、嵌入模型、其最佳块大小、用户查询的预期长度和

复杂性,以及检索结果在特定应用中的使用方式。这篇短文介绍了关键的分块策略,包括基于字符的固定方法、平衡固定大小和自然语言结构的递归方法,以及考虑语义主题变化的高级技术。

  1. 固定大小(按字符)重叠滑动窗口。

这种方法涉及根据字符计数将文本分成固定大小的块。实现简单,并且包含重叠的部分,目的是防止切割句子或语意。然而,限制包括对上下文大小控制不精确,切割单词或句子的风险,以及缺乏语义考虑。适合用于探索性分析,但不推荐用于需要深入语义理解的任务。

使用LangChain的示例:

text = "..." # your textfrom langchain.text_splitter import CharacterTextSplittertext_splitter = CharacterTextSplitter(    chunk_size = 256,    chunk_overlap  = 20)docs = text_splitter.create_documents([text])
  1. 递归结构感知分割。

这是一种结合了固定大小滑动窗口和结构感知分割的混合方法。它试图在固定的块大小与语言边界之间取得平衡,提供精确的上下文控制。实现复杂度较高,且存在块大小可变的风险。对于需要粒度和语义完整性的任务有效,但不推荐用于快速任务或结构划分不清晰的场景。

使用LangChain的示例:

text = "..." # your textfrom langchain.text_splitter import RecursiveCharacterTextSplittertext_splitter = RecursiveCharacterTextSplitter(    chunk_size = 256,    chunk_overlap  = 20,    separators = ["\n\n", "\n"])
docs = text_splitter.create_documents([text])


  1. 结构感知分割(按句子、段落)。

这种方法考虑了文本的自然结构,根据句子、段落、章节或篇章进行划分。尊重语言边界保持了语义完整性,但随着结构复杂性的变化也带来了挑战。对于需要上下文和语义的任务有效,但不适合缺乏明确结构划分的文本。

示例:

text = "..." # your textdocs = text.split(".")


  1. 内容感知分割(Markdown、LaTeX、HTML)。

这种方法专注于内容类型和结构,特别是在像Markdown、LaTeX或HTML这样的结构化文档中。它确保块内不混合不同的内容类型,保持了完整性。挑战包括理解特定的语法以及不适合非结构化文档。对于结构化文档很有用,但不建议用于非结构化内容。

使用LangChain针对Markdown文本的示例:

from langchain.text_splitter import MarkdownTextSplittermarkdown_text = "..."
markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0)docs = markdown_splitter.create_documents([markdown_text])

使用LangChain针对LaTeX文本的示例:

from langchain.text_splitter import LatexTextSplitterlatex_text = "..."latex_splitter = LatexTextSplitter(chunk_size=100, chunk_overlap=0)docs = latex_splitter.create_documents([latex_text])
  1. NLP分块:追踪主题变化。

这是一种基于语义理解的复杂方法,通过检测主题的显著转移来将文本分成块。确保了语义的一致性,但需要高级的NLP技术。对于需要语义上下文和主题连续性的任务有效,但对于高度主题重叠或简单的分块任务不适合。

使用LangChain中的NLTK工具包的示例:

text = "..." # your textfrom langchain.text_splitter import NLTKTextSplittertext_splitter = NLTKTextSplitter()docs = text_splitter.split_text(text)

总结而言,有效处理外部文档需要一个深思熟虑的分段策略,考虑各种因素,如被索引内容的性质、嵌入模型、用户查询期望和应用特定的需求。所介绍的分块策略提供了一系列的途径,每种都有其优势和局限性。


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

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

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

联系我们

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

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询