前言
你有沒有遇過這樣的情境?
你想讓 AI 幫你完成一個任務,但任務太複雜,單一的 ChatGPT 對話沒辦法做好:
- 需要同時搜尋網路、分析資料、寫報告
- 不同步驟需要不同的「專業角色」
- 任務很長,單一 context window 放不下
CrewAI 就是為了解決這個問題而生的。它讓你可以建立一個由多個 AI Agent 組成的團隊,每個 Agent 有自己的角色、工具和目標,協作完成複雜任務。
什麼是 CrewAI?
CrewAI 是一個開源的 Python 框架,專門用來建立多 Agent 協作系統。
用一個類比來說:
傳統 LLM 呼叫:你問一個全才顧問所有問題
CrewAI:你僱用一個團隊——研究員、分析師、文案、專案經理——各司其職
CrewAI 的核心理念是角色扮演 + 任務分工:
- 每個 Agent 有明確的職責(role)、目標(goal)、背景故事(backstory)
- 任務按照依賴關係自動排序和傳遞
- Crew 負責協調整個流程
CrewAI vs 其他 Multi-Agent 框架
| 框架 | 特點 | 學習曲線 |
|---|---|---|
| CrewAI | 角色扮演導向,強調協作,設定直覺 | 低 |
| LangGraph | 圖形化流程,狀態機,彈性高 | 中高 |
| AutoGen | Microsoft 出品,對話式協作 | 中 |
| LangChain Agents | 工具豐富,但單 Agent | 中 |
CrewAI 的設計哲學:讓非工程師也能理解 Agent 的邏輯(因為你在描述一個「團隊」,而不是寫演算法)。
安裝與環境設定
1# 建立虛擬環境
2python -m venv crewai_env
3source crewai_env/bin/activate # Windows: crewai_env\Scripts\activate
4
5# 安裝 CrewAI(含常用工具)
6pip install crewai crewai-tools
7
8# 設定 API Key(CrewAI 預設使用 OpenAI)
9export OPENAI_API_KEY="your-api-key"
10
11# 如果要用 Anthropic Claude
12export ANTHROPIC_API_KEY="your-api-key"
建立第一個專案:
1crewai create crew my_first_crew
2cd my_first_crew
這會自動產生標準專案結構:
my_first_crew/
├── src/my_first_crew/
│ ├── config/
│ │ ├── agents.yaml ← 定義 Agent
│ │ └── tasks.yaml ← 定義 Task
│ ├── crew.py ← 組合 Crew
│ └── main.py ← 執行入口
└── pyproject.toml
核心元件詳解
元件 1:Agent(智能體)
Agent 是 CrewAI 的基本單位,代表一個有特定職責的 AI 角色。
三個必要屬性:
1from crewai import Agent
2from crewai_tools import SerperDevTool # Google 搜尋工具
3
4search_tool = SerperDevTool()
5
6researcher = Agent(
7 role="資深市場研究員", # 角色名稱(影響 LLM 的行為)
8 goal="找出目標市場的最新趨勢與競爭對手動態", # Agent 的個人目標
9 backstory="""你是一位有十年經驗的市場研究專家,
10 擅長從海量資訊中找出關鍵洞察。你特別注重數據的可靠性,
11 只引用可信來源,並以清晰的結構呈現研究結果。""",
12 tools=[search_tool], # 這個 Agent 可以用的工具
13 llm="gpt-4o", # 使用的 LLM 模型
14 verbose=True, # 開發時建議開啟,顯示思考過程
15 max_iter=10, # 最多嘗試 10 次
16 memory=True, # 啟用記憶功能
17)
為什麼 backstory 很重要?
backstory 不只是裝飾,它直接影響 LLM 的行為。一個有「謹慎的研究員」背景的 Agent 和一個「大膽的創業家」背景的 Agent,面對同樣的任務會給出非常不同的結果。
元件 2:Task(任務)
Task 定義了 Agent 要完成的具體工作。
1from crewai import Task
2
3research_task = Task(
4 description="""研究 {topic} 的市場現況。
5 具體需要找出:
6 1. 市場規模(如有數據請引用來源)
7 2. 前三名競爭對手及其核心優勢
8 3. 最近 6 個月的重要趨勢
9 4. 潛在市場機會""",
10
11 expected_output="""一份結構清晰的市場研究報告,包含:
12 - 市場規模概述(附數據來源)
13 - 競爭對手分析表格
14 - 趨勢摘要(3-5 個重點)
15 - 機會評估
16 格式:Markdown,長度約 800-1200 字""",
17
18 agent=researcher, # 指定由哪個 Agent 負責
19 # context=[previous_task], # 可以依賴其他 Task 的輸出
20 # output_file="report.md", # 可以直接輸出到檔案
21)
description 的撰寫技巧:
- 越具體越好,列出清單,明確說明需要什麼格式
- 使用
{topic}這類佔位符,在執行時動態替換 - 把「期望輸出」寫得越詳細,LLM 越不容易跑偏
元件 3:Crew(團隊)
Crew 把 Agents 和 Tasks 組合起來,定義協作模式。
1from crewai import Crew, Process
2
3crew = Crew(
4 agents=[researcher, analyst, writer], # 團隊成員
5 tasks=[research_task, analysis_task, writing_task], # 任務清單
6
7 process=Process.sequential, # 循序執行(任務一個接一個)
8 # process=Process.hierarchical, # 階層式(由 manager 分配)
9
10 verbose=True,
11 memory=True, # 讓 Crew 在任務間保留記憶
12)
13
14# 啟動執行(inputs 的值會替換 description 裡的 {佔位符})
15result = crew.kickoff(inputs={"topic": "台灣電動車市場"})
16print(result.raw)
兩種執行模式:
Sequential(循序):
Task 1 → Task 2 → Task 3 → 輸出
前一個 Task 的結果自動傳給下一個 Task
Hierarchical(階層):
Manager Agent 拆解目標
├── 分配給 Agent A
├── 分配給 Agent B
└── 彙整結果
適合更動態、需要判斷的場景
元件 4:Tool(工具)
Tool 是 Agent 可以呼叫的外部能力。CrewAI 內建許多工具,也可以自訂。
1from crewai_tools import (
2 SerperDevTool, # Google 搜尋
3 FileReadTool, # 讀取本地檔案
4 FileWriterTool, # 寫入檔案
5 ScrapeWebsiteTool, # 網頁爬取
6 PDFSearchTool, # PDF 內容搜尋
7 CSVSearchTool, # CSV 資料查詢
8 CodeInterpreterTool, # 執行 Python 程式碼
9)
10
11# 自訂工具
12from crewai.tools import tool
13
14@tool("台灣股市查詢工具")
15def get_stock_price(ticker: str) -> str:
16 """查詢台灣股票的即時價格。輸入股票代號(例如:2330)。"""
17 # 實際上會呼叫 API,這裡用 mock
18 prices = {"2330": 950, "2317": 120, "0050": 185}
19 price = prices.get(ticker, "找不到此股票代號")
20 return f"{ticker} 的即時股價:{price} 元"
21
22
23# 掛載工具給 Agent
24stock_analyst = Agent(
25 role="股票分析師",
26 goal="分析台灣股市動態",
27 backstory="有多年台股投資經驗的分析師",
28 tools=[get_stock_price, SerperDevTool()],
29)
第一個完整範例:自動內容研究與撰寫
這是一個可以直接執行的完整範例:自動研究一個主題,並產出一篇部落格文章草稿。
1import os
2from crewai import Agent, Task, Crew, Process
3from crewai_tools import SerperDevTool
4
5os.environ["OPENAI_API_KEY"] = "your-api-key"
6os.environ["SERPER_API_KEY"] = "your-serper-key" # serper.dev 免費額度
7
8search_tool = SerperDevTool()
9
10# ---- 定義 Agents ----
11
12researcher = Agent(
13 role="內容研究員",
14 goal="深入研究指定主題,收集最新、最精確的資訊",
15 backstory="""你是一位經驗豐富的內容研究員,擅長快速找到高品質的資訊。
16 你會從多個來源交叉驗證,確保資料的準確性。
17 你的研究報告結構清晰,重點突出。""",
18 tools=[search_tool],
19 verbose=True,
20 llm="gpt-4o-mini",
21)
22
23writer = Agent(
24 role="科技部落客",
25 goal="根據研究資料,撰寫吸引人且資訊豐富的部落格文章",
26 backstory="""你是一位擁有五年經驗的科技部落客,
27 擅長將複雜的技術概念用淺顯易懂的方式呈現。
28 你的文章既有深度,又不失趣味,讀者回饋極佳。
29 你會搭配具體例子,讓讀者容易理解。""",
30 verbose=True,
31 llm="gpt-4o",
32)
33
34editor = Agent(
35 role="資深編輯",
36 goal="審閱並優化文章,確保品質、準確性和可讀性",
37 backstory="""你是一位嚴謹的資深編輯,有豐富的科技媒體編輯經驗。
38 你會檢查事實準確性、邏輯連貫性、文字流暢度,
39 並給出具體的修改建議。""",
40 verbose=True,
41 llm="gpt-4o",
42)
43
44# ---- 定義 Tasks ----
45
46research_task = Task(
47 description="""請深入研究以下主題:{topic}
48
49 需要收集的資訊:
50 1. 最新發展動態(最近 3 個月內)
51 2. 核心技術原理(用非技術語言解釋)
52 3. 主要玩家和代表性產品
53 4. 實際應用案例(至少 2-3 個)
54 5. 未來發展趨勢
55
56 請附上資訊來源。""",
57
58 expected_output="""詳細的研究筆記,包含:
59 - 主題概述(200 字內)
60 - 最新動態清單(3-5 條,每條附來源連結)
61 - 技術原理說明(300 字內)
62 - 應用案例(各 100-200 字)
63 - 趨勢預測(3 點)
64 格式:Markdown""",
65
66 agent=researcher,
67)
68
69writing_task = Task(
70 description="""根據研究員提供的資料,撰寫一篇關於 {topic} 的部落格文章。
71
72 文章要求:
73 - 標題要吸睛,能引起好奇心
74 - 開頭要有一個引人入勝的問題或故事
75 - 內容要有邏輯層次(基礎 → 進階)
76 - 加入 2-3 個具體的應用案例
77 - 結尾要有行動呼籲(讀者下一步可以做什麼)
78 - 語氣:專業但親切,像在跟朋友解釋""",
79
80 expected_output="""一篇完整的部落格文章:
81 - 長度:1200-1800 字
82 - 有清晰的段落結構和小標題
83 - 格式:Markdown
84 - 包含一個「延伸閱讀」區塊""",
85
86 agent=writer,
87 context=[research_task], # 這個 Task 會收到 research_task 的輸出
88)
89
90editing_task = Task(
91 description="""審閱寫作者提交的文章,並給出具體的改進建議。
92
93 審閱重點:
94 1. 事實正確性(是否與研究資料一致?)
95 2. 邏輯連貫性(段落之間是否順暢?)
96 3. 讀者體驗(是否容易理解?)
97 4. 標題和副標題的吸引力
98 5. 錯別字和語法問題
99
100 如果文章整體良好,可以直接輸出最終版本。
101 如果需要修改,請提供修改後的完整版本。""",
102
103 expected_output="""最終版本的部落格文章(Markdown 格式),
104 以及一份簡短的編輯說明(說明做了哪些調整,或為何認為不需要調整)。""",
105
106 agent=editor,
107 context=[writing_task],
108)
109
110# ---- 建立 Crew 並執行 ----
111
112content_crew = Crew(
113 agents=[researcher, writer, editor],
114 tasks=[research_task, writing_task, editing_task],
115 process=Process.sequential,
116 verbose=True,
117)
118
119result = content_crew.kickoff(inputs={"topic": "AI Agent 在企業自動化的應用"})
120
121print("\n" + "="*60)
122print("最終輸出:")
123print("="*60)
124print(result.raw)
執行結果解讀
CrewAI 執行時,你會看到每個 Agent 的思考過程(verbose=True):
[2024-01-15 10:00:01][DEBUG]: Working Agent: 內容研究員
[2024-01-15 10:00:01][INFO]: Starting Task: 請深入研究以下主題:AI Agent...
> Entering new CrewAgentExecutor chain...
我需要搜尋最新的 AI Agent 企業應用資訊...
Action: Search the internet
Action Input: {"search_query": "AI Agent enterprise automation 2024"}
Observation: [搜尋結果...]
Thought: 找到了一些資訊,讓我再搜尋更具體的案例...
...
[2024-01-15 10:02:15][DEBUG]: [Task output]:
## AI Agent 企業應用研究筆記
...
[2024-01-15 10:02:15][DEBUG]: Working Agent: 科技部落客
...
最終輸出透過 result 物件取得:
1print(result.raw) # 原始文字輸出
2print(result.token_usage) # token 用量統計
小結
這篇介紹了:
- CrewAI 的核心概念:用多 Agent 協作解決複雜任務
- 四大元件:Agent(角色)、Task(任務)、Crew(團隊)、Tool(工具)
- 第一個完整範例:自動研究 + 撰寫 + 編輯的內容生成 Crew
下一篇我們會用三個更貼近真實工作場景的應用:競爭對手情報分析、自動化程式碼審查、以及客服需求分類系統,展示 CrewAI 如何解決實際業務問題。
系列導覽