文档和节点(Documents / Nodes)
概念解释
在 LlamaIndex 中,Document
和 Node
对象是核心抽象。
-
Document:是一个通用容器,可以包含任何数据源,例如 PDF、API 输出或从数据库中检索的数据。它们可以手动构造,也可以通过我们的数据加载器自动创建。默认情况下,
Document
存储文本以及其他一些属性,例如:metadata
:一个字典,包含可以附加到文本的注释。relationships
:一个字典,包含与其他Document
或Node
的关系。
注意:我们正在积极改进其多模态能力,目前支持
Document
存储图像的 beta 版本。 -
Node:表示源
Document
的一个“块”,无论是文本块、图像还是其他。与Document
类似,它们包含元数据和与其他节点的关系信息。Node
是 LlamaIndex 中的一等公民。你可以选择直接定义Node
及其所有属性。你也可以选择通过我们的NodeParser
类将源Document
解析为Node
。默认情况下,从Document
派生的每个Node
将继承该Document
的相同元数据(例如,Document
中的“file_name”字段会传播到每个Node
)。
使用模式
以下是一些简单的代码片段,帮助你开始使用 Document
和 Node
。
文档(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)
文档/节点使用
查看我们的深入指南,了解更多关于如何使用 Document
和 Node
的详细信息。
示例:从 PDF 文件加载文档并解析为节点
假设你有一个 PDF 文件,并希望将其内容加载为 Document
,然后解析为 Node
。
-
安装必要的库:
pip install llama-index pypdf
-
加载 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})
-
解析文档为节点:
from llama_index.core.node_parser import SentenceSplitter # 解析节点 parser = SentenceSplitter() nodes = parser.get_nodes_from_documents([document])
-
构建索引:
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 中的 Document
和 Node
抽象。