DigiHouse
繁體中文

TECH ARTICLE · 7 MIN READ

Blog / DigiHouse

W13|CrewAI 多 Agent 協作工作流

W13 第三小時實作:像組一個小型編輯部一樣定義 Agent 角色、任務、交接與人工核准,完成可追蹤工作流。

本週完成成果

你會把一件複雜工作拆成不同角色與任務,例如資料整理員、分析員與文案編輯,並在關鍵交接點加入來源檢查與人工核准。

完成標準|個人程式能說明 Agent、Task、Crew;小組工作流有固定輸入、結構化輸出、來源限制、最大步數與人工核准,不允許 Agent 自動發布。

課前準備

步驟 1|確認第三小時邊界:本篇只延伸課綱指定 CrewAI 實作,不重製前兩小時 DLI 單元。

預期結果|Repo 只保存自己的工作流與公開安全測試資料。

步驟 2|小組:選一件兩人以上才有合理分工的事,例如整理三則公開活動、比較後寫一段摘要。

預期結果|若一個函式就能完成,不為了多 Agent 而硬拆。

步驟 3|Codespaces:安裝本週鎖定依賴並安全確認 GEMINI_API_KEY;工具不得讀取整個 Repo 或私人檔案。

bash
python -m pip install -r courseware/gs3073-b/requirements-week13.txt
python - <<'PY'
import os
print('key configured:', bool(os.getenv('GEMINI_API_KEY')))
PY

預期結果|CrewAI 可 import,且只顯示 key 是否存在,不輸出內容。

第三小時|個人技術實作

故事開始|辦校園市集時,一個人找攤位、一個人排流程、一個人寫公告。若三個人都以為別人會確認日期,最後公告可能寫錯。多 Agent 也需要清楚角色、交接格式和最後負責的人。

老師先問|Agent 越多是不是越聰明?不一定。每多一個 Agent,就多一次成本、誤解與錯誤傳遞;只有角色真的不同、交接能驗證時才值得拆分。

生活比喻|Crew 像一個編輯部,Agent 是不同職務,Task 是寫清楚的工作單,Process 是交件順序;總編輯的人工核准不能因為自動化而消失。

先看全程地圖|先看懂資料與決策怎麼移動,再開始操作。圖中的箭頭代表下一步,不代表可以跳過人工確認。

text
┌──────────┐ → ┌──────────┐ → ┌──────────┐
│ 公開安全輸入│   │ 整理 Agent│   │ 分析 Agent│
└──────────┘   └──────────┘   └────┬─────┘
                                    ↓
┌──────────┐ ← ┌──────────┐ ← ┌──────────┐
│ 人工核准  │   │ 草稿輸出  │   │ 編輯 Agent│
└──────────┘   └──────────┘   └──────────┘

步驟 4|個人:先用紙上角色卡寫清楚 role、goal、input、output、不能做什麼。

markdown
| Agent | Goal | Input | Output | 禁止事項 |
|---|---|---|---|---|
| 整理員 | 擷取原文重點 | 公開公告 | 含來源的 JSON | 不新增事實 |
| 編輯員 | 改寫成短文 | 已核對 JSON | 草稿 | 不發布 |

預期結果|每個角色有不同責任,禁止事項可被檢查。

步驟 5|個人:建立最小 CrewAI 骨架,先以 dry-run/教師指定模型測試。

python
from crewai import Agent, Crew, Process, Task

organizer = Agent(role='公告整理員', goal='只整理提供的公開文字', backstory='不新增原文沒有的事實')
task = Task(description='整理活動日期、地點與待確認事項:{announcement}', expected_output='含來源欄位的 JSON', agent=organizer)
crew = Crew(agents=[organizer], tasks=[task], process=Process.sequential)
print('agents:', len(crew.agents), 'tasks:', len(crew.tasks))

預期結果|week13_crew_basic.py 至少能建立一個 Agent 與 Task;若未呼叫模型也能檢查結構。

步驟 6|小組:加入第二角色,但用 JSON/Markdown 明確交接,不直接分享不受控的長對話。

預期結果|第二 Agent 的 input 只來自第一任務輸出與核准來源。

步驟 7|小組:加入人工核准點與最大重試次數,產出只寫到草稿檔。

python
if result_needs_review:
    save_draft(result)
    print("WAITING_FOR_HUMAN_REVIEW")
else:
    print("REJECTED: missing source")

預期結果|工作流不會寄信、發文、改 Repo main 或操作正式資料。

課堂收束|每組拿掉一個 Agent 再問:「結果會不會一樣?」如果會,代表角色可能多餘;如果不會,要能說清楚它提供的不同判斷與交接證據。

指定閱讀與課後作業

指定閱讀|依課綱完成個人 CrewAI 基礎腳本;Agent、Task、Crew、Process 與 Flows 的現行用法以 CrewAI 官方文件為準。

課後作業方向|個人提交 week13_crew_basic.py;小組在 feat-agent 分支完成市場分析與文案草稿工作流,附一分鐘 GIF 或文字執行證據及 README。

步驟 8|個人:加入第二個 Task,讓輸出格式包含 sources 與 needs_human_review。

預期結果|缺少來源時不生成可發布文字。

步驟 9|小組:提交 codes/agent 與 README,列出角色、成本、失敗與人工核准。

bash
git add week13_crew_basic.py codes/agent README.md
git commit -m 'W13: add bounded multi-agent draft workflow'
git push -u origin HEAD

預期結果|Repo 無 secrets;工作流只產生草稿,不執行外部發布。

驗收方式

bash
python week13_crew_basic.py
rg -n "human|人工|source|來源|禁止|draft" codes/agent README.md
git diff --check

通過條件|角色與任務不重複;交接格式固定;來源與最大重試可見;人工核准保留;沒有自動發布或秘密外洩。

應提交的 Repo 檔案

必交|week13_crew_basic.py、codes/agent/。只提交課綱指定成果與重現所需說明;不得提交 API key、個資、私人對話、未授權資料或大型模型檔。

常見問題與排除

問題 1|Agent 無限來回:限制 sequential 任務、最大步數與停止條件。

問題 2|輸出互相矛盾:保留每一階段原始輸出,讓人工判斷,不讓最後 Agent 靜默覆蓋。

問題 3|費用快速增加:先以一筆短輸入測試,記錄 token/呼叫數,再擴大。

引用資料

國立中央大學授課課綱/劉書銘老師,《劉書銘老師課程大綱_基礎模型與生成式人工智慧-更新版.pdf》;教師提供附件。用途:W1–W16 時段、實作主題、評量與交付物。

CrewAI,《CrewAI Documentation》;https://docs.crewai.com/;查閱日期:2026-08-04。用途:W13 Agent、Task、Crew、Process 與多 Agent 工作流。

Google AI for Developers,《Using Gemini API keys》;https://ai.google.dev/gemini-api/docs/api-key;查閱日期:2026-08-04。用途:Gemini Auth key、環境變數與金鑰安全規則。