索引类型 #
概述 #
索引是 LlamaIndex 中组织和检索数据的核心结构。不同的索引类型适用于不同的场景,选择合适的索引对应用性能至关重要。
text
┌─────────────────────────────────────────────────────────────┐
│ 索引类型总览 │
├─────────────────────────────────────────────────────────────┤
│ │
│ VectorStoreIndex 语义搜索、问答 │
│ ├── 最常用 │
│ ├── 基于 Embedding 相似度 │
│ └── 需要 Embedding 模型 │
│ │
│ SummaryIndex 文档总结 │
│ ├── 遍历所有节点 │
│ ├── 生成综合摘要 │
│ └── 不需要 Embedding │
│ │
│ TreeIndex 大型文档集 │
│ ├── 层级结构 │
│ ├── 从根到叶查询 │
│ └── 适合层次化内容 │
│ │
│ KeywordTableIndex 关键词搜索 │
│ ├── 提取关键词 │
│ ├── 精确匹配 │
│ └── 不需要 Embedding │
│ │
└─────────────────────────────────────────────────────────────┘
VectorStoreIndex #
概述 #
VectorStoreIndex 是最常用的索引类型,它将文本转换为向量,支持语义相似度搜索。
text
┌─────────────────────────────────────────────────────────────┐
│ VectorStoreIndex 工作原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 索引构建: │
│ Node ──→ Embedding Model ──→ Vector ──→ Vector Store │
│ │
│ 查询过程: │
│ Query ──→ Embedding Model ──→ Query Vector │
│ ──→ Similarity Search ──→ Top-K Nodes │
│ ──→ LLM ──→ Response │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("你的问题")
print(response)
从节点创建 #
python
from llama_index.core import VectorStoreIndex, Document
from llama_index.core.node_parser import SentenceSplitter
doc = Document(text="很长的文档内容...")
splitter = SentenceSplitter(chunk_size=512)
nodes = splitter.get_nodes_from_documents([doc])
index = VectorStoreIndex(nodes)
配置选项 #
python
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(
documents,
show_progress=True,
storage_context=storage_context,
)
query_engine = index.as_query_engine(
similarity_top_k=5,
response_mode="compact",
streaming=True,
)
使用向量存储 #
python
import chromadb
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
db = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = db.get_or_create_collection("my_collection")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
)
index.storage_context.persist()
增量添加文档 #
python
from llama_index.core import VectorStoreIndex, Document
index = VectorStoreIndex.from_documents([
Document(text="初始文档")
])
index.insert(Document(text="新文档 1"))
index.insert(Document(text="新文档 2"))
for doc in new_documents:
index.insert(doc)
SummaryIndex #
概述 #
SummaryIndex(原名 ListIndex)会遍历所有节点,适合需要综合所有内容的场景。
text
┌─────────────────────────────────────────────────────────────┐
│ SummaryIndex 工作原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 索引结构: │
│ Node1 ←→ Node2 ←→ Node3 ←→ Node4 ←→ Node5 │
│ │
│ 查询过程: │
│ Query ──→ 遍历所有节点 ──→ 合成响应 │
│ │
│ 适合: │
│ - 文档总结 │
│ - 需要全面信息的查询 │
│ - 不需要 Embedding 的场景 │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
from llama_index.core import SummaryIndex, Document
documents = [
Document(text="文档1内容..."),
Document(text="文档2内容..."),
Document(text="文档3内容..."),
]
index = SummaryIndex.from_documents(documents)
query_engine = index.as_query_engine(
response_mode="tree_summarize"
)
response = query_engine.query("总结所有文档的主要内容")
print(response)
响应模式 #
python
from llama_index.core import SummaryIndex, get_response_synthesizer
index = SummaryIndex.from_documents(documents)
compact_engine = index.as_query_engine(
response_mode="compact"
)
tree_summarize_engine = index.as_query_engine(
response_mode="tree_summarize"
)
refine_engine = index.as_query_engine(
response_mode="refine"
)
不使用 Embedding #
python
from llama_index.core import SummaryIndex, Document, Settings
from llama_index.llms.openai import OpenAI
Settings.llm = OpenAI(model="gpt-4o-mini")
documents = [Document(text="文档内容...")]
index = SummaryIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("总结文档")
TreeIndex #
概述 #
TreeIndex 将节点组织成树形结构,从根节点到叶节点进行查询,适合大型文档集。
text
┌─────────────────────────────────────────────────────────────┐
│ TreeIndex 结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 根节点 │
│ │ │
│ ┌──────────┼──────────┐ │
│ │ │ │ │
│ 子节点1 子节点2 子节点3 │
│ │ │ │ │
│ ┌──┴──┐ ┌──┴──┐ ┌──┴──┐ │
│ │ │ │ │ │ │ │
│ 叶1 叶2 叶3 叶4 叶5 叶6 │
│ │
│ 查询从根开始,逐层向下选择最相关的分支 │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
from llama_index.core import TreeIndex, Document
documents = [
Document(text="文档1内容..."),
Document(text="文档2内容..."),
Document(text="文档3内容..."),
]
index = TreeIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("你的问题")
print(response)
配置选项 #
python
from llama_index.core import TreeIndex
index = TreeIndex.from_documents(
documents,
summary_template=summary_template,
num_children=10,
)
query_engine = index.as_query_engine(
child_branch_factor=2,
)
检索器 #
python
from llama_index.core import TreeIndex
from llama_index.core.retrievers import TreeRetriever
index = TreeIndex.from_documents(documents)
retriever = TreeRetriever(
index=index,
child_branch_factor=2,
)
nodes = retriever.retrieve("查询内容")
KeywordTableIndex #
概述 #
KeywordTableIndex 提取节点中的关键词,通过关键词匹配进行检索。
text
┌─────────────────────────────────────────────────────────────┐
│ KeywordTableIndex 结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 关键词表: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ "Python" → [Node1, Node3, Node5] │ │
│ │ "机器学习" → [Node2, Node4] │ │
│ │ "数据分析" → [Node1, Node4, Node6] │ │
│ │ "深度学习" → [Node2, Node5] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 查询过程: │
│ Query ──→ 提取关键词 ──→ 匹配节点 ──→ 返回结果 │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
from llama_index.core import KeywordTableIndex, Document
documents = [
Document(text="Python 是一种编程语言,广泛用于数据分析和机器学习。"),
Document(text="机器学习是人工智能的一个分支,包括深度学习等技术。"),
Document(text="数据分析使用 Python 进行数据处理和可视化。"),
]
index = KeywordTableIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("Python 有什么用途?")
print(response)
自定义关键词提取 #
python
from llama_index.core import KeywordTableIndex, Document
from llama_index.core.keyword_extractors import SimpleKeywordExtractor
index = KeywordTableIndex.from_documents(
documents,
keyword_extractor=SimpleKeywordExtractor(),
)
多文档索引 #
多文档向量索引 #
python
from llama_index.core import VectorStoreIndex, Document
documents = [
Document(text="文档1", metadata={"source": "file1.txt"}),
Document(text="文档2", metadata={"source": "file2.txt"}),
Document(text="文档3", metadata={"source": "file3.txt"}),
]
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(
similarity_top_k=3,
)
response = query_engine.query("查询内容")
for node in response.source_nodes:
print(f"来源: {node.node.metadata.get('source')}")
print(f"相似度: {node.score:.4f}")
多索引组合 #
python
from llama_index.core import VectorStoreIndex, SummaryIndex, Document
from llama_index.core.tools import QueryEngineTool
from llama_index.core.query_engine import RouterQueryEngine
documents = [Document(text="文档内容...")]
vector_index = VectorStoreIndex.from_documents(documents)
summary_index = SummaryIndex.from_documents(documents)
vector_tool = QueryEngineTool.from_defaults(
query_engine=vector_index.as_query_engine(),
name="vector_search",
description="适合语义搜索和问答",
)
summary_tool = QueryEngineTool.from_defaults(
query_engine=summary_index.as_query_engine(response_mode="tree_summarize"),
name="summary",
description="适合文档总结",
)
query_engine = RouterQueryEngine.from_defaults(
query_engine_tools=[vector_tool, summary_tool],
)
response = query_engine.query("总结文档的主要内容")
索引持久化 #
本地存储 #
python
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist(persist_dir="./storage")
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)
向量存储持久化 #
python
import chromadb
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import StorageContext
db = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = db.get_or_create_collection("knowledge_base")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context,
)
db = chromadb.PersistentClient(path="./chroma_db")
chroma_collection = db.get_collection("knowledge_base")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
index = VectorStoreIndex.from_vector_store(vector_store)
索引选择指南 #
text
┌─────────────────────────────────────────────────────────────┐
│ 索引选择指南 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 需求 推荐索引 │
│ ───────────────────────────────────────────────────────── │
│ 语义搜索/问答 VectorStoreIndex │
│ 文档总结 SummaryIndex │
│ 大型文档集 TreeIndex │
│ 关键词搜索 KeywordTableIndex │
│ 不需要 Embedding SummaryIndex / KeywordTable │
│ 精确匹配 KeywordTableIndex │
│ 层级内容 TreeIndex │
│ │
└─────────────────────────────────────────────────────────────┘
完整示例 #
python
import os
from llama_index.core import (
VectorStoreIndex,
SummaryIndex,
SimpleDirectoryReader,
Settings,
)
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
os.environ["OPENAI_API_KEY"] = "sk-your-key"
Settings.llm = OpenAI(model="gpt-4o-mini")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")
documents = SimpleDirectoryReader("./data").load_data()
print(f"加载了 {len(documents)} 个文档")
vector_index = VectorStoreIndex.from_documents(documents)
vector_engine = vector_index.as_query_engine(similarity_top_k=3)
response = vector_engine.query("文档的主要内容是什么?")
print(f"\n向量搜索回答: {response}")
summary_index = SummaryIndex.from_documents(documents)
summary_engine = summary_index.as_query_engine(response_mode="tree_summarize")
response = summary_engine.query("总结所有文档的主要内容")
print(f"\n总结回答: {response}")
vector_index.storage_context.persist(persist_dir="./vector_storage")
summary_index.storage_context.persist(persist_dir="./summary_storage")
下一步 #
了解索引类型后,接下来学习 查询引擎 掌握如何执行查询和生成回答!
最后更新:2026-03-30