索引与向量存储
一句话
索引是构建在文档对象上的数据结构,其中向量存储索引(VectorStoreIndex)通过将文档分割为节点并生成向量嵌入,实现基于语义的检索增强生成。
什么时候翻这页
当你需要了解 LlamaIndex 中如何构建文档索引,特别是实现语义搜索和检索增强生成时;当你想理解 embedding 在 RAG 系统中的作用;当你需要选择合适的索引类型来支持你的查询策略时。
核心概念
-
Index (索引): 由 Document 对象组成的数据结构,旨在支持 LLM 查询。索引类型应与查询策略互补。
-
VectorStoreIndex (向量存储索引): 最常见的索引类型,将文档分割为节点,并为每个节点的文本创建向量嵌入,供 LLM 查询。
-
Vector Embedding (向量嵌入): 文本语义的数值表示,含义相似的文本具有数学上相似的嵌入。这是实现语义搜索的基础,使系统能够根据查询词的意义而非简单关键词匹配来定位相关文本。
-
Top K Retrieval (Top K 检索): 返回与查询最相似的 k 个嵌入及其对应文本块的检索方式,也称为"top-k 语义检索"。
-
Summary Index (摘要索引): 适用于生成文档摘要的简单索引,直接存储所有文档并在查询时返回全部文档。
怎么做
-
使用
VectorStoreIndex.from_documents()从文档列表创建向量索引:from llama_index.core import VectorStoreIndex index = VectorStoreIndex.from_documents(documents) -
可选参数
show_progress=True可在索引构建时显示进度条。 -
也可以直接从 Node 对象列表构建索引:
index = VectorStoreIndex(nodes) -
索引构建完成后,系统会将文本转换为向量嵌入,查询时也会将查询转换为向量嵌入,然后通过数学运算排序所有嵌入,返回语义最相似的结果。
命令 / API 速查
VectorStoreIndex.from_documents(documents): 从文档列表创建向量索引VectorStoreIndex(nodes): 从节点列表创建向量索引show_progress: 索引构建时的可选参数,设置为True可显示进度条
与 Hello-Agents / LangGraph / 本博客 handbook 索引的联系
本页介绍的 VectorStoreIndex 与之前学习的 Chroma 向量库在概念上高度一致。在 Hello-Agents 记忆与检索章节中,我们学习了如何使用 Chroma 作为 vector store 来存储和检索嵌入向量。LlamaIndex 的 VectorStoreIndex 提供了类似的功能,但作为更完整的框架集成。在 LangGraph 中构建智能体时,可以将 LlamaIndex 的索引系统作为检索工具,类似于我们在 Chroma 中实现的检索功能。本博客 handbook 中使用 Chroma 索引文档的方法与 LlamaIndex 的流程相似,都是先加载文档,然后分割为块,再生成嵌入并存储,最后进行相似度检索。
初学者易错点
-
误以为索引是即时的:生成嵌入可能需要很长时间,特别是处理大量文本时,因为涉及多次往返 API 调用。
-
混淆 embedding 和 LLM:embedding 是文本的数值表示,而 LLM 是生成文本的模型,两者功能不同。
-
忽略嵌入模型的选择:默认使用 OpenAI 的
text-embedding-ada-002,但不同 LLM 可能需要不同的嵌入模型。 -
过度依赖 Top K 检索:虽然简单,但可能不是最优的检索策略,应根据具体场景考虑更复杂的检索方法。
-
忘记保存嵌入:嵌入生成后应存储起来,避免每次查询时重新生成,节省时间和成本。
相关词条
- Embedding: 向量嵌入的类型和选择
- Querying: 查询索引的策略和方法
- Storing: 存储嵌入的方法
- Knowledge Graph Index: 适用于互联概念数据的索引类型