索引概述
數據加載完成后,您將獲得一個文檔對象(Document)列表(或節點(Node)列表)。接下來需要為這些對象構建索引(Index),以便開始執行查詢。
索引(Index) 是一種數據結構,能夠讓我們快速檢索與用戶查詢相關的上下文。在 LlamaIndex 中,它是實現檢索增強生成(RAG, Retrieval-Augmented Generation)應用的核心基礎。
從高層次來看,索引 由 文檔(Documents) 構建而成,并用于創建 查詢引擎(Query Engines) 和 聊天引擎(Chat Engines),從而支持基于數據的問答和對話功能。
在底層實現中,索引將數據存儲在 節點(Node) 對象中(每個節點代表原始文檔的一個片段),并通過 檢索器(Retriever) 接口提供額外的配置和自動化支持。
在LlamaIndex的術語中,Index(索引)是一種由Document(文檔)對象構成的數據結構,旨在讓大語言模型(LLM)能夠進行查詢。
什么是嵌入?
向量嵌入(vector embeddings) 是大語言模型(LLM)應用運行的核心機制。
向量嵌入(vector embedding,通常簡稱為embedding)是對文本語義或含義的數值化表征。即使實際文字差異很大,含義相似的兩段文本其向量嵌入在數學上也會高度相似。
這種數學關系實現了語義搜索——用戶只需提供查詢詞,LlamaIndex 就能找到與查詢詞含義相關的文本(而非簡單的關鍵詞匹配)。這正是檢索增強生成(Retrieval-Augmented Generation)技術的核心原理,也是大語言模型(LLMs)的基礎運作機制。
嵌入模型(embeddings)存在多種類型,它們在效率、效果和計算成本上各有差異。默認情況下,LlamaIndex 采用的是 OpenAI 的默認嵌入模型 text-embedding-ada-002。若您使用不同的大語言模型(LLM),通常也需要搭配不同的嵌入模型。
索引的分類
本指南通過圖示說明每種索引的工作原理。
術語解釋:
-
節點(Node):對應文檔中的一段文本塊。LlamaIndex 接收文檔對象(Document),并在內部將其解析/分塊為多個節點對象(Node)。
-
響應合成(Response Synthesis):我們的模塊,負責根據檢索到的節點合成響應。您可以了解如何指定不同的響應模式。
摘要索引
摘要索引 Summary Index (原列表索引)的核心機制是將所有節點(Node)按順序鏈式存儲,形成一個線性結構。
向量存儲索引
向量存儲索引(Vector Store Index)會將每個節點(Node)及其對應的嵌入向量(embedding)存儲到向量數據庫(Vector Store)中。
樹狀索引
樹狀索引(Tree Index)會從一組節點(這些節點在樹中成為葉節點)構建出層次化樹形結構。
關鍵字表索引
關鍵字表索引(Keyword Table Index)通過建立關鍵詞到節點的映射關系實現高效檢索。該索引會提取每個節點的文本內容生成關鍵詞列表,并在查詢時通過關鍵詞匹配快速定位相關節點。
屬性圖索引
屬性圖索引(Property Graph Index)的工作原理是首先構建包含標記節點和關系的知識圖譜。該圖譜的構建過程具有高度可定制性:既可以讓大語言模型(LLM)自由提取內容,也可以按照嚴格模式進行提取,甚至支持用戶自定義提取模塊的實現。
VectorStoreIndex
向量存儲索引(VectorStoreIndex)是目前最常用的索引類型。該索引會先將您的文檔(Documents)分割成多個節點(Nodes),然后為每個節點的文本內容生成向量嵌入(vector embeddings),最終使大語言模型(LLM)能夠對這些數據進行查詢。
向量存儲(Vector Stores) 是檢索增強生成(RAG)的核心組件,因此幾乎在所有基于 LlamaIndex 開發的應用中——無論是直接還是間接使用——都會涉及它。
向量存儲(Vector Stores)接收一組節點(Node)對象,并基于這些節點構建索引。
工作原理
向量存儲索引(Vector Store Index)通過調用大語言模型(LLM)的API接口,將您的所有文本轉化為向量嵌入(embeddings)——這就是所謂"文本向量化"(embeds your text)的實質過程。
當執行向量搜索時,您的查詢語句會首先被轉化為向量嵌入,隨后向量存儲索引(VectorStoreIndex)會通過數學運算,根據所有嵌入向量與查詢語句的語義相似度進行排序檢索。
當排序完成后,向量存儲索引(VectorStoreIndex)會返回相似度最高的向量嵌入及其對應的原始文本片段。系統返回的嵌入數量由參數 k 決定,因此該控制參數被命名為 top_k。這種檢索方式由此得名 "top-k 語義檢索"。
Top-K 檢索是向量索引查詢中最基礎的形式。當您閱讀后續的[查詢]章節時,將會接觸到更復雜、更精細的檢索策略。
創建索引
使用 from_documents 方法創建索引
使用向量存儲(Vector Store)最簡單的方式就是加載一組文檔,并通過 from_documents 方法直接構建索引:
from llama_index import VectorStoreIndex, SimpleDirectoryReader# 1. 加載文檔(例如讀取本地"data/"目錄下的所有文件)
documents = SimpleDirectoryReader("data/").load_data()# 2. 一鍵構建向量索引(自動完成文本分塊、向量化和存儲)
index = VectorStoreIndex.from_documents(documents)
from_documents 方法還支持一個可選參數 show_progress。將其設為 True,即可在索引構建過程中顯示進度條。
# 示例:啟用構建進度條
index = VectorStoreIndex.from_documents(documents=documents, show_progress=True # ← 顯示實時進度
)
當您使用 from_documents方法時,您的文檔會被分割成多個文本塊,并解析為Node對象——這是一種對文本字符串的輕量級抽象結構,能夠持續追蹤元數據和關聯關系。
默認情況下,VectorStoreIndex會將所有數據存儲在內存中,VectorStoreIndex 會以每批 2048 個節點的規模生成并插入向量。如果您的內存資源有限(或內存充裕),可以通過傳入 insert_batch_size=2048 參數并指定您期望的批次大小來調整這一設置。
通過Nodes節點創建索引
如需完全掌控索引構建過程,您可以直接手動創建并配置節點Nodes,然后將其傳入索引構造函數:
from llama_index.core.schema import TextNodenode1 = TextNode(text="<text_chunk>", id_="<node_id>")
node2 = TextNode(text="<text_chunk>", id_="<node_id>")
nodes = [node1, node2]
index = VectorStoreIndex(nodes)