微信扫码
与创始人交个朋友
我要投稿
处理外部文档时,第一步通常涉及将它们分解成更小的片段以提取详细特征,然后嵌入这些特征以传达其语义。然而,对过大或过小的文本段进行嵌入可能会导致不理想的结果。因此,确定语料库中文档的最佳分段大小至关重要,以确保检索结果的准确性和相关性。
选择合适的分段策略需要
考虑几个关键因素,包括被索引内容的性质、嵌入模型、其最佳块大小、用户查询的预期长度和
复杂性,以及检索结果在特定应用中的使用方式。这篇短文介绍了关键的分块策略,包括基于字符的固定方法、平衡固定大小和自然语言结构的递归方法,以及考虑语义主题变化的高级技术。
固定大小(按字符)重叠滑动窗口。
这种方法涉及根据字符计数将文本分成固定大小的块。实现简单,并且包含重叠的部分,目的是防止切割句子或语意。然而,限制包括对上下文大小控制不精确,切割单词或句子的风险,以及缺乏语义考虑。适合用于探索性分析,但不推荐用于需要深入语义理解的任务。
使用LangChain的示例:
text = "..." # your text
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
chunk_size = 256,
chunk_overlap = 20
)
docs = text_splitter.create_documents([text])
递归结构感知分割。
这是一种结合了固定大小滑动窗口和结构感知分割的混合方法。它试图在固定的块大小与语言边界之间取得平衡,提供精确的上下文控制。实现复杂度较高,且存在块大小可变的风险。对于需要粒度和语义完整性的任务有效,但不推荐用于快速任务或结构划分不清晰的场景。
使用LangChain的示例:
text = "..." # your text
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size = 256,
chunk_overlap = 20,
separators = ["\n\n", "\n"]
)
docs = text_splitter.create_documents([text])
结构感知分割(按句子、段落)。
这种方法考虑了文本的自然结构,根据句子、段落、章节或篇章进行划分。尊重语言边界保持了语义完整性,但随着结构复杂性的变化也带来了挑战。对于需要上下文和语义的任务有效,但不适合缺乏明确结构划分的文本。
示例:
text = "..." # your text
docs = text.split(".")
内容感知分割(Markdown、LaTeX、HTML)。
这种方法专注于内容类型和结构,特别是在像Markdown、LaTeX或HTML这样的结构化文档中。它确保块内不混合不同的内容类型,保持了完整性。挑战包括理解特定的语法以及不适合非结构化文档。对于结构化文档很有用,但不建议用于非结构化内容。
使用LangChain针对Markdown文本的示例:
from langchain.text_splitter import MarkdownTextSplitter
markdown_text = "..."
markdown_splitter = MarkdownTextSplitter(chunk_size=100, chunk_overlap=0)
docs = markdown_splitter.create_documents([markdown_text])
使用LangChain针对LaTeX文本的示例:
from langchain.text_splitter import LatexTextSplitter
latex_text = "..."
latex_splitter = LatexTextSplitter(chunk_size=100, chunk_overlap=0)
docs = latex_splitter.create_documents([latex_text])
NLP分块:追踪主题变化。
这是一种基于语义理解的复杂方法,通过检测主题的显著转移来将文本分成块。确保了语义的一致性,但需要高级的NLP技术。对于需要语义上下文和主题连续性的任务有效,但对于高度主题重叠或简单的分块任务不适合。
使用LangChain中的NLTK工具包的示例:
text = "..." # your text
from langchain.text_splitter import NLTKTextSplitter
text_splitter = NLTKTextSplitter()
docs = text_splitter.split_text(text)
总结而言,有效处理外部文档需要一个深思熟虑的分段策略,考虑各种因素,如被索引内容的性质、嵌入模型、用户查询期望和应用特定的需求。所介绍的分块策略提供了一系列的途径,每种都有其优势和局限性。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-05-14
2024-04-26
2024-03-30
2024-04-12
2024-05-10
2024-07-18
2024-05-22
2024-05-28
2024-04-25
2024-04-26