J'Blog

9 课 · LlamaIndex

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

索引与向量存储

原文:Indexing 与 VectorStore

一句话

索引是构建在文档对象上的数据结构,其中向量存储索引(VectorStoreIndex)通过将文档分割为节点并生成向量嵌入,实现基于语义的检索增强生成。

什么时候翻这页

当你需要了解 LlamaIndex 中如何构建文档索引,特别是实现语义搜索和检索增强生成时;当你想理解 embedding 在 RAG 系统中的作用;当你需要选择合适的索引类型来支持你的查询策略时。

核心概念

  • Index (索引): 由 Document 对象组成的数据结构,旨在支持 LLM 查询。索引类型应与查询策略互补。

  • VectorStoreIndex (向量存储索引): 最常见的索引类型,将文档分割为节点,并为每个节点的文本创建向量嵌入,供 LLM 查询。

  • Vector Embedding (向量嵌入): 文本语义的数值表示,含义相似的文本具有数学上相似的嵌入。这是实现语义搜索的基础,使系统能够根据查询词的意义而非简单关键词匹配来定位相关文本。

  • Top K Retrieval (Top K 检索): 返回与查询最相似的 k 个嵌入及其对应文本块的检索方式,也称为"top-k 语义检索"。

  • Summary Index (摘要索引): 适用于生成文档摘要的简单索引,直接存储所有文档并在查询时返回全部文档。

怎么做

  1. 使用 VectorStoreIndex.from_documents() 从文档列表创建向量索引:

    from llama_index.core import VectorStoreIndex
    
    index = VectorStoreIndex.from_documents(documents)
    
  2. 可选参数 show_progress=True 可在索引构建时显示进度条。

  3. 也可以直接从 Node 对象列表构建索引:

    index = VectorStoreIndex(nodes)
    
  4. 索引构建完成后,系统会将文本转换为向量嵌入,查询时也会将查询转换为向量嵌入,然后通过数学运算排序所有嵌入,返回语义最相似的结果。

命令 / 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 的流程相似,都是先加载文档,然后分割为块,再生成嵌入并存储,最后进行相似度检索。

初学者易错点

  1. 误以为索引是即时的:生成嵌入可能需要很长时间,特别是处理大量文本时,因为涉及多次往返 API 调用。

  2. 混淆 embedding 和 LLM:embedding 是文本的数值表示,而 LLM 是生成文本的模型,两者功能不同。

  3. 忽略嵌入模型的选择:默认使用 OpenAI 的 text-embedding-ada-002,但不同 LLM 可能需要不同的嵌入模型。

  4. 过度依赖 Top K 检索:虽然简单,但可能不是最优的检索策略,应根据具体场景考虑更复杂的检索方法。

  5. 忘记保存嵌入:嵌入生成后应存储起来,避免每次查询时重新生成,节省时间和成本。

相关词条

官方原文:https://developers.llamaindex.ai/python/framework/understanding/rag/indexing/index