LlamaIndex 中的文档分段涉及将大型文档分解为更小、更易于管理的块(节点),以提高处理和检索效率。 LlamaIndex 提供了内置工具,例如 NodeParser
类(例如,SentenceSplitter
,TokenTextSplitter
)以根据句子边界、token 限制或自定义规则拆分文本。 例如,SentenceSplitter
将文本划分为句子,并在块之间具有可选的重叠,而 TokenTextSplitter
确保块适合 LLM 兼容性的 token 限制。 开发人员配置诸如 chunk_size
(例如,512 个 token)和 chunk_overlap
(例如,20 个 token)之类的参数,以平衡上下文保留和块大小。 分段通常在加载原始数据后应用(例如,使用 SimpleDirectoryReader
),从而将非结构化文本转换为用于索引的结构化节点。
对于复杂的文档(例如,包含混合文本和表格的 PDF),分段需要结合多种策略。 LlamaIndex 支持分层解析,其中文档首先被分割成逻辑部分(例如,使用 UnstructuredElementNodeParser
用于 HTML/PDF 元素),然后再应用句子级别的分割。 例如,一篇研究论文可以被分割成摘要、方法和结果部分,每个部分进一步分割成句子。 元数据(例如,章节标题)保存在节点中以维护上下文。 开发人员还可以使用自定义的正则表达式模式或第三方库(例如,PyMuPDF
用于 PDF 表格)来提取结构化数据,然后将结果注入到节点中。 这种方法确保了语义一致性,同时处理了多种内容类型。
高级用例涉及基于内容类型的动态分段。 对于代码仓库,CodeSplitter
可以将代码文件分割成函数或类。 对于 markdown 文档,MarkdownNodeParser
通过标题分割文本。 开发人员可以链接多个分割器(例如,将 PDF 分割成页面,然后再分割成段落)或实现自定义节点创建逻辑。 LlamaIndex 还支持父子节点关系,其中父节点表示一个章节(例如,“第一章”),而子节点包含其子章节。 这种层次结构通过允许框架在查询期间遍历关系来提高检索准确性。 例如,关于“神经网络”的查询可能首先匹配关于机器学习章节的父节点,然后深入到特定的子节点以获得详细的答案。