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 将索引存在内存中。如果你希望下次运行不重新计算:
python# 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)。
pythonimport 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 中注入元数据(如章节名)能显著提升检索准确率。
下一步:学习如何通过 查询引擎 提取这些索引中的价值。