Posted on

在LlamaIndex中使用索引(Index)

甚麼是索引(Index)

在 LlamaIndex 中,索引是一種資料結構,用於組織和存儲來自各種數據來源的信息,使搜索變得更加容易。索引是建立在一組節點(Node)之上的。節點(Node)是 LlamaIndex 的基本單位,一種包含一段文本的資料結構。每當提供一個文件時,可以將其分割成多個片段並存儲在節點中。

索引類型

LlamaIndex 提供不同類型的索引,以下是要學習的一些類型:

List Index

將節點存儲為像鏈表結構那樣的順序鏈。默認情況下,它會從所有節點中獲取數據並作為響應的一部分發送。

可以使用基於嵌入的查詢來獲取前 k 個節點,或者添加關鍵字過濾器進行查詢。

Vector Store Index

向量存儲索引將每個節點及其對應的嵌入存儲在一個向量存儲中。在查詢向量索引時,它總是提供與查詢最相關的前 k 個最相似的節點。

Tree Index

樹形索引從一組節點建立一個分層的樹狀結構。

在內部,樹是通過摘要提示形成的。它以一系列文本文件作為輸入,然後以自下而上的方式建立樹形索引,其中每個父節點是其下方節點的摘要。

查詢樹形索引涉及從根節點向下到葉節點的過程。默認情況下(child_branch_factor=1),查詢在給定父節點的情況下選擇一個子節點。如果 child_branch_factor=2,則查詢在每一層選擇兩個子節點。

Keyword Table Index

GPTKeywordTableIndex 實現從索引的節點中提取關鍵字,並使用這些關鍵字來查找相關的文檔。當我們提出問題時,這個實現首先會從問題中生成關鍵字。接著,索引會搜尋相關的文檔並將它們發送給大語言模型(LLM)。

Knowledge Graph Index

官方教學文件: https://docs.llamaindex.ai/en/stable/examples/index_structs/knowledge_graph/KnowledgeGraphDemo/

KnowledgeGraphIndex類別透過自動從文本中提取實體和關係識別來簡化 RAG 知識圖構建,消除複雜的手動解析。它還提供了客製化的靈活性,可讓您根據您的特定需求定製圖形結構和推理規則。知識圖捕捉了實體之間豐富的關係,使得 RAG 中的查詢和推理比向量資料庫更加精確、多樣化和複雜。

從技術上講,KG 提供比 Vector DB 更多的 precise 輸出,KG 還支援比 Vector DB 更多的 diverse 和complex 查詢。此外,KG 比 Vector DB 具有更好的 reasoning 和推理功能……但通常情況下,KGs 與 Vector DBs 的比較是蘋果與柳丁的遊戲。

知識圖譜最適合具有清晰 relationships 的文檔,而向量資料庫則與基於 similarity 的上下文更相關。因此,在 KG 和 Vector DB 之間進行選擇取決於 RAG 專案的具體要求和目標。

何時使用特定的索引

列表索引 當您的文檔數量不多時,ListIndex 是理想的選擇。與其嘗試找到相關數據,索引會將所有片段連接起來並全部發送給大語言模型(LLM)。如果結果文本太長,索引會分割文本並請 LLM 精煉答案。

當使用“embedding”參數時,它與 VectorStoreIndex 非常相似,區別在於列表索引會發送所有匹配的節點而無需任何門檻,而 VectorStoreIndex 只有在節點達到某個匹配分數門檻時才會發送。

向量索引 當我們希望獲取通過一定匹配分數門檻的前 K 個相關文檔時,可以使用 Vector Index。

樹形索引 當處理基於摘要的任務時,樹形索引(Tree Index)非常有用。

關鍵字表索引 在 Keyword Table Index 中,每個節點都會被發送到 LLM 以生成關鍵字。將每個文檔發送給 LLM 會大幅增加索引成本。這比其他索引更慢且更昂貴。因此,除非使用此索引所提供的結果遠好於其他索引,否則不建議使用。