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 抽象。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

需要重新演唱

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

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

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

打赏作者

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

抵扣说明:

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

余额充值