LlamaIndex 节点分割器(SentenceSplitter 句子分割器、TokenSplitter 令牌分割器、SemanticSplitter 语义分割器、CodeSplitter 代码分割器) 作者:马育民 • 2025-08-27 11:33 • 阅读:10020 # 介绍 在LlamaIndex中,**节点分割器(Node Parser)** 是处理文档的核心组件之一,其作用是将原始文档(Document)分割为更小的、可管理的**节点(Node)**。节点是LlamaIndex中进行检索、索引和生成的基本单位,合理的分割策略能显著提升后续LLM处理的效率和准确性。 ### 节点分割器的核心作用 1. 将长文档拆分为符合LLM上下文窗口限制的片段 2. 保持语义连贯性(避免拆分完整语义单元,如句子、段落) 3. 为后续检索(如向量检索)提供合适粒度的单元 4. 支持添加元数据(如文档来源、位置信息)到每个节点 # 常见的节点分割器类型 LlamaIndex提供了多种内置分割器,适用于不同场景: ### 1. SentenceSplitter 句子分割器 最常用的分割器,基于句子边界分割文档,优先保证语义完整。 **特点**: - 按句子分割,避免将一个完整句子拆分为多个节点 - 可通过`chunk_size`控制节点最大长度(按令牌数) - 支持`chunk_overlap`设置节点间重叠部分(增强上下文连贯性) **适用场景**:大多数文本处理场景,尤其是需要保持句子完整性的场景(如书籍、文章)。 ### 2. TokenSplitter 令牌分割器 基于令牌(Token)计数严格分割,不考虑句子边界,更注重控制节点长度。 **特点**: - 按预设令牌数(`chunk_size`)强制分割,可能拆分句子 - 适合对节点长度有严格限制的场景(如适配特定LLM的上下文窗口) **适用场景**:需要精确控制节点大小的场景,如处理超长文档时避免超出模型令牌限制。 ### 3. SemanticSplitter 语义分割器 基于语义相似性分割,通过嵌入模型(Embedding)判断句子间的语义关联,将语义相近的句子划分为同一节点。 **特点**: - 依赖嵌入模型计算语义相似度,分割更符合语义逻辑 - 计算成本较高,速度较慢 **适用场景**:对语义连贯性要求极高的场景(如专业论文、技术文档)。 ### 4. CodeSplitter 代码分割器 专为代码文档设计,基于代码语法(如函数、类、注释)分割。 **特点**: - 识别代码中的结构(如`def`、`class`、`#`注释),避免拆分完整代码块 - 支持多种编程语言(Python、Java等) **适用场景**:处理代码库、技术文档中的代码片段。 # 核心参数说明 所有分割器都有一些通用核心参数: - `chunk_size`:节点最大长度(按令牌数,默认200) - `chunk_overlap`:节点间重叠的令牌数(默认20,增强上下文连贯性) - `separator`:分割符(如句子分割器默认用`. `、`! `等) # 使用示例 以下是使用`SentenceSplitter`分割文档的基本示例: ```python from llama_index.core import Document from llama_index.core.node_parser import SentenceSplitter # 1. 准备原始文档 text = """ LlamaIndex是一个强大的框架,用于构建基于大语言模型的应用。 它提供了数据加载、文档分割、索引构建等功能。 节点分割器是其核心组件之一,负责将长文档拆分为小节点。 """ doc = Document(text=text) # 2. 初始化分割器(设置chunk_size和chunk_overlap) splitter = SentenceSplitter( chunk_size=100, # 每个节点最大100令牌 chunk_overlap=10 # 节点间重叠10令牌 ) # 3. 分割文档为节点 nodes = splitter.get_nodes_from_documents([doc]) # 4. 查看结果 for i, node in enumerate(nodes): print(f"节点{i+1}:{node.text}") ``` ### 如何选择分割器? - 优先用`SentenceSplitter`:大多数通用文本场景(平衡语义完整和长度控制) - 用`TokenSplitter`:需要严格控制节点长度(如模型上下文窗口较小) - 用`SemanticSplitter`:处理对语义连贯性要求高的专业文档 - 用`CodeSplitter`:处理代码相关文档 通过合理配置节点分割器,可以让LLM更高效地理解和处理文档内容,提升检索和生成的质量。 原文出处:http://malaoshi.top/show_1GW1kgZHW1b1.html