如何代理性 RAG 減少幻覺並改善檢索
探索 Agentic RAG 如何通過重新制定查詢、完善結果和利用更大的語言模型來減少幻覺並提高檢索。為您的 RAG 應用程序解鎖更全面和相關的響應。
2025年2月21日

利用代理人解鎖檢索增強型生成(RAG)的力量。探索如何通過引入能夠分析查詢、優化搜索和生成更準確、全面響應的智能代理人,來增強您的RAG管線並減少幻覺。本博客文章提供了實施代理RAG的實用指南,為您的自然語言處理應用程序提供提升工具。
代理人如何修復 RAG 中的幻覺
代理人如何修復 RAG 中的幻覺
信息檢索步驟在檢索增強型生成(RAG)中高度依賴於使用者提出問題的方式。如果查詢沒有很好地被表達,即使所需的資訊存在於知識庫中,資訊檢索也可能很困難。在傳統的RAG中,我們只獲得一個簡短的檢索結果,但我們可以通過代理RAG來解決這個問題。
要了解代理RAG如何有所幫助,讓我們看看傳統RAG的檢索設置。使用者查詢會通過基於語義的相似性搜索,尋找知識庫中最相關的片段。但如果問題本身沒有正確地提出,會發生什麼情況呢?在這種情況下,您的RAG管線很可能會產生幻覺,也就是開始編造答案,或者語言模型會告訴使用者找不到資訊,即使該資訊實際上存在於知識庫中。
我們可以通過在RAG管線中引入代理,並賦予他們不僅分析初始查詢,還分析RAG管線生成的響應的能力來解決這個問題。通常情況下,它是這樣運作的:
- 初始查詢會傳遞給一個代理。
- 代理會重新表述初始查詢。
- 經過修改的查詢會傳遞到知識庫,並進行基於語義的相似性搜索,以檢索最相關的文件。
- 在將相關文件傳遞給語言模型之前,代理會再次分析這些文件或片段,如果認為檢索到的文件無法回答問題,就會修改查詢。
- 根據修改後的查詢,該過程會重複進行,直到代理對檢索到的文件和重新表述的查詢感到滿意。
- 最終的上下文會傳遞給語言模型來生成答案。
在這種情況下,代理可以計劃、分析和執行,在您的RAG管線中實現代理迴圈。您有幾個選擇,如Crew AI、AutoGPT或LangChain中的LangGraph框架,您可以使用它們來構建代理。在這個視頻中,我們將使用Transformers Agents,這是Transformers套件中一個較為鮮為人知的功能,它允許您創建自己的代理。
建立代理 RAG 管線
建立代理 RAG 管線
檢索增強型生成或RAG中的信息檢索步驟高度依賴於使用者提出問題的方式。如果查詢沒有很好地被表達,即使所需的資訊存在於知識庫中,資訊檢索也可能很困難。在傳統的RAG中,我們只獲得一個簡短的檢索結果,但我們可以通過代理RAG來解決這個問題。
要了解代理RAG如何有所幫助,讓我們看看傳統RAG的檢索設置。使用者查詢會通過基於語義的相似性搜索,尋找知識庫中最相關的片段。但如果問題本身沒有正確地提出,會發生什麼情況呢?在這種情況下,您的RAG管線很可能會產生幻覺,也就是開始編造答案,或者大型語言模型會告訴使用者找不到資訊,即使該資訊實際上存在於知識庫中。
我們可以通過在RAG管線中引入代理,並賦予他們不僅分析初始查詢,還分析RAG管線生成的響應的能力來解決這個問題。通常情況下,它是這樣運作的:
- 初始查詢會傳遞給一個代理。
- 代理會重新表述初始查詢。
- 經過修改的查詢會傳遞到知識庫,並進行基於語義的相似性搜索,以檢索最相關的文件。
- 在將相關文件傳遞給大型語言模型之前,代理會再次分析這些文件或片段,如果認為檢索到的文件無法回答問題,就會修改查詢。
- 根據修改後的查詢,該過程會重複進行,直到代理對檢索到的文件和重新表述的查詢感到滿意。
- 最終的上下文會傳遞給大型語言模型來生成答案。
要在您的RAG管線中實現代理迴圈,您有幾個選擇,如Crew AI、Auto或LangChain中的LangGraph框架。在這種情況下,我們將使用Transformers Agents,這是Transformers套件中一個較為鮮為人知的功能,它允許您創建自己的代理。
首先,我們需要安裝所需的套件,包括pandas、LangChain、LangChain社區套件、Sentence Transformer套件和Transformers套件。然後,我們將導入必要的模組,並設置數據,包括將文件拆分為片段和創建嵌入。
接下來,我們將創建一個檢索工具,代理可以使用它從知識庫中檢索相關文件。我們還將設置大型語言模型,在本例中使用OpenAI引擎。
最後,我們將創建代理本身,它將有權訪問檢索工具和大型語言模型,以及一個指導代理行為的系統提示。然後,我們將運行代理通過代理迴圈來生成對樣本問題的答案,並將結果與標準RAG管線進行比較。
代理RAG方法允許通過使代理能夠修改查詢並檢索最相關的資訊,從而獲得更強大和更全面的答案,從而導致大型語言模型產生更高質量的響應。
創建檢索工具
創建檢索工具
為了創建用於代理RAG管線的檢索工具,我們定義了一個RetrievalTool
類,其結構如下:
class RetrievalTool:
"""使用語義相似性,從知識庫中檢索與輸入最相似的一些文件。"""
def __init__(self, vector_db):
self.vector_db = vector_db
def __call__(self, query: str) -> List[str]:
"""
從向量資料庫中檢索最多7個與給定查詢最相似的片段。
Args:
query (str): 要執行檢索的查詢。這應該在語義上接近目標文件。
Returns:
List[str]: 從向量資料庫中檢索到的最多7個最相似的片段。
"""
results = self.vector_db.similarity_search(query, k=7)
return [chunk.page_content for chunk in results]
RetrievalTool
類將一個vector_db
對象作為輸入,這是用於存儲文件嵌入的向量存儲(如Faiss、Chroma、Pinecone)。
該類的__call__
方法將一個query
字符串作為輸入,並返回最多7個從向量資料庫中最相似的片段。它使用vector_db
對象的similarity_search
方法,根據餘弦相似性找到最相似的片段。
這個檢索工具可以作為代理RAG管線的一部分,代理可以分析初始查詢,對其進行修改,並將其傳遞給檢索工具,以從知識庫中獲取最相關的片段。
整合語言模型
整合語言模型
要將語言模型集成到代理RAG管線中,我們需要設置將由代理和最終響應生成使用的LLM。我們有兩個選擇:
-
使用Hugging Face引擎: 這允許我們直接調用Hugging Face無伺服器架構提供的不同LLM的API端點。我們可以使用像Llama 38B或70B這樣的模型,但這通常需要Hugging Face Pro訂閱。
-
使用OpenAI: 在這個例子中,我們將使用OpenAI引擎。這個過程可以被調整以設置任何其他LLM。
要設置OpenAI引擎,我們創建一個名為OpenAIEngine
的類,它使用Transformer Agents LLM引擎中的message_rle
和gpt_generate_message_list
函數。這個類處理輸入消息的清理,並使用OpenAI聊天完成端點來生成響應。
接下來,我們創建實際的代理。代理可以訪問我們之前創建的檢索工具、我們想要使用的LLM(在本例中為OpenAIEngine
)以及我們希望代理在停止代理迴圈之前執行的最大迭代次數。
我們還為代理提供了一個系統提示,它為代理提供了如何使用知識庫中的資訊為使用者的問題提供全面答案的指示。該提示鼓勵代理在找不到必要的資訊時,重試使用不同的查詢進行檢索。
有了代理和LLM的設置,我們現在可以運行代理迴圈來回答使用者的問題。代理將迭代地修改查詢,從知識庫中檢索相關資訊,並使用LLM生成最終響應。這種方法可以產生比標準RAG管線更詳細和相關的答案。
實施代理人代理
實施代理人代理
要實現代理代理,我們將使用Transformers套件中的Transformers Agents功能。這提供了一種模塊化和清晰的方法來創建自定義代理。
首先,我們需要安裝所需的套件,包括pandas、Langchain、Langchain社區套件、Sentence Transformers和Transformers Agents。
接下來,我們導入必要的模組和包。我們將使用ReactJsonAgent,為代理構建自定義工具,並利用Hugging Face引擎作為語言模型。
要構建RAG管線,我們從包含Hugging Face文檔的數據集開始。我們將文檔拆分為片段,並使用GTE-small模型創建嵌入。然後,我們刪除任何重複的片段,並將唯一的片段存儲在基於F的向量存儲中。
現在,我們將代理引入其中。我們創建一個RetrievalTool
,使用語義相似性根據使用者的查詢從知識庫中檢索最相關的片段。
我們還設置了語言模型,在本例中使用OpenAI引擎和GPT-4模型。
然後創建代理,它可以訪問檢索工具和語言模型。我們還指定代理可以執行的最大迭代次數,以修改查詢和檢索的上下文。
代理被提供了一個系統提示,指導它使用知識庫為使用者的問題提供全面的答案。代理然後經歷一個迭代過程,重新表述查詢並檢索更相關的資訊,直到對響應感到滿意。
然後將代理RAG管線與標準RAG管線進行比較,展示代理方法如何提供更詳細和相關的答案,特別是當使用者的初始查詢沒有很好地表達時。
比較標準 RAG 和代理 RAG
比較標準 RAG 和代理 RAG
標準RAG和代理RAG之間的關鍵區別是:
-
查詢重新表述: 在標準RAG中,使用者查詢直接通過基於語義的相似性搜索,從知識庫中檢索相關片段。在代理RAG中,代理分析初始查詢並可以重新表述它以改善檢索過程。
-
迭代細化: 代理RAG允許代理迭代地修改查詢和檢索的上下文。如果代理對初始檢索結果不滿意,它可以使用修改後的查詢重複該過程,以獲得更好的結果。
-
簡潔和相關的響應: 代理方法倾向於生成比標準RAG更簡潔和相關的響應。代理分析查詢和檢索的上下文的能力有助於提供更全面的答案。
-
處理表述不佳的查詢: 代理RAG更能處理使用者查詢表述不佳的情況。代理可以識別初始查詢的局限性,並努力重新表述,從而導致更好的檢索和更有信息量的響應。
-
靈活性和可定制性: 代理RAG允許更大的靈活性和可定制性,因為代理可以配備各種工具和功能,以滿足應用程序的特定需求。
總之,代理RAG引入了額外的智能和控制層,使系統能夠更好地理解使用者的意圖,細化檢索過程,並生成更有針對性和信息量更大的響應,即使初始查詢並不理想。
結論
結論
將代理引入檢索增強型生成(RAG)管線可以顯著提高生成響應的質量和相關性。通過允許代
常問問題
常問問題