iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
生成式 AI

2024 年用 LangGraph 從零開始實現 Agentic AI System系列 第 23

【Day 23】- Adaptive-RAG:動態檢索策略提高系統問答精準度

  • 分享至 

  • xImage
  •  

摘要
這篇文件介紹了一種名為「Adaptive-RAG」的技術,它旨在提升問答系統的準確性和效率。Adaptive-RAG 的核心概念是根據使用者查詢的複雜度動態調整檢索方法。它使用一個輕量級的分類器來評估查詢的複雜度,並根據這個評估結果選擇最適合的處理策略。例如,對於簡單的查詢,可能直接使用語言模型生成答案,完全跳過檢索步驟;而對於複雜的查詢,則可能採用多步檢索和推理策略。Adaptive-RAG 的優點包括:提高效率: 針對不同複雜度的查詢,採用最合適的策略,避免不必要的計算資源浪費。提升準確性: 通過自適應的檢索方法,更有效地處理複雜查詢,提升問答系統的準確性。靈活性: 根據查詢的具體需求進行動態調整,而非採用固定的檢索策略。
文件還詳細描述了 Adaptive-RAG 的核心組件,包括查詢分類器、訓練方法、效能分析以及實作關鍵。最後,文件總結了 Adaptive-RAG 的革新意義,並展望了其未來應用潛力。

前言

在人工智慧和自然語言處理領域中,Adaptive-RAG(自適應檢索增強生成)技術正在引領一場革命。這種創新方法不僅提升了問答系統的效能,還為處理不同複雜度的查詢提供了靈活的解決方案。讓我們深入探討這項技術的核心概念、運作機制以及實際應用。

首圖

1. Adaptive-RAG 的定義與核心理念

Adaptive-RAG (自適應檢索增強生成) 是一種先進的檢索增強生成 (RAG) 策略,其核心在於能夠根據使用者查詢的複雜度動態調整檢索方法。相較於傳統的靜態 RAG 方法,Adaptive-RAG 運用分類器評估問題複雜度,並據此選擇最適合的檢索策略。這種自適應方法通過將問題導向不同的 RAG 方法,甚至在簡單情況下跳過檢索步驟,有效管理各種複雜度的查詢。Adaptive-RAG 的目標是透過為每個查詢客製化檢索流程,提升問答系統的效率和準確性

💡 核心理念: 為每個查詢客製化檢索流程,提升問答系統的效率和準確性。

1.1 Adaptive-RAG 與傳統 RAG 的比較

上論文圖 Figure 2

傳統的大型語言模型 (LLMs) 依賴固定的訓練知識庫,難以回應當前或特定資訊的查詢。雖然檢索增強生成 (RAG) 方法試圖通過結合外部資料檢索來解決這個問題,但在處理不同複雜度的查詢時仍面臨挑戰。

Adaptive-RAG 的設計目標是解決傳統 RAG(檢索增強生成)系統在處理不同複雜度查詢時的幾個關鍵問題:

  1. 效率問題: 傳統 RAG 系統對所有查詢都採用相同的檢索策略,這導致在處理簡單查詢時產生不必要的計算開銷。例如,對於模型本身就能直接回答的問題,仍然執行完整的檢索流程,造成資源浪費。
  2. 複雜查詢處理能力不足: 現有的 RAG 方法在處理需要多步推理或綜合多方面資訊的複雜查詢時,往往表現不佳。這些系統通常設計用於處理單一步驟的資訊檢索和生成,難以應對需要深度推理的問題。
  3. 缺乏靈活性: 大多數 RAG 系統採用固定的檢索策略,無法根據查詢的具體需求進行調整。這種「一刀切」的方法忽視了現實世界中查詢複雜度的多樣性。
  4. 平衡問題: 在簡單查詢和複雜查詢之間找到適當的平衡點一直是一個挑戰。過於簡單的方法無法處理複雜查詢,而過於複雜的方法則會在簡單查詢上浪費資源。
  5. 資源利用效率: 對於不需要外部知識的查詢,傳統 RAG 系統仍會執行檢索步驟,這不僅增加了響應時間,也浪費了計算資源。

1.2 Adaptive-RAG 解決的關鍵問題

Adaptive-RAG 通過引入動態策略選擇機制來解決這些問題。它首先使用一個輕量級的分類器來評估查詢的複雜度,然後根據這個評估結果選擇最適合的處理策略:

  • 對於簡單查詢,可能直接使用語言模型生成回答,完全跳過檢索步驟。
  • 對於中等複雜度的查詢,可能執行單次檢索。
  • 對於高度複雜的查詢,則可能採用多步檢索和推理策略。

提示:策略的核心在於根據每個查詢的複雜度,優化檢索增強型大語言模型(LLMs)的表現。

2. Adaptive-RAG的核心組件

2.1 文獻中如何進行查詢分類的?

Adaptive-RAG使用一個輕量級的語言模型(如T5架構)作為分類器,輸入為 user-query ,輸出為 query 難度。將用戶查詢分為三類:

  • 簡單(Non Retrieval for QA): 無需檢索即可生成正確答案
  • 中等(Single-step Approach for QA): 需要一輪檢索後生成正確答案
  • 困難(Multi-step Approach for QA): 需要多輪檢索後生成正確答案

2.2 分類器的訓練方法

在 Adaptive-RAG 系統中,分類器的訓練是一個關鍵環節,由於缺乏現成的查詢複雜度QA資料集,研究者採用了一種巧妙的兩階段標註方法:。為了解決這個問題,研究團隊採用了一種巧妙的兩階段標註方法,讓我們深入了解這個過程:

第一階段:Generate Silver Data

這個階段的目標是通過現有模型的表現來推斷查詢的複雜度。

  1. 簡單查詢(A 類):如果語言模型能夠直接正確回答,不需要額外檢索,就將該查詢標記為簡單。這就像是生產線上可以直接通過的產品。
  2. 中等查詢(B 類):如果模型需要一輪檢索才能生成正確答案,就將查詢標記為中等複雜度。這類似於需要進行一次返工或調整才能達標的產品。
  3. 複雜查詢(C 類):如果模型需要多輪檢索才能生成正確答案,就將查詢標記為複雜。這就像是需要多次修改和測試才能達到規格的高難度產品。

第二階段:利用資料集偏差(Utilize Dataset Bias)

對於第一階段無法明確分類的查詢,研究者採用了一種巧妙的方法,利用不同資料集的內在偏差來進行分類。
利用資料集特性:研究者認識到不同的 QA 資料集往往有其特定的複雜度傾向。例如,有些資料集可能偏向簡單的事實性問題,而其他資料集則可能包含更多需要複雜推理的問題。

3. Adaptive-RAG的效能分析

3.1 分類器效果

上 Figure 3
研究表明,Adaptive-RAG的分類準確度優於其他自適應檢索基準,證明了該分類器在識別查詢複雜度方面的卓越表現。

3.2 查詢處理時間

上 Table3

根據 Table 3 的數據,Adaptive-RAG 系統展現了令人印象深刻的效能差異化處理能力。簡單查詢(佔8.60%)僅需0.35秒即可完成,中等複雜度查詢(佔53.33%)需要3.08秒,而高度複雜查詢(佔38.07%)則需27.18秒。高複雜度查詢的處理時間(27.18秒)相對於其他類型仍然顯得過長。

⚠️ 注意: 高複雜度查詢的處理時間(27.18秒)仍然較長,有待進一步優化。

3.3 分類器大小的影響

研究發現,小型模型(60M參數)在大多數指標上與更大的模型相當,甚至在某些方面略勝一籌。這表明在資源受限的情況下,使用小型分類器模型是一個很好的選擇。

4. Adaptive-RAG 學到什麼?

策略選擇:Adaptive-RAG 框架的核心在於根據查詢的複雜度動態選擇最合適的檢索策略。這種自適應性確保了在處理不同複雜度的查詢時,能夠有效地平衡準確性和計算資源的消耗

查詢複雜度分類:使用一個小型的語言模型作為分類器,將查詢分為簡單(A)、中等(B)和複雜(C)三類。這種分類方法使得系統能夠針對不同類型的查詢選擇最合適的處理策略

5. Adaptive-RAG 的實作關鍵

5.1 實作關鍵組件

根據相關研究論文,查詢分析可用於在以下三種模式間進行路由選擇:

  • 無檢索模式
  • 單次 RAG 模式
  • 迭代式 RAG 模式

我們將利用 LangGraph 工具來擴展這個概念。在我們的實作中,我們將在以下幾種方式間進行路由:

  • 網路搜尋:用於處理與近期事件相關的問題
  • 自我修正式 RAG:用於處理與我們索引相關的問題

adaptive-rag.png

圖源取自 Langgraph 官網

實作內容中,挑選出關鍵特性程式碼出來進行說明,如果想知曉完整實作的話,請查看提供的程式碼連結。

5.2 路由器(Router):選擇資訊來源

展示了如何根據問題類型選擇不同的資訊來源。

system = """你是一個專家,負責將用戶問題路由到向量存儲或網絡搜索。
向量存儲包含與代理、提示工程和對抗性攻擊相關的文檔。
對於這些主題的問題使用向量存儲。否則,使用網絡搜索。"""
route_prompt = ChatPromptTemplate.from_messages([
    ("system", system),
    ("human", "{question}"),
])
question_router = route_prompt | structured_llm_router

上執行結果

路由器通過分析問題的內容和特徵,智能地選擇最適合的資訊來源。這種動態選擇機制使系統能夠靈活應對不同類型的查詢,提高回答的準確性和相關性

5.3 檢索評分器:確保資訊相關性

檢索評分器用於評估從選定來源檢索到的文檔與原始問題的相關性,確保後續處理基於高品質的資訊。

system = """你是一個評分員,評估檢索文檔與用戶問題的相關性。
如果文檔包含與用戶問題相關的關鍵詞或語義含義,將其評為相關。
給出二元評分 'yes' 或 'no' 來表示文檔是否與問題相關。"""
grade_prompt = ChatPromptTemplate.from_messages([
    ("system", system),
    ("human", "檢索文檔:\n\n {document} \n\n 用戶問題:{question}"),
])

上執行結果

這個組件對每個檢索到的文檔進行評分,判斷其是否與問題相關。通過過濾掉不相關的文檔,系統可以專注於最相關的信息,提高回答的品質。評分過程考慮了文檔內容與問題之間的語義相關性,而不僅僅是關鍵詞匹配。

5.4 查詢優化器:提升檢索效果

查詢優化器的作用是改寫原始問題,使其更適合檢索系統,從而提高檢索結果的品質。

system = """你是一個問題重寫器,將輸入問題轉換為更適合向量存儲檢索的版本。
分析輸入並嘗試理解其底層語義意圖/含義。"""
re_write_prompt = ChatPromptTemplate.from_messages([
    ("system", system),
    ("human", "這是初始問題:\n\n {question} \n 制定一個改進的問題。"),
])

上執行結果

當初始檢索結果不理想時,查詢優化器會分析原始問題,考慮其潛在的語義和意圖,然後生成一個經過優化的查詢。

5.5 編譯圖並與之互動

現在我們可以使用編譯後的圖來處理各種查詢。以下是幾個示例:

workflow = StateGraph(GraphState)

# Define the nodes
workflow.add_node("web_search", web_search) # web search
workflow.add_node("retrieve", retrieve) # retrieve
workflow.add_node("grade_documents", grade_documents) # grade documents
workflow.add_node("generate", generate) # generatae
workflow.add_node("transform_query", transform_query) # transform_query

# Build graph
workflow.set_conditional_entry_point(
    route_question,
    {
        "web_search": "web_search",
        "vectorstore": "retrieve",
    },
)
workflow.add_edge("web_search", "generate")
workflow.add_edge("retrieve", "grade_documents")
workflow.add_conditional_edges(
    "grade_documents",
    decide_to_generate,
    {
        "transform_query": "transform_query",
        "generate": "generate",
    },
)
workflow.add_edge("transform_query", "retrieve")
workflow.add_conditional_edges(
    "generate",
    grade_generation_v_documents_and_question,
    {
        "not supported": "generate",
        "useful": END,
        "not useful": "transform_query",
    },
)
app = workflow.compile()

5.5.1 生成式代理相關問題


inputs = {"question": "什麼是 Agent ?"}
for output in app.stream(inputs):
    for key, value in output.items():
        pprint(f"Node '{key}':")
    pprint("\n---\n")

# Final generation
pprint(value["generation"])

上直結行果

5.5.2 美國總統相關問題

# Run
inputs = {"question": "誰是美國建國總統?"}
for output in app.stream(inputs):
    for key, value in output.items():
        pprint(f"Node '{key}':")
    pprint("\n---\n")

# Final generation
pprint(value["generation"])

上直結行果

6. 結論:Adaptive-RAG 的革新意義

Adaptive-RAG技術代表了檢索增強生成領域的重大進步。通過動態選擇最適合的檢索策略,它不僅提高了系統效率,還顯著改善了處理複雜查詢的能力。儘管在高複雜度查詢的處理時間上還有改進空間,但Adaptive-RAG無疑為未來的AI問答系統指明了方向。

隨著技術的不斷發展,我們可以期待看到更多基於Adaptive-RAG原理的創新應用,進一步推動自然語言處理技術的進步。

🚀 未來展望: Adaptive-RAG技術有潛力潛伏於各種依賴於語言模型的應用,從客戶服務到再到個人助理,都可能因此獲得質的飛躍。

即刻前往教學程式碼 Repo,親自動手實作 Adaptive-RAG 吧!別忘了給專案按個星星並持續關注更新,讓我們一起探索AI代理的新境界。

X. 參考資料


上一篇
【Day 22】- CRAG: 檢索增強生成的糾錯機制 - 提升大型語言模型問答精確度
下一篇
【Day 24】- GraphRAG:革新檢索增強生成的新範式
系列文
2024 年用 LangGraph 從零開始實現 Agentic AI System31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言