微信扫码
与创始人交个朋友
我要投稿
数据是关键,在使用 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)
# global
from llama_index.core import Settings
Settings.text_splitter = text_splitter
# per-index
index = VectorStoreIndex.from_documents(
documents, transformations=[text_splitter]
)
低级 API
我们可以通过使用 LlamaIndex 的转换模块(文本拆分器、元数据提取器等)作为独立组件,或在声明一个转换管道接口中组合它们来实现此目的。
处理 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": "<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+中大型企业
2024-05-28
2024-04-26
2024-08-21
2024-04-11
2024-07-09
2024-08-13
2024-07-18
2024-10-25
2024-07-01
2024-06-17