摘要
這篇文章介紹了一種名為「Corrective RAG (CRAG)」的技術,旨在提升大型語言模型(LLM)在問答系統中的準確性和可靠性。CRAG 的核心思想是通過「檢索評估器」和「知識精練」兩個機制來優化檢索結果,解決傳統 RAG 模型中常見的「資訊相關性低」和「資訊雜亂無章」等問題。文章首先闡述了 CRAG 的理論基礎,並將其與傳統 RAG 模型進行對比,說明了 CRAG 如何克服傳統 RAG 模型的局限性。隨後,文章詳細介紹了「檢索評估器」和「知識精練」機制的運作原理,以及它們如何有效地解決檢索結果品質問題。文章的後半部分則以 LangGraph 框架為例,展示了如何利用 CRAG 技術構建一個完整的問答系統,並展示了 CRAG 的實際應用效果。總之,這篇文章的核心在於介紹 CRAG 技術,闡述其解決傳統 RAG 模型問題的方案,並通過實際案例展示了其在問答系統中的應用。
探索Corrective RAG(CRAG)如何通過創新的檢索評估和知識精練機制,大幅提升AI問答系統的準確性和可靠性。本文深入剖析CRAG的工作原理,並與傳統RAG進行對比,揭示其在AI領域的革命性潛力。
Corrective RAG(糾錯檢索增強生成),主要提高語言模型生成穩健性的方法。此法中通過評估器和網路檢索針對檢索到到文檔相關性,進行ㄧ番評估與增強,以確保說在生成回應中保有更為精準、可靠的訊息。
想像你正在參加難得的開書考,面對考卷上的試題,你可能會有以下幾種作答策略:
這三種策略分別對應了三種不同的信息檢索和答案生成方式。第一種策略類似於人類憑藉自身知識儲備直接作答。第二種策略類似於傳統的檢索增強生成 (RAG) 技術。第三種策略則對應著本文將要介紹的 糾正性 RAG 模型 (CRAG)。
傳統的檢索增強生成(RAG)技術雖然強大,但也面臨著兩大挑戰:
這些問題導致AI有時會生成看似合理,實則錯誤的"幻覺"內容。
鑑於檢索增強生成,在檢索資訊過程中存在些局限性,可能會導致後續生成內容的真實性以及品質。以下是作者整理出的局限性重點,並且用圖表表達之。
傳統的 RAG 方法往往沒有充分考慮檢索到的文件與問題之間的相關性,而是將所有檢索到的文件簡單地合併在一起,作為生成模型的輸入。這會導致大量無關信息的引入,進而影響生成模型對知識的理解,並可能導致模型生成與事實不符的"幻覺"內容。
傳統的 RAG 方法通常將整個檢索到的文件作為輸入,但實際上,文件中的大部分內容可能與生成的內容無關。這些冗餘信息不僅會增加模型的計算負擔,還會影響模型對關鍵資訊的提取和利用。
CRAG 提出傳統 RAG 會有檢索資訊品質不夠好問題,導致生成答案錯誤。為此 CRAG 作者群提出 Retrieval Evaluator(檢索評估器) 以及 Knowledge Refinement(知識精練) 兩個機制來解決上述問題。以下是兩者的運作機制:
取自論文 Figure2
用於評估針對特定問題檢索到的文件的整體品質。它還會利用網路搜索作為輔助工具,進一步提升檢索結果的品質。
評估答案分為「正確」(correct)、「模糊」(Ambiguous)、「錯誤」(Incorrect)三種情況。對於「正確」的情況,直接進行知識精練,抽取關鍵資訊。針對「錯誤」的資訊,則利用網路檢索來擴充知識量。針對「模糊」的知識,結合前面兩種操作來提供答案的穩健性及精準度。
先將文件進行分解再重新組合,以便深入挖掘文件中的核心知識點。
利用自訂規則將文件進行分解,並由檢索評估器來衡量其相關性。最後將剩餘的相關知識重新整合。
檢索評估器可以被視為一個評分分類模型。該模型用於確定查詢與文件之間的相關性,類似於 RAG 中的重新排序(re-ranking)模型。
這種相關性判斷模型可以通過整合更多符合現實世界場景的特徵來進行改進。例如,科學論文問答中的 RAG 包含許多專業術語,而旅遊領域的 RAG 則往往包含更多口語化的用戶查詢。
CRAG 使用一個輕量級的 T5-large 模型作為檢索評估器,並對其進行了微調。值得一提的是,即使在大語言模型的時代,T5-large 模型仍然被認為是輕量級的。
對於每個輸入的問題,CRAG 通常會檢索十個相關的文件。然後,系統會將問題與每個文件分別組合在一起,作為輸入數據,讓 T5-large 模型預測它們之間的相關性。在微調過程中,模型會將標籤 1 分配給正樣本(與問題相關的文件),將標籤 -1 分配給負樣本(與問題無關的文件)。在推理過程中,評估器會為每個文件分配一個介於 -1 到 1 之間的相關性分數。
CRAG 設計了一種新穎的知識提取方法,即先將文檔分解再重新組合,以便深入挖掘文檔中的核心知識點。
首先,利用一系列規則將文檔細分為較小的知識單元,目的是獲取更精細的知識點。如果檢索到的文檔僅包含一句或兩句話,則將其視為一個整體。如果文檔較長,則根據其總長度進一步細分為包含數個句子的小單元,每個單元都應包含一個完整的信息點。
然後,利用檢索評估器為每個知識單元計算相關性評分,篩除那些評分較低的單元。剩下的、評分較高的知識單元將被重新組合,構建成完整的內部知識體系。
在前面的章節中,我們深入探討了CRAG(Contextual Retrieval-Augmented Generation,上下文檢索增強生成)的概念、原理和優勢。CRAG作為一種先進的資訊檢索和生成技術,透過將上下文相關的檢索結果與大型語言模型(LLM)的生成能力相結合,大幅提升了AI系統回答問題和完成任務的準確性和相關性。
現在,讓我們將理論付諸實踐。為了更好地理解CRAG的運作原理並展示其實際應用,我們將使用LangGraph框架來實作一個基於CRAG的問答系統。LangGraph是一個強大的工具,它允許我們以圖的形式建構複雜的語言處理工作流程,非常適合實現CRAG這樣的高階AI技術。
讓我們一步步來看如何使用 LangGraph 實作 CRAG 系統。
在接下來的部分中,我們將:
CRAG 的核心之一是高效的資訊檢索。我們使用 Chroma 作為向量資料庫來儲存和檢索文件:
embedding_function = OpenAIEmbeddings()
docs = [
Document(
page_content="鼎泰豐由楊秉彝與妻子賴盆妹於1958年在台北創立,最初是販售食用油的小店。1972年轉型為餐廳,以小籠包聞名。現已成為國際知名的台灣美食品牌,在全球多個國家設有分店。",
metadata={"source": "restaurant_history.txt"},
),
# ... 其他文件 ...
]
db = Chroma.from_documents(docs, embedding_function)
retriever = db.as_retriever()
CRAG 系統需要多個組件來處理不同的任務。以下是一些關鍵組件:
這個組件評估問題是否與我們的知識領域(此例中為鼎泰豐)相關:
class GradeQuestion(BaseModel):
score: str = Field(
description="問題是否與餐廳有關? 如果是 -> '是' 如果不是 -> '否'"
)
system = """你是一個評分員,負責評估檢索到的文件與用戶問題的相關性。
只有當問題是關於以下主題時才回答:
1. 鼎泰豐的歷史和創始人資訊
2. 鼎泰豐的菜單和特色菜品
3. 鼎泰豐的價格範圍
4. 鼎泰豐的營業時間和地點
5. 鼎泰豐的用餐體驗和服務
如果問題是關於這些主題,請回答"是",否則回答"否"。
"""
grade_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
("human", "user question: {question}"),
]
)
llm = ChatOpenAI(model="gpt-4", temperature=0)
structured_llm = llm.with_structured_output(GradeQuestion)
grader_llm = grade_prompt | structured_llm
這個組件評估檢索到的文件是否與問題相關:
class GradeDocuments(BaseModel):
score: str = Field(
description="文檔是否與問題相關,'是' 或 '否'"
)
system = """你是一個評分員,負責評估檢索到的文檔與用戶問題的相關性。
如果文檔包含與問題相關的關鍵詞或語義含義,請將其評為相關。
給出二元評分 '是' 或 '否' 來表示文檔是否與問題相關。"""
grade_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
(
"human",
"Retrieved document: \n\n {document} \n\n User question: {question}",
),
]
)
docs_grader_llm = grade_prompt | structured_llm
這個組件將用戶的原始問題轉化為更適合檢索的形式:
from langchain_core.output_parsers import StrOutputParser
system = """你是一個問題重寫器,負責將輸入的問題轉換成更適合檢索的優化版本。
分析輸入問題,試圖理解其潛在的語義意圖和含義。
特別注意與鼎泰豐餐廳相關的問題,包括但不限於:
1. 鼎泰豐的歷史和創始人資訊
2. 鼎泰豐的菜單和特色菜品
3. 鼎泰豐的價格範圍
4. 鼎泰豐的營業時間和地點
5. 鼎泰豐的用餐體驗和服務
請根據這些主題來優化問題。"""
re_write_prompt = ChatPromptTemplate.from_messages(
[
("system", system),
(
"human",
"Here is the initial question: \n\n {question} \n Formulate an improved question.",
),
]
)
question_rewriter = re_write_prompt | llm | StrOutputParser()
這個組件根據檢索到的文件回答問題:
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(
template=template,
)
generation = prompt | llm | StrOutputParser()
現在,我們使用 LangGraph 將這些組件組合成一個完整的 CRAG 工作流:
from langgraph.graph import END, StateGraph, START
workflow = StateGraph(AgentState)
# Define the nodes
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
workflow.add_node("web_search_node", web_search) # web search
# Build graph
workflow.add_edge(START, "retrieve")
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", "web_search_node")
workflow.add_edge("web_search_node", "generate")
workflow.add_edge("generate", END)
# Compile
app = workflow.compile()
這個工作流程包含了問題分類、文件檢索、相關性評估、問題重寫和答案生成等步驟,全面實現了 CRAG 的核心功能。
最後,我們可以視覺化整個 CRAG 工作流,並與之互動:
from IPython.display import Image, display
try:
display(Image(app.get_graph(xray=True).draw_mermaid_png()))
except:
pass
# 互動示例
result = app.invoke({"question": "鼎泰豐有賣湯包嗎?"})
print(result["llm_output"])
通過這個實作,我們看到了如何使用 LangGraph 構建一個完整的 CRAG 系統。這個系統能夠智能地處理用戶查詢,根據問題的相關性和檢索到的文件質量動態調整處理流程,最終提供準確且相關的回答。
這種方法不僅展示了 CRAG 的強大功能,也體現了 LangGraph 在構建複雜 AI 工作流方面的靈活性和效率。通過這樣的實作,我們可以更深入地理解 CRAG 的工作原理,並探索其在實際應用中的潛力。
Corrective RAG (CRAG) 技術是一種創新的方法,旨在提升大型語言模型(LLM)在問答系統中的準確性和可靠性。CRAG 通過引入「檢索評估器」和「知識精練」兩個核心機制,有效解決了傳統檢索增強生成(RAG)模型中常見的資訊相關性低和資訊雜亂無章等問題。
CRAG 的工作原理包括:
在實際應用中,CRAG 可以通過 LangGraph 框架來實現,該框架允許以圖的形式構建複雜的語言處理工作流程。實現步驟包括建立向量資料庫、定義關鍵組件(如問題相關性評分器、文件相關性評分器、問題重寫器和問答Agent),以及構建完整的 CRAG 工作流。
即刻前往教學程式碼 Repo,親自動手體驗 CRAG 的魅力吧!別忘了給專案按個星星並持續關注更新,讓我們一起探索AI代理的新境界。