iT邦幫忙

2024 iThome 鐵人賽

DAY 13
1
生成式 AI

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

【Day 13】- 進階 LLM 反思機制:Reflexion 技術的創新與應用

  • 分享至 

  • xImage
  •  

摘要
這篇文章探討了大型語言模型(LLM)領域中的反思機制,特別是新興的 Reflexion 技術。它首先回顧了先前 Self-Refine 技術的局限性,例如缺乏長期記憶、推理深度有限以及任務適應性不足。然後,文章介紹了 Reflexion 技術,它透過引入記憶機制、多步推理能力和動態任務適應來克服 Self-Refine 的不足。文章也分析了傳統強化學習方法的缺點,例如需要大量的訓練樣本和昂貴的模型微調。Reflexion 則透過語言強化學習的方式,減少了對上下文依賴,並改進了泛化能力。文章接著詳細解說了 Reflexion 的核心架構,包括執行者(Actor)、評估者(Evaluator)、自我反思(Self-reflection)和記憶(Memory)。最後,文章以一個實際的氣候變化文章撰寫範例,展示 Reflexion 如何讓 AI 從錯誤中學習並持續改進,並提供了程式碼解析和 LangGraph 中的實際應用範例。 文章強調 Reflexion 的重要性,因为它是一個創新的技術突破,能讓 AI 具有自我評估和改進的能力,朝向更自主、更智能的 AI 系統邁進。

引言:

在我們先前探討的 LLM 自我優化基礎技術 Self-Refine 中,我們了解到大型語言模型(LLM)如何通過簡單的反思-生成循環來提升其輸出品質。Self-Refine 技術展示了 LLM 自我完善的初步能力,為更複雜的反思機制奠定了基礎。然而,隨著 AI 技術的快速發展,研究者們發現了更進階的方法來增強 LLM 的自我反思能力。這就是我們今天要深入探討的 Reflexion(NIPS’23)想法與實作。

img

1. 從 Self-Refine 到 Reflexion:反思機制的進化

1.1 Self-Refine 的局限性:單一循環的困境

Self-Refine 技術主要依賴於單一的反思-生成循環,其中 LLM 生成內容,然後對該內容進行評估和改進。這種方法雖然有效,但存在一些局限性:

  1. 缺乏長期記憶:每次反思都僅基於當前的輸出,無法利用之前的經驗。
  2. 推理深度有限:單一循環難以處理需要多步推理的複雜任務。
  3. 任務適應性不足:對於不同類型的任務,反思策略較為固定。

1.2 Reflexion 的三大核心優勢

Reflexion 技術在 Self-Refine 的基礎上進行了重大創新,以克服這些限制:

  1. 引入記憶機制:Reflexion 實現了長期記憶,使 LLM 能夠從過去的經驗中學習並應用到新的任務中。
  2. 多步推理能力:Reflexion 支持更複雜的多步驟推理過程,能夠處理需要深度思考的任務。
  3. 動態任務適應:Reflexion 能夠根據不同任務的特性動態調整其反思策略,提高了模型的靈活性和適應能力。

重點提示:Reflexion 是一種創新的「口語式強化學習」方法,它讓 AI 代理(agent)能夠通過語言反饋來強化自身,而不是傳統的權重更新。

2. Reflexion 想解決的問題:AI 代理的根本挑戰

在構建真正智能的 AI 代理時,研究者們仍然面臨著一些根本性的挑戰。傳統的強化學習方法需要大量的訓練樣本和昂貴的模型微調,這對於目標驅動的語言代理(Language Agents)來說是一個重大挑戰。

2.1 傳統方法的瓶頸:大量樣本與昂貴微調的困擾

傳統的 AI 訓練方法,尤其是在強化學習領域,面臨著幾個主要的瓶頸:

  1. 數據需求龐大:
    • 傳統方法通常需要海量的訓練樣本才能使 AI 代理學會複雜任務。
    • 這不僅耗時耗力,還可能面臨數據獲取和隱私問題。
  2. 計算成本高昂:
    • 大規模模型的訓練和微調需要強大的計算資源。
    • 高昂的 GPU 使用成本限制了許多研究者和小型組織的實驗能力。
  3. 微調過程複雜:
    • 對 LLM 進行微調是一個精細而複雜的過程。
    • 不當的微調可能導致模型性能下降或出現意外行為。
  4. 泛化能力受限:
    • 即使經過大量訓練,AI 代理仍可能在面對新情況時表現不佳。
    • 缺乏真正的理解和推理能力,導致學習效果難以遷移到新任務。

總結來說,該論文主要想解決兩個問題:

  1. 近期 LLM 搭建的 Agent 方法,多依賴於當前上下文來指導 LLM 產生模型。
  2. 強化學習方法主要依賴於更新模型權重來學習,LLM 更新需花費大量時間。

2.2 提出解法:改變依賴與學習方式

為克服現有方法的局限性,研究者提出了名為 Reflexion 的創新框架。這一框架通過語言強化學習(verbal reinforcement)協助 AI 代理從失敗中汲取經驗,實現持續進步。

  1. 減少上下文依賴:

    • Reflexion 不僅依賴當前上下文,還引入了長期記憶機制。
    • 通過儲存和利用過往經驗,AI 代理能夠做出更明智的決策。
  2. 語言化的強化學習:

    • 不再依賴傳統的權重更新,Reflexion 採用語言形式的反饋。
    • 這種方法更接近人類的學習方式,能夠捕捉複雜的語義信息。
  3. 提升泛化能力:

    • 通過語言化的學習過程,Reflexion 幫助 AI 代理建立更深層的理解。
    • 這種理解能力可以更好地遷移到新的任務和場景中。

補上 Figure 2

3. Reflexion 的核心架構

在深入探討 Reflexion 如何突破傳統 AI 代理的限制後,我們現在轉向其核心架構的解析。Reflexion 的獨特之處不僅在於其創新的學習方法,更在於其精心設計的系統結構。這個架構巧妙地整合了執行、評估、反思和記憶四個關鍵元素,形成了一個自我完善的閉環系統。通過理解這個架構,我們可以更清楚地看到 Reflexion 如何實現其革命性的功能,以及它為什麼能夠如此有效地解決 AI 代理面臨的根本挑戰。

3.1 四大關鍵組件:Actor、Evaluator、Self-reflection 和 Memory

Reflexion 框架的魅力在於其四個緊密協作的核心組件:Actor、Evaluator、Self-reflection 和 Memory。這些組件共同構成了一個能夠自我完善的 AI 系統。

img

讓我們深入了解Reflexion 框架由四個主要組件的功能和重要性::

  1. Actor(執行者):
  • Actor 是 Reflexion 系統的主要執行單元,可以將其視為 AI 的「行動中樞」。通常由一個強大的大型語言模型(如 GPT-3 或 GPT-4)擔任,Actor 負責解釋任務指令、制定策略並生成實際輸出。
  1. Evaluator(評估者):
  • Evaluator 負責客觀評估 Actor 的輸出。這個組件可能是另一個 AI 模型,也可能是一套預定義的評估規則,甚至可以包含人類反饋。
  1. Self-reflection(自我反思):
  • Self-reflection 是 Reflexion 系統的「內省中心」,它賦予了 AI 自我分析和改進的能力。這個組件通常是一個專門用於反思的 LLM 實例。
  1. Memory(記憶):
  • Memory 組件就像 AI 的「經驗庫」,它儲存和管理系統的短期和長期記憶。這不僅僅是簡單的資料存儲,而是一個複雜的知識管理系統。

這四個組件緊密協作,形成了一個自我完善的認知循環。Actor 執行任務,Evaluator 評估表現,Self-reflection 分析並提出改進策略,而 Memory 則確保所有這些經驗和學習成果都被妥善保存和利用。通過這種方式,Reflexion 系統能夠不斷學習和進化,逐步提升其處理複雜任務的能力。

4. 實例說明:AI 從失敗中學習

讓我們來看看 Reflexion 是如何工作的。想像執行者接到一個任務,比如「寫一篇關於氣候變化的文章」。執行者會先根據自己的知識完成任務。接著,評估者會檢查這篇文章,給出評分和反饋,例如「文章結構不錯,但缺乏具體數據支持」。

這時,自我反思模型就派上用場了。它會分析評估結果,思考「我需要加入更多具體數據來支持論點」。這些反思會被存儲為長期記憶,供未來任務使用。下次執行者再遇到類似任務時,就會想起這個教訓,主動搜索和引用相關統計數據。

4.1 代碼解析:Reflexion 框架的實際應用

我們會先解析關鍵程式碼,然後通過實戰演練,一步步指導您如何實現 AI 的自我反思能力。

4.1.1 執行者 (Actor) 的實現

執行者是 Reflexion 架構的核心,負責生成初始回應、進行自我反思,並基於反思結果改進輸出。在程式碼中,這主要通過 ResponderWithRetries 類別來實現:

class ResponderWithRetries:
    def __init__(self, runnable, validator):
        self.runnable = runnable
        self.validator = validator

    def respond(self, state: State):
        messages = state['messages']
        for attempt in range(3):
            response = self.runnable.invoke(
                {"messages": messages}, {"tags": [f"attempt:{attempt}"]}
            )
            try:
                self.validator.invoke(response)
                return {"messages": messages + [response]}
            except ValidationError as e:
                messages = messages + [
                    response,
                    ToolMessage(
                        content=f"{repr(e)}\n\n請仔細檢查函數架構。\n\n"
                        + self.validator.schema_json()
                        + " 請修正所有驗證錯誤後重新回應。",
                        tool_call_id=response.tool_calls[0]["id"],
                    ),
                ]
        return {"messages": messages}

說明:

  1. 如果生成的回應通過驗證,就返回更新後的消息列表。
  2. 如果驗證失敗,會將錯誤信息添加到消息列表中,並重試。
  3. 這種設計確保了生成的回應符合預定義的結構和品質標準。

4.1.2 反思機制的實現

反思機制主要通過定義特定的輸出結構來實現,如 ReflectionAnswerQuestion 類別:

class Reflection(BaseModel):
    missing: str = Field(description="對缺失內容的批評。")
    superfluous: str = Field(description="對多餘內容的批評")

class AnswerQuestion(BaseModel):
    answer: str = Field(description="約 250 字的詳細回答。")
    reflection: Reflection = Field(description="對初始答案的反思。")
    search_queries: list[str] = Field(
        description="1-3 個搜索查詢,用於研究改進當前答案的批評。"
    )

註解說明:

  1. Reflection 類別定義了反思的結構,包括對缺失和多餘內容的批評。
  2. AnswerQuestion 類別整合了答案、反思和搜索查詢,形成一個完整的回應結構。

4.1.3 修訂機制的實現

修訂機制通過 ReviseAnswer 類別來實現,它擴展了 AnswerQuestion 類別:

class ReviseAnswer(AnswerQuestion):
    references: list[str] = Field(
        description="支持你更新答案的引用。"
    )

4.2 LangGraph 中的 Reflexion 實作

現在,讓我們一步步實現一個具有自我反思能力的 AI 系統。

4.2.0 實現工具節點

在構建 Reflexion 圖之前,我們需要實現工具節點:

from langchain_core.tools import StructuredTool
from langgraph.prebuilt import ToolNode

def run_queries(search_queries: list[str], **kwargs):
    """執行生成的查詢。"""
    messages = state['messages']
    last_message = messages[-1]
    if isinstance(last_message, AIMessage):
        search_queries = last_message.additional_kwargs.get('function_call', {}).get('arguments', {}).get('search_queries', [])
        results = tavily_tool.batch([{"query": query} for query in search_queries])
        return {"messages": messages + [ToolMessage(content=str(results))]}
    return {"messages": messages}

tool_node = ToolNode(
    [
        StructuredTool.from_function(run_queries, name=AnswerQuestion.__name__),
        StructuredTool.from_function(run_queries, name=ReviseAnswer.__name__),
    ]
)

這個工具節點將負責執行搜索查詢,為 AI 提供額外的信息來源。

4.2.1 構建 Reflexion 圖

使用 LangGraph 構建 Reflexion 系統的工作流程:

from langgraph.graph import END, StateGraph, START

MAX_ITERATIONS = 1
builder = StateGraph(State)
builder.add_node("draft", first_responder.respond)
builder.add_node("execute_tools", tool_node)
builder.add_node("revise", revisor.respond)

builder.add_edge("draft", "execute_tools")
builder.add_edge("execute_tools", "revise")

def event_loop(state: State) -> Literal["execute_tools", "__end__"]:
    num_iterations = _get_num_iterations(state)
    if num_iterations > MAX_ITERATIONS:
        return END
    last_message = state['messages'][-1]
    if isinstance(last_message, AIMessage):
        return "execute_tools"
    return "revise"

builder.add_conditional_edges("revise", event_loop)
builder.add_edge(START, "draft")
graph = builder.compile()

上 Graph 結構圖

4.2.3 測試 Reflexion 系統

initial_state = State(messages=[HumanMessage(content="我們應該如何應對氣候危機?")])
events = graph.stream(initial_state, stream_mode="values")

print("Reflexion Agent 正在處理您的問題...\n")

for i, step in enumerate(events):
    print(f"步驟 {i + 1}:")
    print(step)
    if isinstance(step, dict) and 'messages' in step:
        last_message = step['messages'][-1]
        if not isinstance(last_message, AIMessage):
            step['messages'].append(AIMessage(content="處理中,準備下一步操作。"))
        step['messages'][-1].pretty_print()
    else:
        print("無法顯示此步驟的結果")
        step = {"messages": [AIMessage(content="無法處理當前步驟。")]}
    print("\n" + "="*50 + "\n")
    if i > MAX_ITERATIONS:
        print("已達到最大迭代次數,跳出循環。")
        break

上執行結果

5. 結語

通過深入探討 Reflexion 技術,從其理論基礎到 LangGraph 中的實際實現,我們見證了 AI 領域一個令人振奮的突破。Reflexion 不僅是一種技術創新,更代表了 AI 朝向真正自主學習和持續進化邁出的重要一步。

Reflexion 的核心價值:

  • 自我反思的突破:Reflexion 引入了 AI 自我評估和改進的能力,這是邁向更高級智能系統的關鍵。
  • 迭代優化的潛力:多輪的生成-反思-修改循環確保了輸出質量的持續提升,這對需要高度準確性的應用尤為重要。

在 LangGraph 的實現過程中,我們看到:

  • 結構化思考的重要性:通過定義明確的數據模型(如 Reflection 和 AnswerQuestion),我們為 AI 的輸出提供了清晰的框架。
  • 工具整合的價值:Tavily 搜索工具的整合展示了如何擴展 AI 的知識範圍,使其回答更加全面和最新。

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

X. 參考資料

  1. 參考程式碼

上一篇
【Day 12】- AI代理自我反思:深入探討 Self-Refine 技術與 LangGraph 實作
下一篇
【Day 14】- 翻譯革新:從吳恩達的 Translation Agent 到 LangGraph 的智能協作模式
系列文
2024 年用 LangGraph 從零開始實現 Agentic AI System31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言