LlamaIndex 数据索引 (Indexing)
索引是 LlamaIndex 的核心。它将离散的文档转化为一种特殊的结构,使得 LLM 可以快速、精准地从中寻找答案。
1. 索引的本质:Node (节点)
在 LlamaIndex 中,Document(原始文件)会被切分为更小的 Node(节点)。
- 每个 Node 包含一段文本和相关的元数据(文件名、页码、相邻节点 ID)。
- 索引实际上是这些 Node 之间的关系网。
2. 常见的索引类型
A. VectorStoreIndex (最常用)
将每个 Node 通过 Embedding 模型转化为向量,并存入向量数据库。
- 优点:支持语义搜索。即使问题和原文用词不同,只要意思相近就能搜到。
- 场景:大多数 RAG 应用。
B. SummaryIndex (原 List Index)
简单地将 Node 存储为序列。
- 场景:当你需要模型“总结整篇文档”时非常有用。
C. TreeIndex
将数据组织成树状结构。
- 场景:适合处理具有层级关系的超大规模文档。
D. KeywordTableIndex
基于关键词建立哈希表。
- 场景:精准匹配特定术语。
3. 持久化存储 (Storage)
默认情况下,LlamaIndex 将索引存在内存中。如果你希望下次运行不重新计算:
# 1. 保存到本地磁盘
index.storage_context.persist(persist_dir="./storage")
# 2. 从磁盘加载
from llama_index.core import StorageContext, load_index_from_storage
storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)
4. 对接专业的向量数据库
LlamaIndex 支持 20 多种向量数据库(如 Pinecone, Chroma, Milvus)。
import chromadb
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
# 创建 Chroma 客户端
db = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = db.get_or_create_collection("my_data")
# 关联到 LlamaIndex
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex.from_documents(documents, storage_context=storage_context)
5. 索引优化建议
- Chunk Size (分片大小):太小会导致语义破碎,太大则 Token 消耗高。默认 1024 通常是一个平衡点。
- Metadata (元数据):在 Node 中注入元数据(如章节名)能显著提升检索准确率。
下一步:学习如何通过 查询引擎 提取这些索引中的价值。