主题
数据加载完成后,你就有了一组 Document 对象(或一组 Node)。接下来该在这些对象之上构建一个 Index,好让它可被查询。
什么是索引?
用 LlamaIndex 的说法,Index 是由 Document 对象组成、专为让 LLM 查询而设计的数据结构。你的索引应当与你的查询策略相互配合、彼此成就。
LlamaIndex 提供若干种不同的索引类型,这里讲最常见的两种。
向量库索引(Vector Store Index)
VectorStoreIndex 是你最常碰到的索引类型,远远多于其他。向量库索引拿到你的 Documents 后先把它们切分成 Nodes,随后为每个节点的文本生成 vector embeddings,随时可供 LLM 查询。
什么是嵌入?
Vector embeddings 是 LLM 应用能够运转的核心机制。
vector embedding(通常直接称作嵌入)是你的文本在语义上的数值表示。两段含义相近的文本,即便字面差别很大,它们的嵌入在数学上也会是相近的。
正是这种数学关系带来了语义检索:用户给出查询词,LlamaIndex 能找到与查询词含义相关的文本,而不是简单的关键词匹配。这是检索增强生成的核心所在,也是 LLM 运作方式的重要一环。
嵌入的种类很多,在效率、效果和计算成本上各不相同。如果你不做任何配置,OpenAIEmbedding 会退回使用 text-embedding-ada-002。新项目建议显式传入 OpenAIEmbedding(model="text-embedding-3-small"),或使用 HuggingFaceEmbedding("BAAI/bge-small-en-v1.5") 这样的本地模型(见嵌入指南)。如果你换了 LLM,通常也应相应更换嵌入模型。
向量库索引为你的文档生成嵌入
向量库索引借助 LLM 提供的 API 把你全部文本转换成嵌入,这就是我们说它“为你的文本生成嵌入”的含义。如果文本很多,生成嵌入会花上不少时间,因为这涉及大量来回往返的 API 调用。
当你想检索这些嵌入时,查询本身也会被转换成一个向量嵌入,然后 VectorStoreIndex 执行一次数学运算,把所有嵌入按与你在语义上的相近程度排序。
Top K 检索
排序完成后,VectorStoreIndex 返回最相近的那些嵌入所对应的文本块。返回多少个嵌入由参数 k 决定,所以这个「返回几个」的开关就叫 top_k。也因此,这类搜索通常被称为“top-k 语义检索”。
Top-k 检索是查询向量索引最简单的形式;更复杂、更精细的策略请阅读查询一节。
使用 Vector Store Index
使用向量库索引时,把你在加载阶段创建的那组 Documents 交给它即可:
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 还会花钱。为了省时省钱,建议先把嵌入存储下来。
摘要索引(Summary Index)
摘要索引是一种更简单的索引,正如其名,最适合用于生成文档内容摘要的查询。它把所有 Documents 原样存下,查询时把它们全部交给你的查询引擎。
延伸阅读
如果你的数据是一组彼此关联的概念(用计算机科学的说法,是一张“图”),可以关注我们的知识图谱索引。