摘要
這篇文章探討了大型語言模型(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)想法與實作。
Self-Refine 技術主要依賴於單一的反思-生成循環,其中 LLM 生成內容,然後對該內容進行評估和改進。這種方法雖然有效,但存在一些局限性:
Reflexion 技術在 Self-Refine 的基礎上進行了重大創新,以克服這些限制:
重點提示:Reflexion 是一種創新的「口語式強化學習」方法,它讓 AI 代理(agent)能夠通過語言反饋來強化自身,而不是傳統的權重更新。
在構建真正智能的 AI 代理時,研究者們仍然面臨著一些根本性的挑戰。傳統的強化學習方法需要大量的訓練樣本和昂貴的模型微調,這對於目標驅動的語言代理(Language Agents)來說是一個重大挑戰。
傳統的 AI 訓練方法,尤其是在強化學習領域,面臨著幾個主要的瓶頸:
總結來說,該論文主要想解決兩個問題:
為克服現有方法的局限性,研究者提出了名為 Reflexion 的創新框架。這一框架通過語言強化學習(verbal reinforcement)協助 AI 代理從失敗中汲取經驗,實現持續進步。
減少上下文依賴:
語言化的強化學習:
提升泛化能力:
在深入探討 Reflexion 如何突破傳統 AI 代理的限制後,我們現在轉向其核心架構的解析。Reflexion 的獨特之處不僅在於其創新的學習方法,更在於其精心設計的系統結構。這個架構巧妙地整合了執行、評估、反思和記憶四個關鍵元素,形成了一個自我完善的閉環系統。通過理解這個架構,我們可以更清楚地看到 Reflexion 如何實現其革命性的功能,以及它為什麼能夠如此有效地解決 AI 代理面臨的根本挑戰。
Reflexion 框架的魅力在於其四個緊密協作的核心組件:Actor、Evaluator、Self-reflection 和 Memory。這些組件共同構成了一個能夠自我完善的 AI 系統。
讓我們深入了解Reflexion 框架由四個主要組件的功能和重要性::
這四個組件緊密協作,形成了一個自我完善的認知循環。Actor 執行任務,Evaluator 評估表現,Self-reflection 分析並提出改進策略,而 Memory 則確保所有這些經驗和學習成果都被妥善保存和利用。通過這種方式,Reflexion 系統能夠不斷學習和進化,逐步提升其處理複雜任務的能力。
讓我們來看看 Reflexion 是如何工作的。想像執行者接到一個任務,比如「寫一篇關於氣候變化的文章」。執行者會先根據自己的知識完成任務。接著,評估者會檢查這篇文章,給出評分和反饋,例如「文章結構不錯,但缺乏具體數據支持」。
這時,自我反思模型就派上用場了。它會分析評估結果,思考「我需要加入更多具體數據來支持論點」。這些反思會被存儲為長期記憶,供未來任務使用。下次執行者再遇到類似任務時,就會想起這個教訓,主動搜索和引用相關統計數據。
我們會先解析關鍵程式碼,然後通過實戰演練,一步步指導您如何實現 AI 的自我反思能力。
執行者是 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}
說明:
反思機制主要通過定義特定的輸出結構來實現,如 Reflection
和 AnswerQuestion
類別:
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 個搜索查詢,用於研究改進當前答案的批評。"
)
註解說明:
修訂機制通過 ReviseAnswer
類別來實現,它擴展了 AnswerQuestion
類別:
class ReviseAnswer(AnswerQuestion):
references: list[str] = Field(
description="支持你更新答案的引用。"
)
現在,讓我們一步步實現一個具有自我反思能力的 AI 系統。
在構建 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 提供額外的信息來源。
使用 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()
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
通過深入探討 Reflexion 技術,從其理論基礎到 LangGraph 中的實際實現,我們見證了 AI 領域一個令人振奮的突破。Reflexion 不僅是一種技術創新,更代表了 AI 朝向真正自主學習和持續進化邁出的重要一步。
Reflexion 的核心價值:
在 LangGraph 的實現過程中,我們看到:
即刻前往教學程式碼 Repo,親自動手實作 Reflexion 的魅力吧!別忘了給專案按個星星並持續關注更新,讓我們一起探索AI代理的新境界。