介绍
在LlamaIndex中,节点分割器(Node Parser) 是处理文档的核心组件之一,其作用是将原始文档(Document)分割为更小的、可管理的节点(Node)。节点是LlamaIndex中进行检索、索引和生成的基本单位,合理的分割策略能显著提升后续LLM处理的效率和准确性。
节点分割器的核心作用
- 将长文档拆分为符合LLM上下文窗口限制的片段
- 保持语义连贯性(避免拆分完整语义单元,如句子、段落)
- 为后续检索(如向量检索)提供合适粒度的单元
- 支持添加元数据(如文档来源、位置信息)到每个节点
常见的节点分割器类型
LlamaIndex提供了多种内置分割器,适用于不同场景:
1. SentenceSplitter 句子分割器
最常用的分割器,基于句子边界分割文档,优先保证语义完整。
特点:
- 按句子分割,避免将一个完整句子拆分为多个节点
- 可通过
chunk_size控制节点最大长度(按令牌数) - 支持
chunk_overlap设置节点间重叠部分(增强上下文连贯性)
适用场景:大多数文本处理场景,尤其是需要保持句子完整性的场景(如书籍、文章)。
2. TokenSplitter 令牌分割器
基于令牌(Token)计数严格分割,不考虑句子边界,更注重控制节点长度。
特点:
- 按预设令牌数(
chunk_size)强制分割,可能拆分句子 - 适合对节点长度有严格限制的场景(如适配特定LLM的上下文窗口)
适用场景:需要精确控制节点大小的场景,如处理超长文档时避免超出模型令牌限制。
3. SemanticSplitter 语义分割器
基于语义相似性分割,通过嵌入模型(Embedding)判断句子间的语义关联,将语义相近的句子划分为同一节点。
特点:
- 依赖嵌入模型计算语义相似度,分割更符合语义逻辑
- 计算成本较高,速度较慢
适用场景:对语义连贯性要求极高的场景(如专业论文、技术文档)。
4. CodeSplitter 代码分割器
专为代码文档设计,基于代码语法(如函数、类、注释)分割。
特点:
- 识别代码中的结构(如
def、class、#注释),避免拆分完整代码块 - 支持多种编程语言(Python、Java等)
适用场景:处理代码库、技术文档中的代码片段。
核心参数说明
所有分割器都有一些通用核心参数:
chunk_size:节点最大长度(按令牌数,默认1024)chunk_overlap:节点间重叠的令牌数(默认200,增强上下文连贯性)separator:分割符(如句子分割器默认用.、!等)
官方解释:https://docs.llamaindex.org.cn/en/stable/api_reference/node_parsers/sentence_splitter/
经验
根据经验,chunk_size 在不超过 向量模型最大token的情况下,设置为 1024
chunk_overlap 设置为 200
使用示例
以下是使用SentenceSplitter分割文档的基本示例:
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更高效地理解和处理文档内容,提升检索和生成的质量。