在AI和大数据的世界中,处理和加载数据是任何项目成功的关键步骤之一。在这篇文章中,我们将介绍如何使用LlamaIndex加载和处理数据。LlamaIndex通过其数据连接器和变换API,使这一过程变得更加简单和高效。
数据加载
在LlamaIndex中,数据加载器(Reader)用于从不同的数据源获取数据,并将其格式化为Document对象。Document对象是数据及其元数据的集合。
使用SimpleDirectoryReader加载数据
SimpleDirectoryReader是最简单的加载器,可以将指定目录中的每个文件创建为Document对象。它可以读取各种格式,包括Markdown、PDF、Word文档、PPT、图片、音频和视频等。
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
使用LlamaHub中的Reader
由于数据源的多样性,LlamaIndex提供了一个数据连接器注册表LlamaHub。在这个例子中,LlamaIndex下载并安装了一个名为DatabaseReader的连接器,它可以运行SQL查询并将结果中的每一行返回为Document对象。
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)
直接创建Document对象
如果不使用加载器,也可以直接创建Document对象。
from llama_index.core import Document
doc = Document(text="text")
数据变换
加载数据后,需要对数据进行处理和变换,以便存储和优化使用。变换包括分块、提取元数据和嵌入每个块。
使用高层次变换API
Indexes具有.from_documents()方法,该方法接受Document对象数组并将其解析和分块。
from llama_index.core import VectorStoreIndex
vector_index = VectorStoreIndex.from_documents(documents)
vector_index.as_query_engine()
自定义文本分割器
可以通过传递自定义的变换列表或应用于全局设置来定制文本分割器。
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
可以显式定义这些步骤,使用独立的变换模块或组合它们。
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": "<doc_file_name>", "category": "<category>"},
)
添加嵌入
为了将节点插入到向量索引中,它应该具有嵌入。
from llama_index.core.schema import TextNode
node1 = TextNode(text="<text_chunk>", id_="<node_id>")
node2 = TextNode(text="<text_chunk>", id_="<node_id>")
index = VectorStoreIndex([node1, node2])
可能遇到的错误
- 文件格式不支持:某些文件格式可能不被SimpleDirectoryReader支持。在这种情况下,可以使用LlamaHub中的其他Reader或自行编写数据加载器。
- SQL查询错误:在使用DatabaseReader时,如果SQL查询语法错误或连接参数配置不正确,会导致加载数据失败。
- 内存不足:当处理非常大的数据集时,可能会遇到内存不足的问题。可以通过优化数据加载和变换步骤,或使用分布式处理技术来解决。
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!
参考资料:
- LlamaIndex官方文档
- Python官方文档