LlamaIndex 节点分割器(SentenceSplitter 句子分割器、TokenSplitter 令牌分割器、SemanticSplitter 语义分割器、CodeSplitter 代码分割器)

介绍

在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:节点最大长度(按令牌数,默认 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更高效地理解和处理文档内容,提升检索和生成的质量。