节点解析器模块#
基于文件的节点解析器#
有几种基于文件的节点解析器,它们会根据被解析内容的类型(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"]) # optional list of tags
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, # lines per chunk
chunk_lines_overlap=15, # lines overlap between chunks
max_chars=1500, # max chars per chunk
)
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(
# how many sentences on either side to capture
window_size=3,
# the metadata key that holds the window of surrounding sentences
window_metadata_key="window",
# the metadata key that holds the original sentence
original_text_metadata_key="original_sentence",
)
在此处可找到与 MetadataReplacementNodePostProcessor
结合使用的完整示例。
SemanticSplitterNodeParser#
“语义分块”是 Greg Kamradt 在关于嵌入分块的 5 个层级的视频教程中提出的一个新概念:https://youtu.be/8OJC21T2SL4?t=1933。
语义分割器不使用**固定**块大小对文本进行分块,而是根据嵌入相似度自适应地选择句子之间的断点。这确保了一个“块”包含语义相关的句子。
我们将其改编成一个 LlamaIndex 模块。
查看下面的 Notebook!
注意事项
- 此正则表达式主要适用于英文句子
- 您可能需要调整断点百分位数阈值。
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]
)