索引#
加载数据后,您现在拥有一个 Document 对象列表(或 Node 对象列表)。现在是时候在这些对象之上构建一个 Index,以便您可以开始查询它们了。
什么是索引?#
在 LlamaIndex 中,Index 是一个由 Document 对象构成的数据结构,旨在支持 LLM 进行查询。您的索引设计用于补充您的查询策略。
LlamaIndex 提供了几种不同的索引类型。这里我们将介绍其中两种最常见的。
向量存储索引#
VectorStoreIndex 是您将遇到的最常见的索引类型。向量存储索引接收您的 Documents 并将其分割成 Nodes。然后,它为每个节点的文本创建向量嵌入,以便 LLM 进行查询。
什么是嵌入?#
向量嵌入是 LLM 应用程序运作的核心。
向量嵌入,通常简称嵌入,是文本语义或含义的数值表示。两段含义相似的文本会拥有数学上相似的嵌入,即使实际文本差异很大。
这种数学关系实现了语义搜索,用户提供查询词后,LlamaIndex 可以定位与查询词含义相关的文本,而不仅仅是简单的关键词匹配。这是检索增强生成(Retrieval-Augmented Generation)以及 LLM 整体运作方式的重要组成部分。
嵌入有多种类型,它们在效率、效果和计算成本上有所不同。默认情况下,LlamaIndex 使用 text-embedding-ada-002,这是 OpenAI 使用的默认嵌入。如果您使用不同的 LLM,通常会希望使用不同的嵌入。
向量存储索引嵌入您的文档#
向量存储索引使用 LLM 的 API 将您的所有文本转换为嵌入;这就是我们所说的“嵌入您的文本”的含义。如果文本量很大,生成嵌入可能需要很长时间,因为它涉及多次 API 往返调用。
当您想要搜索嵌入时,您的查询本身也会被转换为向量嵌入,然后 VectorStoreIndex 执行数学运算,根据所有嵌入与您的查询在语义上的相似程度进行排名。
Top K 检索#
排名完成后,VectorStoreIndex 返回最相似的嵌入及其对应的文本块。它返回的嵌入数量称为 k,因此控制返回多少嵌入的参数称为 top_k。出于这个原因,这种完整的搜索类型通常被称为“top-k 语义检索”。
Top-k 检索是查询向量索引最简单的形式;当您阅读查询部分时,您将了解更复杂和微妙的策略。
使用向量存储索引#
要使用向量存储索引,请将加载阶段创建的 Document 列表传递给它
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(documents)
提示
from_documents 还接受一个可选参数 show_progress。将其设置为 True 以在构建索引时显示进度条。
您也可以选择直接在 Node 对象列表之上构建索引
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex(nodes)
现在您的文本已经索引完成,从技术上讲,可以进行查询了!然而,嵌入所有文本可能非常耗时,如果您使用的是托管 LLM,也可能成本很高。为了节省时间和金钱,您会希望先存储您的嵌入。
摘要索引#
摘要索引是一种更简单的索引形式,最适合于正如其名称所示,您正在尝试生成文档中文本摘要的查询。它只是简单地存储所有 Documents 并将它们全部返回给您的查询引擎。
进一步阅读#
如果您的数据是一组相互关联的概念(用计算机科学术语来说,一个“图”),那么您可能会对我们的知识图谱索引感兴趣。