索引 Indexes
Index 把 Node 组织成查询时能快速取回的结构。LlamaIndex 里最常用的是 VectorStoreIndex:每个 Node 有一条 embedding,查询时做相似度检索。其他索引(摘要、关键词、树、属性图)解决不同取回模式;入门先把向量索引吃透,再按官方模块指南扩展。
本站 RAG 课讲「为什么要索引」;本章讲 LlamaIndex 里 怎么建、怎么存、怎么增量插入。
VectorStoreIndex.from_documents
幕后步骤(可被 Settings / transformations / storage_context 改写):
- 按 splitter 把 Document 切成 Node
- 用
Settings.embed_model(未设置时走捆绑的 OpenAI embedding,历史默认text-embedding-ada-002)计算向量 - 写入
StorageContext里的 vector store(默认内存SimpleVectorStore)
指定切分与 LLM(示例用 gpt-4o-mini,以当前文档为准):
从已有 Node 构建:VectorStoreIndex(nodes)。已经把向量放进外部库时:VectorStoreIndex.from_vector_store(vector_store)(见 向量库)。
磁盘持久化(默认存储)
内存索引进程一结束就没了,embedding 既贵又慢,所以要 persist:
StorageContext 同时管 docstore / index store / vector store。自定义过 embed 或 transformations 的,加载时必须恢复同样的 Settings。
增量插入:
其他索引类型(知道即可)
不必一上来组合多种索引。先向量检索稳定,再按评测加关键词或图。组合查询可在 查询引擎 / 检索 用 Router 或融合 Retriever,而不是把所有数据复制进五套结构。
索引不是数据库全文
Index 为 给 LLM 用的上下文选择 优化,不是替代 Postgres 里的业务表。结构化过滤、权限、事务仍应放在原系统;LlamaIndex 负责「这段自然语言该带上哪些块」。权限模型简单做法:按租户分 collection / persist 目录,或在 metadata 里打 tenant_id 并在检索时过滤。
常见问题
重复 from_documents 导致账单翻倍?
启动时先看 storage/ 是否存在,存在就 load_index_from_storage,不要每次重建。
换了 embedding 模型答案变差?
新旧向量不在同一空间。必须清空存储后全量重建。
from_documents 卡在 embedding?
检查网络与 Key;可 show_progress=True。大批量用 ingestion pipeline + 外部向量库批写。