在 AI 應用開發的浪潮中,我們常常聽到兩個核心概念:Workflow 和 AI Agent。他們有非常相似的模式,新手剛入門時不太容易理解他們的區別,所以就想開啟這個主題。
本篇將深入探討這兩個概念的本質、優劣,以及為什麼企業級 Workflow 引擎能成為連接它們的關鍵橋樑。
如 Day02 - Workflow Orchestration 流程編排介紹 所提到的,Workflow 編排早就存在(像 BPMN、Airflow 這些),其使用重點是先定義好步驟與狀態,引擎負責依流程執行。
而新技術 AI Agent 也是跑 多步驟任務 (所以很像),但它是靠模型在執行時決定下一步,所以結果可能不同。這類系統在錯誤處理、重試、補償與流程及步驟的可觀測性上,還需要成熟的 Workflow 引擎來補強。
實務上兩者會搭配使用,所以往下看下去吧。
AI Agent(智慧代理)是一種能夠感知環境、做出決策、並採取行動的智慧系統。
在 OpenAI 的 Agent 框架中,一個 Agent 通常由以下部分組成:
// 傳統方式:寫死編碼規則
function decideCategory(message: string) {
if (message.includes('天氣') || message.includes('氣溫')) {
return 'weather';
}
if (message.includes('記帳') || message.includes('花費')) {
return 'ledger';
}
return 'chat';
}
// AI Agent 方式:理解語義
const agent = new Agent({
instructions: `判斷使用者意圖:
- 天氣相關 → weather
- 財務相關 → ledger
- 其他 → chat`
});
const intent = await run(agent, userMessage);
// 能理解:「今天會冷嗎?」→ weather
// 能理解:「昨天買了什麼」→ ledger
AI Agent 可以根據上下文調整行為:
現代 AI Agent(如 OpenAI Agents)支援 Function Calling:
const agent = new Agent({
name: 'Weather Assistant',
tools: [
{
name: 'get_weather',
description: '獲取指定城市的天氣',
parameters: { city: 'string' }
}
]
});
// Agent 會自動判斷何時需要呼叫工具
// AI 呼叫可能失敗
try {
const reply = await agent.run(userMessage);
} catch (error) {
// Rate limit、網路錯誤、模型過載...
// 需要手動處理重試邏輯
}
AI Agent 本身不負責:
// 同樣的輸入,可能產生不同的輸出
const result1 = await agent.run('記帳100元');
// → "已記錄支出 100 元"
const result2 = await agent.run('記帳100元');
// → "好的,已記錄 100 元的支出"
// 內容相同但文字不同 → 難以做精確的業務判斷
維度 | Workflow | AI Agent |
---|---|---|
核心能力 | 可靠的協調與執行 | 智慧的理解與決策 |
適合場景 | 固定流程、狀態管理 | 語義理解、動態推理 |
確定性 | 高(可重放) | 低(每次可能不同) |
可靠性 | 高(自動重試) | 低(需要手動處理) |
靈活性 | 低(需要編碼) | 高(自然語言即可) |
想像一個指揮系統:
// Workflow 是協調者
async function chatSessionWorkflow() {
// 1. Workflow 接收使用者訊息
const userMessage = await waitForMessage();
// 2. 委派 AI Agent 分析意圖
const intent = await activities.analyzeIntent(userMessage);
// 3. Workflow 根據意圖決定流程
switch (intent) {
case 'weather':
// 4. 再次委派 AI Agent 處理天氣查詢
const weather = await activities.getWeatherInfo(userMessage);
await activities.saveMessage(weather);
break;
case 'ledger':
// 5. 複雜的記帳流程(AI + 確定性邏輯)
const proposal = await activities.parseLedgerProposal(userMessage);
// Workflow 負責確保記帳的原子性和可靠性
await activities.saveLedger(proposal);
await activities.sendConfirmation();
break;
}
}
假設使用者說:「昨天中午買了午餐花了 120 元」
async function handleLedger(message: string) {
// 1. AI 解析
const parsed = await agent.parse(message);
// parsed = { date: '昨天', item: '午餐', amount: 120 }
// 2. 保存到資料庫
await db.insert(parsed); // ❌ 如果這裡崩潰怎麼辦?
// 3. 發送確認
await sendNotification(parsed); // ❌ 重試時會重複記帳
}
問題:
async function ledgerWorkflow(message: string) {
// 1. 持久化使用者原始訊息
await activities.saveUserMessage(message);
// 2. AI 解析(Activity 自動重試)
const parsed = await activities.parseLedgerProposal(message);
// 如果 AI 失敗,自動重試;成功後狀態自動保存
// 3. 保存記帳(Activity 確保冪等性)
await activities.saveLedger(parsed);
// 即使崩潰,重啟後會從這裡繼續
// 4. 發送確認
await activities.sendConfirmation(parsed);
// 所有步驟都有完整的執行記錄
}
優勢:
傳統架構的痛點:
// 需要多個服務協作
await messageQueue.publish('parse-ledger', { userId, message });
// 等待回呼...
messageQueue.subscribe('ledger-parsed', async (data) => {
await db.saveLedger(data);
// 再等待回呼...
messageQueue.publish('send-confirmation', { userId });
});
// 業務邏輯分散在多個地方,難以理解和維護
以 Workflow 引擎的方式:
// 業務邏輯清晰可見
async function ledgerWorkflow(userId: string, message: string) {
const parsed = await activities.parseLedger(message);
await activities.saveLedger(parsed);
await activities.sendConfirmation(userId);
}
// 像寫同步程式碼一樣,但具備分散式系統的可靠性保證
// 設定 Activity 重試策略
const activities = proxyActivities<ChatActivities>({
startToCloseTimeout: '1 minute',
retry: {
maximumAttempts: 5, // 最多重試 5 次
backoffCoefficient: 2, // 指數退避
initialInterval: '1s', // 初始間隔 1 秒
}
});
// AI 呼叫失敗?自動重試
const intent = await activities.analyzeIntent(userMessage);
// 不需要手動 try-catch,框架會處理
async function chatWorkflow() {
await activities.saveUserMessage(msg); // 執行完畢,狀態自動保存
// ⚡️ 即使這裡程式崩潰...
const reply = await activities.getAIReply(msg);
// ✅ 重啟後會從這裡繼續,不會重複執行上一步
await activities.saveAssistantMessage(reply);
}
async function chatSessionWorkflow() {
const messageQueue: QueueItem[] = [];
// 設置 Update Handler(類似 HTTP endpoint)
setHandler(sendMessageUpdate, async (params) => {
const completion = new Trigger<string>();
messageQueue.push({ message: params.text, completion });
return await completion; // 等待處理完成
});
// 主迴圈:串行處理訊息
while (true) {
await condition(() => messageQueue.length > 0);
const item = messageQueue.shift()!;
// AI 處理可能需要幾秒,但不會阻塞新訊息進隊列
const reply = await activities.getAIReply(item.message);
item.completion.resolve(reply);
}
}
優勢:
AI 對話系統可能需要:
// 企業級 Workflow 引擎支援長時間運行的流程
async function chatSessionWorkflow(sessionId: string) {
// 這個 Workflow 可以執行幾天、幾個月
while (true) {
const message = await waitForMessage(); // 可以等待任意長時間
await processMessage(message);
// 當歷史事件過多時,可採用「滾動續跑」策略(例如分段重啟以控制歷史長度)
}
}
企業級 Workflow 引擎的觀測面通常包括:
維度 | n8n(No/Low-code 編排) | Temporal(程式碼式編排) |
---|---|---|
建模方式 | 視覺化節點、拖拉連線 | 程式碼描述流程(Type/Java/Go 等) |
學習曲線 | 上手快,原型敏捷 | 工程化較深,但可測可維護 |
可靠性 | 依賴執行器與外掛,部分需自行補強 | 內建長流程、持久化、重試/退避、去重與恢復 |
可測性 | 以端到端為主,單元測試較難 | 內嵌測試環境、虛擬時間、決定論,易寫快測 |
版本/演進 | Flow JSON 管理,Diff/Review 較弱 | 以 Git 程式碼管理,版本演進與回溯清楚 |
複雜邏輯 | 較適合中低複雜度 | 複雜邏輯(分支/子流程/補償)更自然 |
擴充方式 | 節點外掛(HTTP、DB、SaaS 連結器) | Activity/Worker(可封裝任意服務/LLM 工具) |
運維 | 容器化部署容易,偏 UI/任務層 | 分散式/多 Worker、可橫向擴展、觀測與指標完善 |
使用情境 | 自動化流程、資料同步、SaaS 整合 | 企業級長流程、對話/資料管線、強可靠性場景 |
實務建議:
Workflow 和 AI Agent 是互補關係,它們的結合形成了一個強大的模式,用 Workflow 組織流程,用 AI Agent 增強智慧
下一篇:我們將鳥瞰一個 AI 對話平台的具體架構,看看 Workflow 引擎與 AI Agents 如何在真實的對話平台中協作。