Posted on

在LlamaIndex中的查詢流程

查詢流程解析

檢索器(Retrievers)

檢索器就像是一個數據查找工具,它會根據用戶的查詢從索引中高效地獲取相關的上下文信息。選擇合適的檢索策略至關重要,它會影響檢索到的數據的相關性和效率。

路由器(Routers)

路由器決定了應該使用哪個檢索器從知識庫中獲取相關的上下文信息。更確切地說,RouterRetriever 類負責基於查詢選擇一個或多個候選檢索器來執行查詢。它們會使用選擇器基於每個候選檢索器的元數據和查詢來選擇最佳選項。

節點後處理器(Node Postprocessors)

節點後處理器接收一組檢索到的節點,然後可以對它們進行轉換、過濾或重新排序等操作。

響應合成器(Response Synthesizers)

響應合成器使用大型語言模型 (LLM)、用戶查詢和給定的一組檢索到的文本片段來生成響應。

甚麼是Retriever

檢索器(Retriever)是用來根據給定的查詢從數據源中提取相關的資訊(節點)。這是檢索增強生成(Retrieval-Augmented Generation,RAG)流程中的關鍵步驟,其中檢索器有助於識別可用於生成回應的最相關數據。

以下是檢索器在LlamaIndex中的工作方式概述:

  1. 數據攝取:從各種來源(例如PDF、SQL數據庫)中攝取數據並建立索引。
  2. 檢索:當提出查詢時,檢索器會從已索引的數據中提取相關的節點(數據片段)。
  3. 回應合成:然後使用檢索到的節點來生成回應,通常是將它們與查詢一起輸入語言模型。

檢索器建立在索引之上,指定了如何從索引中檢索節點。

不同的Retriever介紹

https://docs.llamaindex.ai/en/stable/module_guides/querying/retriever/retrievers/

有許多不同種的檢索器,較基本的有下面這些

  • 向量存儲檢索器(Vector index retriever)
    向量存儲檢索器從向量存儲索引中檢索出前 k 個最相似的節點。在這裡,模式不具有顯著意義。
  • 列表檢索器
    您可以使用列表檢索器從列表索引中檢索出所有節點。這個檢索器支持兩種模式:default embeddings。默認模式檢索所有節點,而嵌入模式使用嵌入檢索出使用嵌入檢索出前 k 個節點。
  • 樹形檢索器 (GPT all leaf retriever)
    正如其名,樹形檢索器從節點的分層樹中提取節點。這個檢索器支持許多不同的模式,默認是選擇select_leaf
  • 關鍵字表檢索器 (Base Keyword Table Retriever)
    關鍵字表檢索器從查詢中提取關鍵字,並使用它們來查找具有匹配關鍵字的節點。這個檢索器支持三種不同的模式: defaultsimple、和rake模式。
  • 知識圖檢索器 (KG Table Retriever)
    知識圖檢索器從節點的分層樹中檢索節點。支持 keywordsembeddings、和hybrid模式。
    1. 關鍵字模式(keywords): 使用查詢中提取的關鍵字來尋找相關的節點。
    2. 嵌入模式(embeddings): 使用嵌入向量來尋找相關的節點。
    3. 混合模式(hybrid): 同時使用關鍵字和嵌入向量來尋找相關的三元組。混合模式的思想是將關鍵字和嵌入向量結合起來,以更全面地找到與查詢相關的信息。這樣可以充分利用關鍵字的文本特徵和嵌入向量的語義信息。

簡單的使用範例

以下是使用ListIndex且模式為embedding的使用範例

from llama_index import ListIndex
from llama_index import download_loader

YoutubeTranscriptReader = download_loader("YoutubeTranscriptReader")

loader = YoutubeTranscriptReader()
docs = loader.load_data(ytlinks=['https://www.youtube.com/watch?v=nHcbHdgVUJg&ab_channel=WintWealth'])
list_index = ListIndex(docs)
retriever = list_index.as_retriever(
    retriever_mode='embedding',
)

使用範例

retriever.retrieve('What is the difference between a stock and a bond?')

檢索出的資訊

[NodeWithScore(node=Document(id_='nHcbHdgVUJg', embedding=[0.006401017773896456, -0.02431839518249035, -0.005019601434469223, -0.03640920668840408, -0.021309370175004005, 0.02166498266160488, ......, -0.011140232905745506], metadata={'video_id': 'nHcbHdgVUJg'}, excluded_embed_metadata_keys=[], excluded_llm_metadata_keys=[], relationships={}, text="I'm a Commerce graduate I went to Vijay\nCollege which is like a Government\nCollege type so I'm also not from IIT\nI graduated from MIT Pune Pu......t for it or not and like\nnobody tell you that you're cut out to\nbe a founder or not one thing which\nwhich is common in all the founders who\nsucceed is they don't give up so that's\nwhat that's probably yeah so\nhello", start_char_idx=None, end_char_idx=None, text_template='{metadata_str}\n\n{content}', metadata_template='{key}: {value}', metadata_seperator='\n'), score=0.7269996487772504)]