llamaindex 文档和节点(Documents / Nodes)

文档和节点(Documents / Nodes)

概念解释

在 LlamaIndex 中,DocumentNode 对象是核心抽象。

  • Document:是一个通用容器,可以包含任何数据源,例如 PDF、API 输出或从数据库中检索的数据。它们可以手动构造,也可以通过我们的数据加载器自动创建。默认情况下,Document 存储文本以及其他一些属性,例如:

    • metadata:一个字典,包含可以附加到文本的注释。
    • relationships:一个字典,包含与其他 DocumentNode 的关系。

    注意:我们正在积极改进其多模态能力,目前支持 Document 存储图像的 beta 版本。

  • Node:表示源 Document 的一个“块”,无论是文本块、图像还是其他。与 Document 类似,它们包含元数据和与其他节点的关系信息。

    Node 是 LlamaIndex 中的一等公民。你可以选择直接定义 Node 及其所有属性。你也可以选择通过我们的 NodeParser 类将源 Document 解析为 Node。默认情况下,从 Document 派生的每个 Node 将继承该 Document 的相同元数据(例如,Document 中的“file_name”字段会传播到每个 Node)。

使用模式

以下是一些简单的代码片段,帮助你开始使用 DocumentNode

文档(Documents)
from llama_index.core import Document, VectorStoreIndex

text_list = [text1, text2, ...]  # 假设 text1, text2 等是你的文本数据
documents = [Document(text=t) for t in text_list]

# 构建索引
index = VectorStoreIndex.from_documents(documents)
节点(Nodes)
from llama_index.core.node_parser import SentenceSplitter

# 加载文档
# ...

# 解析节点
parser = SentenceSplitter()
nodes = parser.get_nodes_from_documents(documents)

# 构建索引
index = VectorStoreIndex(nodes)
文档/节点使用

查看我们的深入指南,了解更多关于如何使用 DocumentNode 的详细信息。

示例:从 PDF 文件加载文档并解析为节点

假设你有一个 PDF 文件,并希望将其内容加载为 Document,然后解析为 Node

  1. 安装必要的库

    pip install llama-index pypdf
    
  2. 加载 PDF 文件并解析为文档

    from llama_index.core import Document
    from pypdf import PdfReader
    
    # 读取 PDF 文件
    pdf_path = 'path/to/your/file.pdf'
    reader = PdfReader(pdf_path)
    text = ''
    for page in reader.pages:
        text += page.extract_text()
    
    # 创建文档
    document = Document(text=text, metadata={'file_name': pdf_path})
    
  3. 解析文档为节点

    from llama_index.core.node_parser import SentenceSplitter
    
    # 解析节点
    parser = SentenceSplitter()
    nodes = parser.get_nodes_from_documents([document])
    
  4. 构建索引

    from llama_index.core import VectorStoreIndex
    
    # 构建索引
    index = VectorStoreIndex(nodes)
    

通过这些步骤,你可以将 PDF 文件的内容加载为 Document,并解析为 Node,然后构建索引以供后续查询使用。

拓展
多模态文档

除了文本,Document 还可以包含图像等多模态数据。以下是一个示例,展示如何将图像和文本结合到一个 Document 中:

from llama_index.core import Document
from PIL import Image
import io

# 读取图像文件
image_path = 'path/to/your/image.jpg'
image = Image.open(image_path)
image_bytes = io.BytesIO()
image.save(image_bytes, format='JPEG')

# 创建多模态文档
document = Document(text='描述图像的文本', metadata={'image': image_bytes.getvalue()})
自定义节点解析器

你可以创建自定义的节点解析器,以满足特定需求。例如,按段落分割文本:

from llama_index.core import Node

class ParagraphSplitter:
    def get_nodes_from_documents(self, documents):
        nodes = []
        for doc in documents:
            paragraphs = doc.text.split('\n\n')
            for para in paragraphs:
                nodes.append(Node(text=para, metadata=doc.metadata))
        return nodes

# 使用自定义解析器
parser = ParagraphSplitter()
nodes = parser.get_nodes_from_documents([document])

通过这些示例和拓展,希望你能更好地理解和使用 LlamaIndex 中的 DocumentNode 抽象。

### 如何实现 `get_nodes_from_documents` 方法 为了从文档中提取节点,可以通过继承并重写 `NodeParser` 类中的方法来定制化处理逻辑。下面展示了如何通过自定义类 `ParagraphSplitter` 来实现这一功能[^1]。 ```python from llama_index.core.node_parser import NodeParser from llama_index.core.schema import TextNode class ParagraphSplitter(NodeParser): def get_nodes_from_documents(self, documents): nodes = [] for doc in documents: paragraphs = doc.text.split('\n\n') for idx, para in enumerate(paragraphs): node_id = f"node_{idx}" text_node = TextNode(text=para, id_=node_id) nodes.append(text_node) return nodes ``` 此代码片段实现了按照双换行符 `\n\n` 将文档内容拆分为多个段落,并为每一个段落创建一个新的 `TextNode` 对象,最后返回由这些对象组成的列表作为最终的结果集。 对于想要进一步操作所获得的节点集合的情况,比如查找根节点或是叶节点,则可以利用 LlamaIndex 库所提供的辅助函数来进行处理[^2]: ```python from llama_index.core.node_parser import get_leaf_nodes, get_root_nodes parser = ParagraphSplitter() nodes = parser.get_nodes_from_documents(documents) print(f"Total number of nodes: {len(nodes)}") root_nodes = get_root_nodes(nodes) print(f"Number of root nodes: {len(root_nodes)}") leaf_nodes = get_leaf_nodes(nodes) print(f"Number of leaf nodes: {len(leaf_nodes)}") ``` 上述脚本不仅能够统计总共有多少个节点被成功解析出来,还能区分哪些是处于树结构顶端的根节点以及位于底部不再细分的叶节点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要重新演唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值