logo

LlamaIndex 数据索引 (Indexing)

索引这件事,决定了你后面检索到底是在“找资料”,还是在“碰运气”。很多 RAG 项目看起来是回答质量问题,往前追一层,往往都是索引阶段没打好基础。

1. 索引的本质:Node (节点)

在 LlamaIndex 中,Document(原始文件)会被切分为更小的 Node(节点)。

  • 每个 Node 包含一段文本和相关的元数据(文件名、页码、相邻节点 ID)。
  • 索引实际上是这些 Node 之间的关系网。

所以 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. 索引优化建议

  1. Chunk Size (分片大小):太小会导致语义破碎,太大则 Token 消耗高。默认值可以作为起点,但别把默认值当真理。
  2. Metadata (元数据):在 Node 中注入元数据(如章节名)能显著提升检索准确率。

再补一个更现实的建议:如果你还没做任何评估,先别在索引类型上来回横跳。多数团队第一阶段真正有用的,还是把 VectorStoreIndex + 合理 chunk + 基础 metadata 做稳。


下一步:学习如何通过 查询引擎 提取这些索引中的价值。

LlamaIndex Guide
AI Engineer

LlamaIndex Guide

Use LlamaIndex to connect data sources, indexing pipelines, and retrieval workflows for RAG apps.

LlamaIndex Guide数据索引

LlamaIndex 数据索引 (Indexing)

索引这件事,决定了你后面检索到底是在“找资料”,还是在“碰运气”。很多 RAG 项目看起来是回答质量问题,往前追一层,往往都是索引阶段没打好基础。

#1. 索引的本质:Node (节点)

在 LlamaIndex 中,Document(原始文件)会被切分为更小的 Node(节点)。

  • 每个 Node 包含一段文本和相关的元数据(文件名、页码、相邻节点 ID)。
  • 索引实际上是这些 Node 之间的关系网。

所以 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)。

python
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. 索引优化建议

  1. Chunk Size (分片大小):太小会导致语义破碎,太大则 Token 消耗高。默认值可以作为起点,但别把默认值当真理。
  2. Metadata (元数据):在 Node 中注入元数据(如章节名)能显著提升检索准确率。

再补一个更现实的建议:如果你还没做任何评估,先别在索引类型上来回横跳。多数团队第一阶段真正有用的,还是把 VectorStoreIndex + 合理 chunk + 基础 metadata 做稳。


下一步:学习如何通过 查询引擎 提取这些索引中的价值。

System Design

Core system design concepts and practical case studies

Learn the trade-offs and patterns that matter in technical interviews.

Open System Design →

Related Roadmaps