iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
生成式 AI

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

【Day 22】- CRAG: 檢索增強生成的糾錯機制 - 提升大型語言模型問答精確度

  • 分享至 

  • xImage
  •  

摘要
這篇文章介紹了一種名為「Corrective RAG (CRAG)」的技術,旨在提升大型語言模型(LLM)在問答系統中的準確性和可靠性。CRAG 的核心思想是通過「檢索評估器」和「知識精練」兩個機制來優化檢索結果,解決傳統 RAG 模型中常見的「資訊相關性低」和「資訊雜亂無章」等問題。文章首先闡述了 CRAG 的理論基礎,並將其與傳統 RAG 模型進行對比,說明了 CRAG 如何克服傳統 RAG 模型的局限性。隨後,文章詳細介紹了「檢索評估器」和「知識精練」機制的運作原理,以及它們如何有效地解決檢索結果品質問題。文章的後半部分則以 LangGraph 框架為例,展示了如何利用 CRAG 技術構建一個完整的問答系統,並展示了 CRAG 的實際應用效果。總之,這篇文章的核心在於介紹 CRAG 技術,闡述其解決傳統 RAG 模型問題的方案,並通過實際案例展示了其在問答系統中的應用。

引言

探索Corrective RAG(CRAG)如何通過創新的檢索評估和知識精練機制,大幅提升AI問答系統的準確性和可靠性。本文深入剖析CRAG的工作原理,並與傳統RAG進行對比,揭示其在AI領域的革命性潛力。

首圖

1. CRAG 技術概述與理論基礎

Corrective RAG(糾錯檢索增強生成),主要提高語言模型生成穩健性的方法。此法中通過評估器和網路檢索針對檢索到到文檔相關性,進行ㄧ番評估與增強,以確保說在生成回應中保有更為精準、可靠的訊息。

1.1 檢索增強生成技術的演進:從傳統 RAG 到 CRAG

想像你正在參加難得的開書考,面對考卷上的試題,你可能會有以下幾種作答策略:

  • 方法一、開書考沒用,直接憑記憶上
    • 對於熟悉的題目,直接憑藉記憶快速作答。而對於不熟悉的題目,則查閱參考書,找到相關章節,快速理解並總結,然後將答案寫在試卷上。
  • 方法二、考卷是天書,每題都查找
    • 對於每一道題目,都仔細查閱參考書,找到相關章節,理解並總結內容,然後將答案寫在試卷上。
  • 方法三、書上寫的跟考卷一樣嗎?
    • 對於每一道題目,都查閱參考書並找到相關章節。在形成答案之前,你會將收集到的信息進行分類,區分哪些是正確的、哪些是錯誤的,哪些是模稜兩可的。然後,你會分別處理每種類型的信息,最終將整理和總結後的答案寫在試卷上。

這三種策略分別對應了三種不同的信息檢索和答案生成方式。第一種策略類似於人類憑藉自身知識儲備直接作答。第二種策略類似於傳統的檢索增強生成 (RAG) 技術。第三種策略則對應著本文將要介紹的 糾正性 RAG 模型 (CRAG)。

1.2 傳統 RAG 的技術瓶頸:相關性低與資訊冗餘問題

傳統的檢索增強生成(RAG)技術雖然強大,但也面臨著兩大挑戰:

  1. 資訊相關性低: 就像一個學生在考試時胡亂翻書,卻沒有找到真正有用的內容。
  2. 資訊雜亂無章: 想像一下,如果你的參考書是一本雜亂無章的大雜燴,你能找到準確的答案嗎?

這些問題導致AI有時會生成看似合理,實則錯誤的"幻覺"內容。

1.3 CRAG 的核心機制:突破傳統 RAG 的限制

鑑於檢索增強生成,在檢索資訊過程中存在些局限性,可能會導致後續生成內容的真實性以及品質。以下是作者整理出的局限性重點,並且用圖表表達之。

結構圖

問題一、檢索資訊的相關性過低

傳統的 RAG 方法往往沒有充分考慮檢索到的文件與問題之間的相關性,而是將所有檢索到的文件簡單地合併在一起,作為生成模型的輸入。這會導致大量無關信息的引入,進而影響生成模型對知識的理解,並可能導致模型生成與事實不符的"幻覺"內容。

問題二、資訊過於雜亂,不夠精準

傳統的 RAG 方法通常將整個檢索到的文件作為輸入,但實際上,文件中的大部分內容可能與生成的內容無關。這些冗餘信息不僅會增加模型的計算負擔,還會影響模型對關鍵資訊的提取和利用。

1.3. CRAG 提出什麼機制解決問題?

CRAG 提出傳統 RAG 會有檢索資訊品質不夠好問題,導致生成答案錯誤。為此 CRAG 作者群提出 Retrieval Evaluator(檢索評估器) 以及 Knowledge Refinement(知識精練) 兩個機制來解決上述問題。以下是兩者的運作機制:

img
取自論文 Figure2

Retrieval Evaluator(檢索評估器):

用於評估針對特定問題檢索到的文件的整體品質。它還會利用網路搜索作為輔助工具,進一步提升檢索結果的品質。
評估答案分為「正確」(correct)、「模糊」(Ambiguous)、「錯誤」(Incorrect)三種情況。對於「正確」的情況,直接進行知識精練,抽取關鍵資訊。針對「錯誤」的資訊,則利用網路檢索來擴充知識量。針對「模糊」的知識,結合前面兩種操作來提供答案的穩健性及精準度。

Knowledge Refinement(知識精練)::知識分解與重組的精細化處理

先將文件進行分解再重新組合,以便深入挖掘文件中的核心知識點。
利用自訂規則將文件進行分解,並由檢索評估器來衡量其相關性。最後將剩餘的相關知識重新整合。

1.3.1 Retrieval Evaluator:基於 T5-large 的檢索質量評估模型

檢索評估器可以被視為一個評分分類模型。該模型用於確定查詢與文件之間的相關性,類似於 RAG 中的重新排序(re-ranking)模型。
這種相關性判斷模型可以通過整合更多符合現實世界場景的特徵來進行改進。例如,科學論文問答中的 RAG 包含許多專業術語,而旅遊領域的 RAG 則往往包含更多口語化的用戶查詢。
CRAG 使用一個輕量級的 T5-large 模型作為檢索評估器,並對其進行了微調。值得一提的是,即使在大語言模型的時代,T5-large 模型仍然被認為是輕量級的。
對於每個輸入的問題,CRAG 通常會檢索十個相關的文件。然後,系統會將問題與每個文件分別組合在一起,作為輸入數據,讓 T5-large 模型預測它們之間的相關性。在微調過程中,模型會將標籤 1 分配給正樣本(與問題相關的文件),將標籤 -1 分配給負樣本(與問題無關的文件)。在推理過程中,評估器會為每個文件分配一個介於 -1 到 1 之間的相關性分數。

1.3.2 Knowledge Refinement:知識分解與重組的精細化處理

CRAG 設計了一種新穎的知識提取方法,即先將文檔分解再重新組合,以便深入挖掘文檔中的核心知識點。
首先,利用一系列規則將文檔細分為較小的知識單元,目的是獲取更精細的知識點。如果檢索到的文檔僅包含一句或兩句話,則將其視為一個整體。如果文檔較長,則根據其總長度進一步細分為包含數個句子的小單元,每個單元都應包含一個完整的信息點。
然後,利用檢索評估器為每個知識單元計算相關性評分,篩除那些評分較低的單元。剩下的、評分較高的知識單元將被重新組合,構建成完整的內部知識體系。

2 從理論到實踐:使用LangGraph實現CRAG

在前面的章節中,我們深入探討了CRAG(Contextual Retrieval-Augmented Generation,上下文檢索增強生成)的概念、原理和優勢。CRAG作為一種先進的資訊檢索和生成技術,透過將上下文相關的檢索結果與大型語言模型(LLM)的生成能力相結合,大幅提升了AI系統回答問題和完成任務的準確性和相關性。

首圖

現在,讓我們將理論付諸實踐。為了更好地理解CRAG的運作原理並展示其實際應用,我們將使用LangGraph框架來實作一個基於CRAG的問答系統。LangGraph是一個強大的工具,它允許我們以圖的形式建構複雜的語言處理工作流程,非常適合實現CRAG這樣的高階AI技術。

讓我們一步步來看如何使用 LangGraph 實作 CRAG 系統。

在接下來的部分中,我們將:

  1. 設置必要的環境和相依套件
  2. 建構一個向量資料庫作為我們的知識來源
  3. 創建各種節點函數,如文件檢索、問題分類、答案生成等
  4. 使用LangGraph建構一個完整的CRAG工作流程
  5. 視覺化我們的CRAG圖並與之互動

2.1 建立向量資料庫

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()

2.2 定義關鍵組件

CRAG 系統需要多個組件來處理不同的任務。以下是一些關鍵組件:

2.2.1 問題相關性評分器

這個組件評估問題是否與我們的知識領域(此例中為鼎泰豐)相關:

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

img

2.2.2 文件相關性評分器

這個組件評估檢索到的文件是否與問題相關:

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

img

2.2.3 問題重寫器

這個組件將用戶的原始問題轉化為更適合檢索的形式:

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()

img

2.2.4 問答 Agent

這個組件根據檢索到的文件回答問題:

template = """Answer the question based only on the following context:
    {context}

    Question: {question}
    """

prompt = ChatPromptTemplate.from_template(
    template=template,
)
generation = prompt | llm | StrOutputParser()

img

2.3 構建 LangGraph 工作流

現在,我們使用 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 的核心功能。

2.4 視覺化與互動

最後,我們可以視覺化整個 CRAG 工作流,並與之互動:

from IPython.display import Image, display

try:
    display(Image(app.get_graph(xray=True).draw_mermaid_png()))
except:
    pass

img

# 互動示例
result = app.invoke({"question": "鼎泰豐有賣湯包嗎?"})
print(result["llm_output"])

img

通過這個實作,我們看到了如何使用 LangGraph 構建一個完整的 CRAG 系統。這個系統能夠智能地處理用戶查詢,根據問題的相關性和檢索到的文件質量動態調整處理流程,最終提供準確且相關的回答。

這種方法不僅展示了 CRAG 的強大功能,也體現了 LangGraph 在構建複雜 AI 工作流方面的靈活性和效率。通過這樣的實作,我們可以更深入地理解 CRAG 的工作原理,並探索其在實際應用中的潛力。

結論

Corrective RAG (CRAG) 技術是一種創新的方法,旨在提升大型語言模型(LLM)在問答系統中的準確性和可靠性。CRAG 通過引入「檢索評估器」和「知識精練」兩個核心機制,有效解決了傳統檢索增強生成(RAG)模型中常見的資訊相關性低和資訊雜亂無章等問題。
CRAG 的工作原理包括:

  • 使用檢索評估器對檢索到的文件進行相關性評估。
  • 通過知識精練機制對文件進行分解和重組,提取核心知識點。
  • 結合網路搜索來擴充和驗證知識,提高回答的準確性。

在實際應用中,CRAG 可以通過 LangGraph 框架來實現,該框架允許以圖的形式構建複雜的語言處理工作流程。實現步驟包括建立向量資料庫、定義關鍵組件(如問題相關性評分器、文件相關性評分器、問題重寫器和問答Agent),以及構建完整的 CRAG 工作流。

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

  1. CRAG論文連結
  2. CRAG 官方實現 Repo

上一篇
【Day 21】- 從基礎到進階: 掌握RAG基礎並使用LangGraph實現Agentic RAG
下一篇
【Day 23】- Adaptive-RAG:動態檢索策略提高系統問答精準度
系列文
2024 年用 LangGraph 從零開始實現 Agentic AI System31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言