微信扫码
添加专属顾问
我要投稿
数据是关键,在使用 LLM 操作我们的数据之前,我们首先需要处理并加载数据。这类似于机器学习工程中的 ETL(Extract,Transform,Load)
在 LlamaIndex 中,数据摄取管道通常由三个主要阶段组成:
加载数据
转换数据
索引并存储数据
我们将在以后的文章中介绍索引/存储。在本文中,我们将主要讨论加载数据和转换数据。
加载数据
LlamaIndex 使用称为 Reader 的数据链接器加载数据。Reader 从不同的 数据源中加载数据,并将数据格式化成 Document 对象。Document 是一组数据(文本、图像、音频、视频)及其元数据的集合。
最容易使用的 Reader 就是 SimpleDirectoryReader,它可以根据给定目录中的每个文件创建 Document。它内置于 LlamaIndex 中,可以读取包括 Markdown、PDF、Word 文档、PowerPoint 幻灯片、图像、音频和视频在内的多种格式的数据。
使用方法也很简单:
from llama_index.core import SimpleDirectoryReaderdocuments = SimpleDirectoryReader("./data").load_data()
由于现实世界中的数据源不仅仅在磁盘上,所以 LlamaIndex 在 LlamaHub 上提供很多种可以读取其他数据源的 Reader。我们可以自行前往下面的地址去下载所需的 Reader:
https://llamahub.ai/
比如现在要读取数据库中的数据,那么首先安装 DatabaseReader:
pip install llama-index-readers-database
然后初始化:
from llama_index.core import download_loaderfrom llama_index.readers.database import DatabaseReaderreader = 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 Documentdoc = Document(text="your text")
处理和转换数据
加载数据后,我们需要处理和转换数据,然后再将其放入存储系统。这些转换包括分块、提取元数据和对生产每个块的嵌入向量。这是确保 LLM 能够检索和使用最佳的数据所必需的。
转换输入/输出是 Node 对象(Document 是 Node 的子类)。我们可以根据需要制定不同的转换步骤。
高级 API
索引有一个 .from_documents() 方法,它接受 Document 对象数组,然后执行一系列转换和分块操作:
from llama_index.core import VectorStoreIndexvector_index = VectorStoreIndex.from_documents(documents)vector_index.as_query_engine()
我们也可以更加精细化控制该方法使用的转换操作,比如控制文本切块方法,我们可以通过 Settings 设定:
from llama_index.core.node_parser import SentenceSplittertext_splitter = SentenceSplitter(chunk_size=512, chunk_overlap=10)# globalfrom llama_index.core import SettingsSettings.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 TokenTextSplitterdocuments = 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 TextNodenode1 = TextNode(text="<text_chunk>", id_="<node_id>")node2 = TextNode(text="<text_chunk>", id_="<node_id>")index = VectorStoreIndex([node1, node2])
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-10-25
LLM稳定JSON输出,终于摸清了
2025-10-25
涌现节点|AI安全的“皇帝新衣”:你的千亿级模型投资,正建立在一场集体幻觉之上
2025-10-25
当AI学会遗忘:浙大团队用"睡眠机制"破解大模型记忆难题
2025-10-25
CodeFlicker:快手推出的 AI 原生 IDE,让代码开发更高效!
2025-10-25
用Claude/Cursor写代码?小心这10个致命漏洞!
2025-10-25
如何理性认识AI能力边界?Jason Wei斯坦福的分享给出一个理解框架
2025-10-25
浅谈Agent、信息召回与语义索引
2025-10-25
Deepseek OCR vs. PaddleOCR-VL vs. MinerU 的简单应用测试
2025-08-21
2025-08-21
2025-08-19
2025-09-16
2025-07-29
2025-09-08
2025-10-02
2025-09-17
2025-08-19
2025-09-29
2025-10-25
2025-10-23
2025-10-23
2025-10-22
2025-10-22
2025-10-20
2025-10-20
2025-10-19