- AI Agent 正從「被動回答問題」演進為「主動感知環境、規劃步驟、呼叫工具、自我反思」的自主系統,ReAct 框架將推理與行動交織,是當前最主流的 Agent 設計模式
- LangGraph 以有向圖狀態機為核心,提供最細粒度的控制能力,適合需要精確定義執行流程的生產級應用;CrewAI 以角色扮演與任務委派為核心,開發速度最快但靈活度較低
- AutoGen(現為 AG2)採用對話驅動的多代理架構,在需要代理之間深度協商的場景表現最佳,但學習曲線較陡且調試難度較高
- 本文附兩個完整 Google Colab 實作:使用 LangGraph 建構 ReAct 工具呼叫 Agent,以及使用 CrewAI 建構多 Agent 研究團隊,皆可一鍵執行
一、從聊天機器人到自主代理:AI Agent 的範式轉移
2023 年,大型語言模型(LLM)以驚人的速度滲透各行各業。然而,多數應用仍停留在「人類提問、AI 回答」的對話模式——本質上,這與傳統的搜尋引擎在使用範式上並無根本差異。真正的突破在於:當我們賦予 LLM 感知環境、規劃步驟、呼叫外部工具、並根據結果自我修正的能力時,它便從一個被動的語言模型,蛻變為一個自主的 AI 代理(Agent)[1]。
Wang 等人在 2024 年發表的綜述研究中[1],將 LLM-based Agent 定義為:以大型語言模型為認知核心,具備感知(Perception)、規劃(Planning)、行動(Action)與記憶(Memory)四大模組的自主系統。這個定義精準地捕捉了 Agent 與傳統 chatbot 的本質差異——Agent 不僅能回答問題,更能主動地與外部世界互動、完成多步驟任務。
從產業實踐的角度觀察,Agent 的價值在於它能夠將人類從重複性的認知勞動中解放出來。一個設計良好的 Agent 可以自主完成市場調研、資料分析、報告撰寫、程式碼生成等複合性任務——這些原本需要一位分析師花費數小時的工作,Agent 可以在數分鐘內完成。Park 等人的「生成式代理」研究[7]更進一步展示了 Agent 之間的社會互動能力,預示了多代理協作的巨大潛力。
然而,建構一個可靠的 AI Agent 並非僅僅是「將 LLM 接上幾個 API」這麼簡單。Agent 的核心挑戰在於:如何確保 LLM 在多步驟推理中保持一致性?如何優雅地處理工具呼叫的失敗與重試?如何在多個 Agent 之間協調資訊流與決策權?這些工程挑戰催生了一系列 Agent 開發框架的誕生,其中 LangGraph、CrewAI 與 AutoGen 是當前最具代表性的三個選擇。
二、Agent 架構核心:Perceive、Plan、Act、Reflect
在深入比較三大框架之前,我們必須先理解 AI Agent 的通用架構模式。無論使用哪個框架,一個完整的 Agent 系統都包含四個核心階段[1]:
2.1 感知(Perceive)
Agent 首先需要理解當前的任務環境。這包括:解析使用者的自然語言輸入、讀取外部資料來源(資料庫、API、文件)、獲取前幾輪對話的上下文記憶。感知模組的品質直接決定了 Agent 後續決策的準確度。
2.2 規劃(Plan)
這是 Agent 架構中最核心的環節。LLM 基於感知到的資訊,規劃出完成任務的步驟序列。Wei 等人提出的 Chain-of-Thought(CoT)推理[3]是規劃的基礎——透過逐步推理,LLM 能夠將複雜任務分解為可執行的子任務。而 Yao 等人的 ReAct 框架[2]則更進一步,將推理(Reasoning)與行動(Acting)交織在一起,形成「思考→行動→觀察→再思考」的迴圈。
ReAct 的核心洞見在於:LLM 不需要一次性規劃出所有步驟,而是可以在每一步行動之後,根據觀察到的結果動態調整後續規劃。這種「邊做邊想」的策略,大幅提升了 Agent 在不確定環境中的魯棒性。
2.3 行動(Act)
規劃完成後,Agent 需要實際執行行動。在 LLM-based Agent 的語境中,「行動」通常意味著呼叫外部工具(Tool Calling / Function Calling)。Qin 等人的研究[8]以及 Schick 等人提出的 Toolformer[9]系統性地探索了 LLM 學習使用工具的能力。典型的工具包括:搜尋引擎、計算器、程式碼執行器、資料庫查詢、API 呼叫等。
工具呼叫的關鍵挑戰在於:LLM 必須精確地產生工具所需的結構化輸入(例如 JSON 格式的函數參數),並正確地解析工具的回傳結果。Patil 等人的 Gorilla 研究[13]展示了透過微調提升 LLM 工具呼叫準確度的可行性。
2.4 反思(Reflect)
最後,一個成熟的 Agent 應該具備自我反思的能力。Shinn 等人提出的 Reflexion 框架[4],透過語言化的自我反饋機制,讓 Agent 能夠從失敗中學習,在後續嘗試中避免重複犯錯。這種「語言強化學習」的方法,不需要更新模型權重,僅透過提示工程即可實現,具有極高的工程實用性。
以下示意圖展示了一個典型的 ReAct Agent 執行流程:
使用者提問:「台積電 2025 年 Q4 營收是多少?與前一季相比成長了多少?」
[思考] 我需要查詢台積電的財務數據,先搜尋最新的營收報告。
[行動] 呼叫 search_tool("台積電 2025 Q4 營收報告")
[觀察] 搜尋結果顯示:台積電 2025 Q4 營收為 8,684 億新台幣。
[思考] 我已獲得 Q4 營收,現在需要 Q3 數據來計算成長率。
[行動] 呼叫 search_tool("台積電 2025 Q3 營收")
[觀察] 搜尋結果顯示:台積電 2025 Q3 營收為 7,596 億新台幣。
[思考] 現在我可以計算成長率:(8684 - 7596) / 7596 = 14.3%。
[行動] 呼叫 calculator(expression="(8684 - 7596) / 7596 * 100")
[觀察] 計算結果:14.32%
[最終回答] 台積電 2025 年 Q4 營收為 8,684 億新台幣,較 Q3 的 7,596 億成長約 14.3%。
三、LangGraph 深度解析:以圖為核心的狀態機架構
LangGraph 是 LangChain 團隊[10]推出的 Agent 編排框架,其設計哲學源自一個深刻的觀察:Agent 的執行流程本質上是一個有向圖(Directed Graph),其中節點(Node)代表計算步驟,邊(Edge)代表控制流轉。
3.1 核心架構:StateGraph
LangGraph 的核心抽象是 StateGraph——一個以共享狀態為中心的有向圖。每個節點是一個函數,接收當前狀態、執行計算、返回狀態更新。邊定義了節點之間的轉移邏輯,可以是無條件的(固定走向)或條件性的(根據狀態決定下一步)。
from langgraph.graph import StateGraph, START, END
from typing import TypedDict, Annotated
from operator import add
# 定義共享狀態結構
class AgentState(TypedDict):
messages: Annotated[list, add] # 訊息累加
next_action: str
# 建構圖
graph = StateGraph(AgentState)
# 新增節點
graph.add_node("reason", reasoning_node)
graph.add_node("act", action_node)
graph.add_node("observe", observation_node)
# 定義邊(控制流)
graph.add_edge(START, "reason")
graph.add_conditional_edges(
"reason",
should_continue, # 條件函數
{"continue": "act", "end": END}
)
graph.add_edge("act", "observe")
graph.add_edge("observe", "reason") # 回到推理節點
agent = graph.compile()
3.2 狀態管理與持久化
LangGraph 的一大優勢在於其內建的狀態管理機制。透過 Checkpointer,每一步的狀態都可以被持久化到資料庫(SQLite、PostgreSQL),使得 Agent 可以在中斷後從上次的狀態恢復執行。這對於長時間運行的任務至關重要。
此外,LangGraph 支援 Human-in-the-Loop 模式:在圖的特定節點設定斷點,暫停執行並等待人類審核,確認後再繼續。這對於涉及敏感操作(例如發送郵件、修改資料庫)的 Agent 尤為關鍵。
3.3 子圖與模組化
複雜的 Agent 系統可以透過子圖(Subgraph)實現模組化。例如,一個主圖負責整體任務協調,而「資料蒐集」「分析推理」「報告撰寫」各由獨立的子圖負責。子圖擁有自己的狀態空間,僅透過定義好的介面與主圖互動,實現了關注點分離。
3.4 適用場景
- 生產級應用:需要精確控制每一步執行邏輯的場景
- 有狀態的長對話:客服系統、互動式資料分析
- Human-in-the-Loop:涉及審核、確認、修正的工作流
- 可觀測性要求高:需要完整追蹤每一步決策的企業應用
四、CrewAI 深度解析:角色扮演的多代理協作
CrewAI[11]採用了截然不同的設計哲學:它不要求開發者定義圖結構或控制流,而是透過自然語言描述每個 Agent 的角色(Role)、目標(Goal)與背景故事(Backstory),讓框架自動協調 Agent 之間的協作。
4.1 核心抽象:Agent、Task、Crew
CrewAI 的三大核心概念直觀而優雅:
- Agent:定義一個具有特定角色、目標與工具的 AI 代理
- Task:定義一個具體任務,包括描述、預期輸出、以及負責執行的 Agent
- Crew:將多個 Agent 與 Task 組合成一個團隊,定義協作模式
from crewai import Agent, Task, Crew, Process
# 定義 Agent(角色扮演)
researcher = Agent(
role="資深市場研究員",
goal="蒐集並驗證特定產業的最新市場數據與趨勢",
backstory="你是一位擁有 15 年經驗的市場研究員,"
"擅長從多元資料來源中提取關鍵洞見。",
tools=[search_tool, scrape_tool],
verbose=True
)
analyst = Agent(
role="資料分析專家",
goal="對蒐集到的數據進行深度分析,找出隱藏的模式與機會",
backstory="你是一位量化分析師,具備統計學博士學位,"
"擅長將複雜數據轉化為可執行的商業建議。",
tools=[calculator_tool],
verbose=True
)
# 定義 Task
research_task = Task(
description="調查全球 AI Agent 市場在 2025 年的規模、"
"主要參與者與成長趨勢。",
expected_output="一份結構化的市場調研報告,包含數據來源。",
agent=researcher
)
# 組成 Crew
crew = Crew(
agents=[researcher, analyst],
tasks=[research_task, analysis_task],
process=Process.sequential,
verbose=True
)
4.2 流程模式
CrewAI 支援兩種主要的流程模式:
- Sequential(循序):Task 按照定義順序依次執行,前一個 Task 的輸出自動作為下一個 Task 的上下文輸入
- Hierarchical(階層):引入一個「經理 Agent」自動分配任務、驗證結果、決定是否需要重新執行
Hierarchical 模式借鑒了 MetaGPT[6]的組織架構思想——透過角色分工與層級管理來協調多 Agent 的行為,使其更接近真實團隊的運作方式。
4.3 內建工具生態
CrewAI 提供了豐富的內建工具套件(crewai-tools),包括網路搜尋、網頁爬取、PDF 讀取、程式碼執行等。開發者也可以輕鬆地自訂工具,只需繼承 BaseTool 類別並實作 _run 方法。
4.4 優勢與限制
優勢:
- 開發速度極快——幾十行程式碼即可建構一個多 Agent 系統
- 角色扮演的設計讓非工程師也能理解系統邏輯
- 內建的任務委派與結果驗證機制
限制:
- 缺乏對執行流程的精細控制(無法定義條件分支、迴圈等複雜邏輯)
- 狀態管理較為原始,不支援斷點恢復
- 在需要動態調整任務順序的場景中靈活度不足
五、AutoGen 深度解析:對話驅動的多代理框架
AutoGen(現已更名為 AG2)是由 Microsoft Research 團隊開發的多代理對話框架[5]。與 LangGraph 的圖結構和 CrewAI 的角色扮演不同,AutoGen 的核心設計原則是對話驅動:Agent 之間透過多輪對話來協商、辯論、分工與彙整結果。
5.1 核心概念:ConversableAgent
AutoGen 中所有 Agent 都繼承自 ConversableAgent——一個可以接收訊息、處理訊息、並回覆訊息的實體。最常用的兩種 Agent 類型為:
- AssistantAgent:由 LLM 驅動,可以推理、生成程式碼、呼叫函數
- UserProxyAgent:代表人類使用者,可自動執行 AssistantAgent 生成的程式碼,也可在關鍵節點請求人類輸入
from autogen import AssistantAgent, UserProxyAgent, config_list_from_json
# 設定 LLM
config_list = [{
"model": "gpt-4o",
"api_key": os.environ["OPENAI_API_KEY"]
}]
# 建立 AssistantAgent
assistant = AssistantAgent(
name="research_assistant",
llm_config={"config_list": config_list},
system_message="你是一位 AI 研究助理,擅長蒐集資料、"
"分析數據並撰寫結構化報告。"
)
# 建立 UserProxyAgent(自動執行程式碼)
user_proxy = UserProxyAgent(
name="user_proxy",
human_input_mode="NEVER", # 全自動模式
code_execution_config={
"work_dir": "workspace",
"use_docker": False
}
)
# 啟動對話
user_proxy.initiate_chat(
assistant,
message="請分析 AI Agent 市場的最新趨勢,"
"並用 Python 繪製成長曲線圖。"
)
5.2 群組聊天(GroupChat)
AutoGen 最強大的功能之一是 GroupChat——讓多個 Agent 在一個共享的對話空間中互動。GroupChatManager 負責決定每一輪由哪個 Agent 發言,可以基於規則、輪流制或 LLM 自動選擇。
from autogen import GroupChat, GroupChatManager
# 定義多個 Agent
researcher = AssistantAgent(name="researcher", ...)
coder = AssistantAgent(name="coder", ...)
critic = AssistantAgent(name="critic", ...)
# 組成群組聊天
groupchat = GroupChat(
agents=[user_proxy, researcher, coder, critic],
messages=[],
max_round=15,
speaker_selection_method="auto" # LLM 自動選擇發言者
)
manager = GroupChatManager(
groupchat=groupchat,
llm_config={"config_list": config_list}
)
# 啟動多 Agent 對話
user_proxy.initiate_chat(
manager,
message="設計一個自動蒐集並視覺化台灣股市資料的系統。"
)
5.3 程式碼執行與沙盒
AutoGen 的一大特色是內建的程式碼執行能力。AssistantAgent 可以生成 Python 程式碼,UserProxyAgent 自動在本地或 Docker 沙盒中執行。如果執行失敗,AssistantAgent 會自動修正程式碼並重試——這形成了一個「生成→執行→修正」的自動迭代迴圈。
5.4 優勢與限制
優勢:
- 最接近「真實團隊討論」的多 Agent 互動模式
- 內建程式碼執行與自動修正機制
- 靈活的群組聊天管理,支援動態選擇發言者
- Microsoft 生態系統整合度高
限制:
- 學習曲線陡峭——概念層級多(Agent、Chat、GroupChat、Manager 等)
- 調試困難——多 Agent 對話的軌跡難以追蹤與重現
- Token 消耗較高——Agent 之間的多輪對話會消耗大量 token
- 從 AutoGen 更名為 AG2 的過渡期,文件與社群資源較為分散
六、Hands-on Lab 1:使用 LangGraph 建構 ReAct 工具呼叫 Agent
本實作將引導你在 Google Colab 中從零建構一個 ReAct Agent。這個 Agent 能夠自主決定何時呼叫搜尋工具或計算器,遵循「思考→行動→觀察」的迴圈,直到找到最終答案。
環境需求:Google Colab(免費版即可),需自備 OpenAI API Key。
完整程式碼如下——可直接複製到 Colab 執行:
###############################################
# Hands-on Lab 1:LangGraph ReAct Agent
# 在 Colab 中一鍵執行
###############################################
# ── Cell 1:安裝套件 ──
# !pip install -q langgraph langchain-openai langchain-community tavily-python
# ── Cell 2:設定環境變數 ──
import os
from getpass import getpass
# 使用 getpass 安全輸入,不會顯示在 notebook 中
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass("請輸入你的 OpenAI API Key: ")
# Tavily 搜尋 API(免費版每月 1000 次)
if "TAVILY_API_KEY" not in os.environ:
os.environ["TAVILY_API_KEY"] = getpass("請輸入你的 Tavily API Key: ")
# ── Cell 3:定義工具 ──
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.tools import tool
# 搜尋工具
search_tool = TavilySearchResults(
max_results=3,
search_depth="basic",
include_answer=True
)
# 計算器工具
@tool
def calculator(expression: str) -> str:
"""計算數學表達式。輸入應為合法的 Python 數學運算式。
例如: '2 + 3 * 4' 或 '100 / 7'"""
try:
result = eval(expression, {"__builtins__": {}}, {})
return f"計算結果: {result}"
except Exception as e:
return f"計算錯誤: {e}"
tools = [search_tool, calculator]
print(f"已載入 {len(tools)} 個工具: {[t.name for t in tools]}")
# ── Cell 4:建構 ReAct Agent 圖 ──
from langgraph.graph import StateGraph, START, END
from langgraph.prebuilt import ToolNode
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
from typing import TypedDict, Annotated
from operator import add
# 定義狀態
class AgentState(TypedDict):
messages: Annotated[list, add]
# 初始化 LLM(綁定工具)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
llm_with_tools = llm.bind_tools(tools)
# 系統提示
SYSTEM_PROMPT = """你是一個專業的研究助理。你可以使用以下工具:
1. tavily_search_results_json:搜尋網路上的最新資訊
2. calculator:進行數學計算
請遵循以下規則:
- 需要事實資訊時,務必使用搜尋工具驗證
- 需要數值計算時,使用計算器確保精確
- 回答請使用繁體中文
- 在最終回答中說明你的推理過程"""
# 推理節點
def reasoning_node(state: AgentState):
messages = state["messages"]
# 確保系統提示在最前面
if not any(isinstance(m, SystemMessage) for m in messages):
messages = [SystemMessage(content=SYSTEM_PROMPT)] + messages
response = llm_with_tools.invoke(messages)
return {"messages": [response]}
# 判斷是否需要繼續呼叫工具
def should_continue(state: AgentState):
last_message = state["messages"][-1]
if hasattr(last_message, "tool_calls") and last_message.tool_calls:
return "tools"
return "end"
# 建構圖
workflow = StateGraph(AgentState)
# 新增節點
workflow.add_node("reason", reasoning_node)
workflow.add_node("tools", ToolNode(tools))
# 定義邊
workflow.add_edge(START, "reason")
workflow.add_conditional_edges(
"reason",
should_continue,
{"tools": "tools", "end": END}
)
workflow.add_edge("tools", "reason") # 工具結果送回推理節點
# 編譯
agent = workflow.compile()
print("ReAct Agent 圖已編譯完成!")
# ── Cell 5:視覺化 Agent 圖結構 ──
from IPython.display import Image, display
try:
display(Image(agent.get_graph().draw_mermaid_png()))
print("上圖展示了 ReAct Agent 的狀態機結構:")
print(" reason(推理)→ tools(工具呼叫)→ reason(再推理)→ ...")
except Exception:
# 如果 mermaid 渲染失敗,印出文字版
print(agent.get_graph().draw_ascii())
# ── Cell 6:執行 Agent ──
def run_agent(question: str):
"""執行 Agent 並印出完整的思考過程"""
print(f"\n{'='*60}")
print(f"問題:{question}")
print(f"{'='*60}\n")
inputs = {"messages": [HumanMessage(content=question)]}
step = 0
for event in agent.stream(inputs, stream_mode="values"):
last_msg = event["messages"][-1]
step += 1
if hasattr(last_msg, "tool_calls") and last_msg.tool_calls:
for tc in last_msg.tool_calls:
print(f"[步驟 {step}] 呼叫工具: {tc['name']}")
print(f" 參數: {tc['args']}")
elif hasattr(last_msg, "content") and last_msg.content:
msg_type = type(last_msg).__name__
if msg_type == "ToolMessage":
print(f"[步驟 {step}] 工具回傳: {last_msg.content[:200]}...")
elif msg_type == "AIMessage":
print(f"\n[最終回答]\n{last_msg.content}")
print(f"\n{'='*60}\n")
# 測試問題 1:需要搜尋的問題
run_agent("2025 年全球 AI 市場規模大約是多少美元?"
"如果以每年 35% 的速度成長,2028 年會達到多少?")
# 測試問題 2:純計算問題
run_agent("一家公司年營收 5 億美元,淨利率 12%,"
"本益比 25 倍,請計算其市值。")
# ── Cell 7:自訂問題 ──
# 你可以修改下方的問題,測試 Agent 的表現
# run_agent("你的問題")
print("Lab 1 完成!你已成功建構了一個 ReAct 工具呼叫 Agent。")
print("嘗試修改 Cell 7 中的問題,觀察 Agent 如何選擇工具。")
程式碼解說:
- Cell 1-2:安裝依賴並安全設定 API Key(使用
getpass,Key 不會顯示在 notebook 輸出中) - Cell 3:定義兩個工具——Tavily 網路搜尋與數學計算器。注意
calculator使用了安全的eval(限制了 builtins) - Cell 4:使用 LangGraph 的
StateGraph建構 ReAct 迴圈。核心在於should_continue函數——檢查 LLM 是否要呼叫工具,若是則進入工具節點,否則結束 - Cell 5:視覺化 Agent 的圖結構,你可以清楚看到「reason → tools → reason」的迴圈
- Cell 6:執行 Agent 並串流輸出每一步的思考過程與工具呼叫
七、Hands-on Lab 2:使用 CrewAI 建構多 Agent 研究團隊
本實作將建構一個由三個 Agent 組成的研究團隊:研究員負責蒐集資料、分析師負責數據分析、作家負責撰寫報告。三者以循序流程協作,自動完成一個完整的研究任務。
環境需求:Google Colab(免費版即可),需自備 OpenAI API Key。
完整程式碼如下——可直接複製到 Colab 執行:
###############################################
# Hands-on Lab 2:CrewAI 多 Agent 研究團隊
# 在 Colab 中一鍵執行
###############################################
# ── Cell 1:安裝套件 ──
# !pip install -q crewai crewai-tools
# ── Cell 2:設定環境變數 ──
import os
from getpass import getpass
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass("請輸入你的 OpenAI API Key: ")
# 設定模型(CrewAI 預設使用 GPT-4o)
os.environ["OPENAI_MODEL_NAME"] = "gpt-4o-mini"
print("環境設定完成!")
# ── Cell 3:定義工具 ──
from crewai_tools import SerperDevTool, WebsiteSearchTool
from crewai import Agent, Task, Crew, Process
from crewai_tools import tool as crewai_tool
# 自訂簡易搜尋工具(不需額外 API Key)
@crewai_tool("Web Search Tool")
def simple_search(query: str) -> str:
"""搜尋網路資訊。輸入搜尋關鍵字,回傳相關結果摘要。"""
# 在實際應用中,這裡會呼叫真正的搜尋 API
# 為了 Lab 演示,我們使用 LLM 模擬搜尋結果
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.3)
response = llm.invoke(
f"假設你是一個搜尋引擎,針對以下查詢提供 3 條相關的搜尋結果摘要"
f"(包含來源名稱與關鍵數據):\n\n查詢:{query}"
)
return response.content
@crewai_tool("Calculator Tool")
def calc_tool(expression: str) -> str:
"""計算數學表達式。例如: '100 * 1.35' 或 '500 / 7'"""
try:
result = eval(expression, {"__builtins__": {}}, {})
return f"計算結果: {result}"
except Exception as e:
return f"計算錯誤: {e}"
print("工具定義完成!")
# ── Cell 4:定義三個 Agent ──
# Agent 1:研究員
researcher = Agent(
role="資深產業研究員",
goal="針對指定主題蒐集最新、最權威的市場數據與產業趨勢",
backstory=(
"你是一位在頂級管理顧問公司工作了 15 年的產業研究員。"
"你的強項是從海量資訊中篩選出最具洞察力的數據點,"
"並能清楚區分一手來源與二手轉述。你重視數據的時效性,"
"偏好引用 2024-2026 年的最新研究。"
),
tools=[simple_search],
verbose=True,
allow_delegation=False
)
# Agent 2:分析師
analyst = Agent(
role="量化分析專家",
goal="對蒐集到的數據進行深度分析,找出隱藏模式、計算關鍵指標、"
"並產出可視化建議",
backstory=(
"你擁有統計學博士學位,曾在對沖基金擔任量化研究員。"
"你擅長從雜亂的數據中提取信號,能夠計算 CAGR、市場份額、"
"成長率等關鍵商業指標。你的分析總是附帶計算過程,"
"確保結論的可驗證性。"
),
tools=[calc_tool, simple_search],
verbose=True,
allow_delegation=False
)
# Agent 3:作家
writer = Agent(
role="技術內容策略師",
goal="將研究數據與分析結論整合為一份專業、易讀的繁體中文報告",
backstory=(
"你曾在 McKinsey 擔任資深編輯,專精於將複雜的技術分析"
"轉化為高階管理者可理解的策略報告。你的寫作風格簡潔有力,"
"善用類比與視覺化建議來傳達核心觀點。"
"你的報告一律使用繁體中文撰寫。"
),
tools=[],
verbose=True,
allow_delegation=False
)
print("三個 Agent 定義完成:研究員、分析師、作家")
# ── Cell 5:定義任務 ──
# 定義研究主題(你可以修改這裡!)
RESEARCH_TOPIC = "AI Agent 開發框架市場:LangGraph、CrewAI、AutoGen 的競爭格局與未來趨勢"
# Task 1:市場研究
research_task = Task(
description=(
f"針對以下主題進行全面的市場研究:\n\n"
f"主題:{RESEARCH_TOPIC}\n\n"
f"你需要調查並蒐集以下資訊:\n"
f"1. 各框架的 GitHub 星數、貢獻者數量、版本迭代頻率\n"
f"2. 各框架的主要企業用戶與使用案例\n"
f"3. 開發者社群的規模與活躍度\n"
f"4. 各框架的融資背景與商業化策略\n"
f"5. 2025-2026 年的重大更新與路線圖"
),
expected_output=(
"一份結構化的研究備忘錄,包含上述五個面向的具體數據,"
"每個數據點標註資料來源與日期。"
),
agent=researcher
)
# Task 2:數據分析
analysis_task = Task(
description=(
"基於研究員提供的數據,進行以下分析:\n\n"
"1. 計算各框架的年複合成長率(CAGR)——以 GitHub 星數為代理指標\n"
"2. 製作功能比較矩陣(控制粒度、學習曲線、多 Agent 支援等維度)\n"
"3. 分析各框架的技術護城河與潛在風險\n"
"4. 預測未來 12 個月的市場走向\n"
"5. 針對不同使用場景給出框架選擇建議"
),
expected_output=(
"一份包含定量分析結果的報告。包含計算過程、"
"比較表格、以及基於數據的策略建議。"
),
agent=analyst
)
# Task 3:報告撰寫
writing_task = Task(
description=(
"整合研究員與分析師的所有成果,撰寫一份完整的繁體中文分析報告。\n\n"
"報告結構:\n"
"1. 摘要(3-5 句話概述核心發現)\n"
"2. 市場概覽(規模、趨勢、主要參與者)\n"
"3. 框架深度比較(功能、效能、社群、商業化)\n"
"4. 決策建議(按使用場景推薦框架)\n"
"5. 風險提示與未來展望\n\n"
"要求:語言為繁體中文,風格專業但易讀,"
"關鍵數據以粗體標示,適當使用表格與列表。"
),
expected_output=(
"一份 800-1200 字的繁體中文專業分析報告,"
"包含摘要、正文、比較表格與策略建議。"
),
agent=writer
)
print("三個任務定義完成:研究 → 分析 → 撰寫")
# ── Cell 6:組裝 Crew 並執行 ──
crew = Crew(
agents=[researcher, analyst, writer],
tasks=[research_task, analysis_task, writing_task],
process=Process.sequential, # 循序執行
verbose=True
)
print("Crew 已組裝完成!開始執行多 Agent 協作...\n")
print("=" * 60)
# 執行!
result = crew.kickoff()
print("\n" + "=" * 60)
print("多 Agent 協作完成!")
print("=" * 60)
# ── Cell 7:顯示最終報告 ──
print("\n\n" + "=" * 60)
print("最終報告")
print("=" * 60 + "\n")
print(result.raw)
# ── Cell 8:檢視執行統計 ──
print("\n\n" + "=" * 60)
print("執行統計")
print("=" * 60)
# 檢視 Token 使用量
if hasattr(result, "token_usage"):
usage = result.token_usage
print(f"總 Token 消耗: {usage.total_tokens:,}")
print(f" - Prompt tokens: {usage.prompt_tokens:,}")
print(f" - Completion tokens: {usage.completion_tokens:,}")
# 檢視各 Task 的輸出
if hasattr(result, "tasks_output"):
for i, task_output in enumerate(result.tasks_output):
print(f"\nTask {i+1} ({['研究', '分析', '撰寫'][i]}):")
print(f" Agent: {task_output.agent}")
print(f" 輸出長度: {len(task_output.raw)} 字元")
print("\n\nLab 2 完成!")
print("你可以修改 Cell 5 中的 RESEARCH_TOPIC 變數,")
print("讓研究團隊針對不同主題產出報告。")
程式碼解說:
- Cell 1-2:安裝 CrewAI 套件並設定 API Key
- Cell 3:定義工具。為了降低 Lab 的進入門檻,我們使用 LLM 模擬搜尋結果,而非要求額外的搜尋 API Key。在實際專案中,建議替換為 Tavily 或 Serper 等真正的搜尋 API
- Cell 4:定義三個 Agent,每個都有獨特的角色、目標與背景故事。注意
allow_delegation=False可以防止 Agent 互相委派任務導致的無限迴圈 - Cell 5:定義三個循序任務。每個任務的
expected_output非常重要——它告訴 Agent 輸出的格式與品質要求 - Cell 6-8:組裝 Crew 並執行。
Process.sequential確保任務按順序執行。執行完成後可檢視 Token 使用量
進階挑戰:嘗試將 Process.sequential 改為 Process.hierarchical,觀察框架如何自動引入一個「經理 Agent」來協調任務分配。
八、決策框架:三大框架比較與選擇指南
在經過前面的深度分析與實作之後,我們現在可以系統性地比較三大框架,幫助你根據具體需求做出最適選擇。
8.1 綜合比較表
| 比較維度 | LangGraph | CrewAI | AutoGen (AG2) |
|---|---|---|---|
| 核心抽象 | 有向圖(StateGraph) | Agent + Task + Crew | ConversableAgent + GroupChat |
| 設計哲學 | 狀態機、圖計算 | 角色扮演、任務委派 | 對話驅動、多方協商 |
| 控制粒度 | 極高——可定義每條邊與條件 | 低——框架自動協調 | 中——可配置但不如圖直觀 |
| 學習曲線 | 中等——需理解圖與狀態概念 | 低——直覺的角色定義 | 高——概念層級多、API 複雜 |
| 多 Agent 支援 | 透過子圖實現 | 原生支援(Crew) | 原生支援(GroupChat) |
| 狀態管理 | 內建 Checkpointer,支援持久化 | 基本的上下文傳遞 | 對話歷史自動管理 |
| Human-in-the-Loop | 原生支援斷點與人類審核 | 有限支援 | 支援(human_input_mode) |
| 程式碼執行 | 需自行整合 | 透過工具支援 | 原生內建(Docker 沙盒) |
| 可觀測性 | 優秀——LangSmith 整合 | 基本的 verbose 日誌 | 中等——對話日誌 |
| 生態系統 | LangChain 生態(最豐富) | 獨立但快速成長 | Microsoft 生態系統 |
| 適合團隊 | 有經驗的後端工程師 | 快速原型開發團隊 | 研究導向團隊 |
| 生產就緒度 | 高 | 中 | 中 |
| 授權協議 | MIT | MIT | Apache 2.0(原)/ CC BY 4.0(AG2) |
8.2 場景導向選擇指南
根據你的具體使用場景,我們建議以下選擇策略:
選擇 LangGraph,如果你:
- 正在建構需要上線的生產級 Agent 應用
- 需要精確控制 Agent 的每一步決策邏輯
- 團隊已經熟悉 LangChain 生態系統
- 需要完善的可觀測性與錯誤追蹤
- 有 Human-in-the-Loop 的合規需求
選擇 CrewAI,如果你:
- 需要在一兩天內快速驗證一個多 Agent 的概念
- 團隊中有非工程師背景的成員需要理解系統邏輯
- 任務之間的流程是線性的(A→B→C)
- 希望用最少的程式碼量達到最大的效果
選擇 AutoGen(AG2),如果你:
- 場景涉及多個 Agent 之間的深度討論與協商
- 需要 Agent 自動生成並執行程式碼
- 團隊有研究背景,願意投入時間探索最佳配置
- 使用場景偏向實驗性質或學術研究
8.3 混合使用策略
在企業實踐中,我們經常建議客戶採用混合策略:使用 CrewAI 快速驗證概念(POC 階段),確認可行性後再用 LangGraph 重寫為生產級系統。對於需要程式碼生成與執行的子模組,可以嵌入 AutoGen 的程式碼執行能力。這種策略兼顧了開發速度與生產穩定性。
Xie 等人在 TravelPlanner 基準測試[12]中的發現也支持這一觀點:單一框架在所有場景中都表現最佳是不現實的,針對不同任務特性選擇最適合的工具組合,才是工程上的最優解。
九、結語與展望
AI Agent 開發正處於一個激動人心的轉折點。從單一的 ReAct 迴圈到多 Agent 協作系統,從簡單的工具呼叫到複雜的任務規劃與自我反思,Agent 的能力邊界正在以驚人的速度擴張。
然而,我們也必須正視當前的挑戰:
- 可靠性:即使是最先進的 LLM,在長序列推理中仍會出現幻覺與邏輯錯誤。生產級 Agent 需要嚴謹的護欄(guardrails)機制
- 成本:多 Agent 對話可能消耗大量 token,在高並發場景下的成本控制是一大挑戰
- 安全性:賦予 Agent 操作外部系統的能力(API 呼叫、程式碼執行、資料庫修改),意味著必須建立嚴格的權限控制與審計機制
- 可觀測性:當多個 Agent 在複雜的圖結構中互動時,理解「為什麼系統做了這個決定」變得極其困難
展望未來,我們看到幾個重要趨勢正在匯聚:
第一,Model Context Protocol(MCP)[15]的標準化。Anthropic 提出的 MCP 協議正在成為 Agent 與外部工具互動的通用標準,這將大幅降低工具整合的工程成本,並促進 Agent 生態系統的互通性。
第二,Agent 原生的基礎模型。未來的 LLM 將不再是被「套上」Agent 功能的語言模型,而是從預訓練階段就針對 Agent 場景最佳化——更好的工具呼叫準確度、更強的多步驟規劃能力、更低的幻覺率。
第三,框架的融合與標準化。目前三大框架各有所長但互不相容,未來可能出現更高層級的抽象,讓開發者可以在統一的介面下混用不同框架的優勢。
對於企業而言,現在正是佈局 Agent 技術的最佳時機。不需要等待「完美」的框架出現——選擇一個適合你當前需求的工具,開始動手建構,在實踐中累積經驗與資料集。我們在超智諮詢的經驗表明,最成功的 Agent 專案不是一步到位的,而是從簡單的 ReAct 工具呼叫開始,逐步擴展到多 Agent 協作,在每一步都驗證商業價值。
如果你的團隊正在評估 AI Agent 的導入方案,或在框架選擇上遇到困難,歡迎與我們聯繫。我們的博士研究團隊持續追蹤 Agent 技術的最新進展,能夠協助你從架構設計、框架選型到生產部署的每一個環節。