AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


LlamaIndex中的数据加载和摄取
发布日期:2024-04-30 10:56:43 浏览次数: 2781 来源:PyTorch研习社


数据是关键,在使用 LLM 操作我们的数据之前,我们首先需要处理并加载数据。这类似于机器学习工程中的 ETL(Extract,Transform,Load)

在 LlamaIndex 中,数据摄取管道通常由三个主要阶段组成:

  • 加载数据

  • 换数据

  • 索引并存储数据


我们将在以后的文章中介绍索引/存储。在本文中,我们将主要讨论加载数据和转换数据。

加载数据

LlamaIndex 使用称为 Reader 的数据链接器加载数据。Reader 从不同的 数据源中加载数据,并将数据格式化成 Document 对象。Document 是一组数据(文本、图像、音频、视频)及其元数据的集合。

最容易使用的 Reader 就是 SimpleDirectoryReader,它可以根据给定目录中的每个文件创建 Document。它内置于 LlamaIndex 中,可以读取包括 Markdown、PDF、Word 文档、PowerPoint 幻灯片、图像、音频和视频在内的多种格式的数据

使用方法也很简单:

from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()

由于现实世界中的数据源不仅仅在磁盘上,所以 LlamaIndex 在 LlamaHub 上提供很多种可以读取其他数据源的 Reader。我们可以自行前往下面的地址去下载所需的 Reader:

https://llamahub.ai/

比如现在要读取数据库中的数据,那么首先安装  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)
# globalfrom llama_index.core import Settings
Settings.text_splitter = text_splitter
# per-indexindex = VectorStoreIndex.from_documents(documents, transformations=[text_splitter])

低级 API

我们可以通过使用 LlamaIndex 的转换模块(文本拆分器、元数据提取器等)作为独立组件,或在声明一个转换管道接口中组合它们来实现此目的。

处理 Document 的关键步骤就是将它们拆分成 LLM 可以直接使用的块(也就是 Node 对象)。

LlamaIndex 支持从基于段落/句子/ token 的拆分器到基于文件的拆分器(如 HTML、JSON)在内的多种文本拆分器

from llama_index.core import SimpleDirectoryReaderfrom llama_index.core.ingestion import IngestionPipelinefrom 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>"},)

我们可以直接将 Node 插入向量索引中:

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])


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询