LlamaIndex中的数据加载和摄取
说到底,数据的准备工作才是整个流程的基石。在把LLM引入数据操作之前,得先完成数据的处理与加载——这和机器学习里的ETL(提取、转换、加载)本质上是一回事。

LlamaIndex中,数据摄取管道通常由三个阶段构成:
加载数据
转换数据
索引并存储数据
索引和存储部分后续再聊,本文先聚焦前两个环节。
加载数据
LlamaIndex使用Reader(数据连接器)来加载数据。Reader从不同数据源读取信息,并将其转化为Document对象——Document是一组数据(文本、图像、音频、视频)及其元数据的集合。
说到Reader,最简单的当属SimpleDirectoryReader,它内建在LlamaIndex中,能够根据给定目录中的每个文件自动生成Document,支持的格式包括Markdown、PDF、Word、PPT、图片、音频、视频等多种。用法也极简单:
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
当然,现实世界的数据源远不止磁盘。LlamaIndex在LlamaHub上提供了大量针对不同数据源的Reader,你可以前往下面的地址按需下载:
比如,想读数据库数据,先安装DatabaseReader:
pip install llama-index-readers-database
然后初始化并查询:
from llama_index.core import download_loader
from llama_index.readers.database import DatabaseReader
reader = DatabaseReader(
scheme=os.getenv("DB_SCHEME"),
host=os.getenv("DB_HOST"),
port=os.getenv("DB_PORT"),
user=os.getenv("DB_USER"),
password=os.getenv("DB_PASS"),
dbname=os.getenv("DB_NAME"),
)
query = "SELECT * FROM users"
documents = reader.load_data(query=query)
这时DatabaseReader会对SQL数据库执行查询,并将结果的每一行作为一个Document对象返回。
如果只是为了快速实验或调试,也可以直接手动创建Document:
from llama_index.core import Document
doc = Document(text="your text")
处理和转换数据
加载完成后,下一步就是处理和转换,然后才能存入存储系统。典型的转换动作包括:文本分块、元数据提取、以及为每个块生成嵌入向量。这些步骤做得越到位,后续LLM检索和使用的效果就越好。
转换的输入和输出都是Node对象(Document是Node的子类),我们可以根据需求自由组合不同的转换步骤。
高级API
索引对象自带一个.from_documents()方法,接受Document数组,自动执行一系列转换和分块操作:
from llama_index.core import VectorStoreIndex
vector_index = VectorStoreIndex.from_documents(documents)
vector_index.as_query_engine()
如果想更精细地控制转换流程,比如调整文本切块方式,可以通过Settings全局设定,或者按索引单独设置:
from llama_index.core.node_parser import SentenceSplitter
text_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=10)
# 全局设置
from llama_index.core import Settings
Settings.text_splitter = text_splitter
# 针对单个索引设置
index = VectorStoreIndex.from_documents(
documents, transformations=[text_splitter]
)
低级API
如果希望完全掌控每一步,可以用LlamaIndex提供的转换模块(文本拆分器、元数据提取器等)作为独立组件,或者将它们组合成一个IngestionPipeline。处理Document的关键就是把它们拆分成LLM能直接使用的块(即Node对象)。LlamaIndex支持多种拆分器,从基于段落/句子/Token的拆分器,到基于文件格式(如HTML、JSON)的拆分器,一应俱全。
from llama_index.core import SimpleDirectoryReader
from llama_index.core.ingestion import IngestionPipeline
from llama_index.core.node_parser import TokenTextSplitter
documents = SimpleDirectoryReader("./data").load_data()
pipeline = IngestionPipeline(transformations=[TokenTextSplitter(), ...])
nodes = pipeline.run(documents=documents)
添加元数据
另外,还可以手动或通过自动元数据提取器,给Document和Node附加额外的元信息:
document = Document(
text="text",
metadata={"filename": "", "category": ""}
)
Node对象可以直接插入到向量索引中:
from llama_index.core.schema import TextNode
node1 = TextNode(text="", id_="")
node2 = TextNode(text="", id_="")
index = VectorStoreIndex([node1, node2]) -
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名