节点解析器模块#
基于文件的节点解析器#
提供多种基于文件的节点解析器,可根据解析内容类型(JSON、Markdown等)创建节点。
最简单的流程是将FlatFileReader与SimpleFileNodeParser结合使用,自动为每种内容类型选择最佳节点解析器。然后,您可能需要将基于文件的节点解析器与基于文本的节点解析器链式组合,以处理文本的实际长度问题。
SimpleFileNodeParser#
from llama_index.core.node_parser import SimpleFileNodeParser
from llama_index.readers.file import FlatReader
from pathlib import Path
md_docs = FlatReader().load_data(Path("./test.md"))
parser = SimpleFileNodeParser()
md_nodes = parser.get_nodes_from_documents(md_docs)
HTMLNodeParser#
该节点解析器使用beautifulsoup解析原始HTML。
默认情况下会解析HTML标签的子集,但您可以自定义。
默认标签为:["p", "h1", "h2", "h3", "h4", "h5", "h6", "li", "b", "i", "u", "section"]
from llama_index.core.node_parser import HTMLNodeParser
parser = HTMLNodeParser(tags=["p", "h1"]) # 可选的标签列表
nodes = parser.get_nodes_from_documents(html_docs)
JSONNodeParser#
JSONNodeParser用于解析原始JSON。
from llama_index.core.node_parser import JSONNodeParser
parser = JSONNodeParser()
nodes = parser.get_nodes_from_documents(json_docs)
MarkdownNodeParser#
MarkdownNodeParser用于解析原始Markdown文本。
from llama_index.core.node_parser import MarkdownNodeParser
parser = MarkdownNodeParser()
nodes = parser.get_nodes_from_documents(markdown_docs)
文本分割器#
CodeSplitter#
根据编程语言分割原始代码文本。
完整支持语言列表见此处。
from llama_index.core.node_parser import CodeSplitter
splitter = CodeSplitter(
language="python",
chunk_lines=40, # 每个代码块的行数
chunk_lines_overlap=15, # 代码块之间的重叠行数
max_chars=1500, # 每个代码块的最大字符数
)
nodes = splitter.get_nodes_from_documents(documents)
LangchainNodeParser#
您也可以将langchain中的任何现有文本分割器包装为节点解析器。
from langchain.text_splitter import RecursiveCharacterTextSplitter
from llama_index.core.node_parser import LangchainNodeParser
parser = LangchainNodeParser(RecursiveCharacterTextSplitter())
nodes = parser.get_nodes_from_documents(documents)
SentenceSplitter#
SentenceSplitter尝试在保持句子边界的前提下分割文本。
from llama_index.core.node_parser import SentenceSplitter
splitter = SentenceSplitter(
chunk_size=1024,
chunk_overlap=20,
)
nodes = splitter.get_nodes_from_documents(documents)
SentenceWindowNodeParser#
SentenceWindowNodeParser与其他节点解析器类似,不同之处在于它将所有文档分割为单个句子。生成的节点在元数据中还包含每个节点周围的句子"窗口"。注意此元数据对LLM或嵌入模型不可见。
这对于生成具有特定范围的嵌入非常有用。结合MetadataReplacementNodePostProcessor使用,可以在将节点发送给LLM之前用上下文替换句子。
下方是使用默认设置初始化解析器的示例。实际应用中通常只需调整窗口大小。
from llama_index.core.node_parser import SentenceWindowNodeParser
node_parser = SentenceWindowNodeParser.from_defaults(
# 每侧捕获的句子数量
window_size=3,
# 存储周围句子窗口的元数据键
window_metadata_key="window",
# 存储原始句子的元数据键
original_text_metadata_key="original_sentence",
)
完整示例可参见与MetadataReplacementNodePostProcessor结合使用的案例。
SemanticSplitterNodeParser#
"语义分块"是Greg Kamradt在其关于5级嵌入分块的视频教程中提出的新概念:https://youtu.be/8OJC21T2SL4?t=1933。
不同于使用固定块大小分割文本,语义分割器通过嵌入相似度自适应地选择句子间的断点。这确保每个"块"包含语义相关的句子。
我们已将其适配为LlamaIndex模块。
查看我们的示例笔记本!
注意事项: - 正则表达式主要适用于英语句子 - 可能需要调整断点百分位阈值
from llama_index.core.node_parser import SemanticSplitterNodeParser
from llama_index.embeddings.openai import OpenAIEmbedding
embed_model = OpenAIEmbedding()
splitter = SemanticSplitterNodeParser(
buffer_size=1, breakpoint_percentile_threshold=95, embed_model=embed_model
)
完整示例可在使用SemanticSplitterNodeParser指南中找到。
TokenTextSplitter#
TokenTextSplitter尝试根据原始token计数分割成一致的块大小。
from llama_index.core.node_parser import TokenTextSplitter
splitter = TokenTextSplitter(
chunk_size=1024,
chunk_overlap=20,
separator=" ",
)
nodes = splitter.get_nodes_from_documents(documents)
基于关系的节点解析器#
HierarchicalNodeParser#
该节点解析器将节点分块为层次化节点。这意味着单个输入将被分块为多个层级的块大小,每个节点包含对其父节点的引用。
当与AutoMergingRetriever结合使用时,可以在检索到多数子节点时自动用父节点替换检索到的节点。这一过程为LLM提供了更完整的上下文以进行响应合成。
from llama_index.core.node_parser import HierarchicalNodeParser
node_parser = HierarchicalNodeParser.from_defaults(
chunk_sizes=[2048, 512, 128]
)
完整示例可参见与AutoMergingRetriever结合使用的案例。