摘要
這篇文件介紹了一種名為「Adaptive-RAG」的技術,它旨在提升問答系統的準確性和效率。Adaptive-RAG 的核心概念是根據使用者查詢的複雜度動態調整檢索方法。它使用一個輕量級的分類器來評估查詢的複雜度,並根據這個評估結果選擇最適合的處理策略。例如,對於簡單的查詢,可能直接使用語言模型生成答案,完全跳過檢索步驟;而對於複雜的查詢,則可能採用多步檢索和推理策略。Adaptive-RAG 的優點包括:提高效率: 針對不同複雜度的查詢,採用最合適的策略,避免不必要的計算資源浪費。提升準確性: 通過自適應的檢索方法,更有效地處理複雜查詢,提升問答系統的準確性。靈活性: 根據查詢的具體需求進行動態調整,而非採用固定的檢索策略。
文件還詳細描述了 Adaptive-RAG 的核心組件,包括查詢分類器、訓練方法、效能分析以及實作關鍵。最後,文件總結了 Adaptive-RAG 的革新意義,並展望了其未來應用潛力。
在人工智慧和自然語言處理領域中,Adaptive-RAG(自適應檢索增強生成)技術正在引領一場革命。這種創新方法不僅提升了問答系統的效能,還為處理不同複雜度的查詢提供了靈活的解決方案。讓我們深入探討這項技術的核心概念、運作機制以及實際應用。
Adaptive-RAG (自適應檢索增強生成) 是一種先進的檢索增強生成 (RAG) 策略,其核心在於能夠根據使用者查詢的複雜度動態調整檢索方法。相較於傳統的靜態 RAG 方法,Adaptive-RAG 運用分類器評估問題複雜度,並據此選擇最適合的檢索策略。這種自適應方法通過將問題導向不同的 RAG 方法,甚至在簡單情況下跳過檢索步驟,有效管理各種複雜度的查詢。Adaptive-RAG 的目標是透過為每個查詢客製化檢索流程,提升問答系統的效率和準確性
💡 核心理念: 為每個查詢客製化檢索流程,提升問答系統的效率和準確性。
傳統的大型語言模型 (LLMs) 依賴固定的訓練知識庫,難以回應當前或特定資訊的查詢。雖然檢索增強生成 (RAG) 方法試圖通過結合外部資料檢索來解決這個問題,但在處理不同複雜度的查詢時仍面臨挑戰。
Adaptive-RAG 的設計目標是解決傳統 RAG(檢索增強生成)系統在處理不同複雜度查詢時的幾個關鍵問題:
Adaptive-RAG 通過引入動態策略選擇機制來解決這些問題。它首先使用一個輕量級的分類器來評估查詢的複雜度,然後根據這個評估結果選擇最適合的處理策略:
提示:策略的核心在於根據每個查詢的複雜度,優化檢索增強型大語言模型(LLMs)的表現。
Adaptive-RAG使用一個輕量級的語言模型(如T5架構)作為分類器,輸入為 user-query ,輸出為 query 難度。將用戶查詢分為三類:
在 Adaptive-RAG 系統中,分類器的訓練是一個關鍵環節,由於缺乏現成的查詢複雜度QA資料集,研究者採用了一種巧妙的兩階段標註方法:。為了解決這個問題,研究團隊採用了一種巧妙的兩階段標註方法,讓我們深入了解這個過程:
第一階段:Generate Silver Data
這個階段的目標是通過現有模型的表現來推斷查詢的複雜度。
第二階段:利用資料集偏差(Utilize Dataset Bias)
對於第一階段無法明確分類的查詢,研究者採用了一種巧妙的方法,利用不同資料集的內在偏差來進行分類。
利用資料集特性:研究者認識到不同的 QA 資料集往往有其特定的複雜度傾向。例如,有些資料集可能偏向簡單的事實性問題,而其他資料集則可能包含更多需要複雜推理的問題。
研究表明,Adaptive-RAG的分類準確度優於其他自適應檢索基準,證明了該分類器在識別查詢複雜度方面的卓越表現。
根據 Table 3 的數據,Adaptive-RAG 系統展現了令人印象深刻的效能差異化處理能力。簡單查詢(佔8.60%)僅需0.35秒即可完成,中等複雜度查詢(佔53.33%)需要3.08秒,而高度複雜查詢(佔38.07%)則需27.18秒。高複雜度查詢的處理時間(27.18秒)相對於其他類型仍然顯得過長。
⚠️ 注意: 高複雜度查詢的處理時間(27.18秒)仍然較長,有待進一步優化。
研究發現,小型模型(60M參數)在大多數指標上與更大的模型相當,甚至在某些方面略勝一籌。這表明在資源受限的情況下,使用小型分類器模型是一個很好的選擇。
策略選擇:Adaptive-RAG 框架的核心在於根據查詢的複雜度動態選擇最合適的檢索策略。這種自適應性確保了在處理不同複雜度的查詢時,能夠有效地平衡準確性和計算資源的消耗
查詢複雜度分類:使用一個小型的語言模型作為分類器,將查詢分為簡單(A)、中等(B)和複雜(C)三類。這種分類方法使得系統能夠針對不同類型的查詢選擇最合適的處理策略
根據相關研究論文,查詢分析可用於在以下三種模式間進行路由選擇:
我們將利用 LangGraph 工具來擴展這個概念。在我們的實作中,我們將在以下幾種方式間進行路由:
實作內容中,挑選出關鍵特性程式碼出來進行說明,如果想知曉完整實作的話,請查看提供的程式碼連結。
展示了如何根據問題類型選擇不同的資訊來源。
system = """你是一個專家,負責將用戶問題路由到向量存儲或網絡搜索。
向量存儲包含與代理、提示工程和對抗性攻擊相關的文檔。
對於這些主題的問題使用向量存儲。否則,使用網絡搜索。"""
route_prompt = ChatPromptTemplate.from_messages([
("system", system),
("human", "{question}"),
])
question_router = route_prompt | structured_llm_router
路由器通過分析問題的內容和特徵,智能地選擇最適合的資訊來源。這種動態選擇機制使系統能夠靈活應對不同類型的查詢,提高回答的準確性和相關性
檢索評分器用於評估從選定來源檢索到的文檔與原始問題的相關性,確保後續處理基於高品質的資訊。
system = """你是一個評分員,評估檢索文檔與用戶問題的相關性。
如果文檔包含與用戶問題相關的關鍵詞或語義含義,將其評為相關。
給出二元評分 'yes' 或 'no' 來表示文檔是否與問題相關。"""
grade_prompt = ChatPromptTemplate.from_messages([
("system", system),
("human", "檢索文檔:\n\n {document} \n\n 用戶問題:{question}"),
])
這個組件對每個檢索到的文檔進行評分,判斷其是否與問題相關。通過過濾掉不相關的文檔,系統可以專注於最相關的信息,提高回答的品質。評分過程考慮了文檔內容與問題之間的語義相關性,而不僅僅是關鍵詞匹配。
查詢優化器的作用是改寫原始問題,使其更適合檢索系統,從而提高檢索結果的品質。
system = """你是一個問題重寫器,將輸入問題轉換為更適合向量存儲檢索的版本。
分析輸入並嘗試理解其底層語義意圖/含義。"""
re_write_prompt = ChatPromptTemplate.from_messages([
("system", system),
("human", "這是初始問題:\n\n {question} \n 制定一個改進的問題。"),
])
當初始檢索結果不理想時,查詢優化器會分析原始問題,考慮其潛在的語義和意圖,然後生成一個經過優化的查詢。
現在我們可以使用編譯後的圖來處理各種查詢。以下是幾個示例:
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()
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"])
# 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"])
Adaptive-RAG技術代表了檢索增強生成領域的重大進步。通過動態選擇最適合的檢索策略,它不僅提高了系統效率,還顯著改善了處理複雜查詢的能力。儘管在高複雜度查詢的處理時間上還有改進空間,但Adaptive-RAG無疑為未來的AI問答系統指明了方向。
隨著技術的不斷發展,我們可以期待看到更多基於Adaptive-RAG原理的創新應用,進一步推動自然語言處理技術的進步。
🚀 未來展望: Adaptive-RAG技術有潛力潛伏於各種依賴於語言模型的應用,從客戶服務到再到個人助理,都可能因此獲得質的飛躍。
即刻前往教學程式碼 Repo,親自動手實作 Adaptive-RAG 吧!別忘了給專案按個星星並持續關注更新,讓我們一起探索AI代理的新境界。