iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
Software Development

Temporal 開發指南:掌握 Workflow as Code 打造穩定可靠的分散式流程系列 第 26

Day26 - AI 對話平台:整合 Temporal 與 AI Agent (上)

  • 分享至 

  • xImage
  •  

在 AI 應用開發的浪潮中,我們常常聽到兩個核心概念:WorkflowAI Agent。他們有非常相似的模式,新手剛入門時不太容易理解他們的區別,所以就想開啟這個主題。

本篇將深入探討這兩個概念的本質、優劣,以及為什麼企業級 Workflow 引擎能成為連接它們的關鍵橋樑。

Day02 - Workflow Orchestration 流程編排介紹 所提到的,Workflow 編排早就存在(像 BPMN、Airflow 這些),其使用重點是先定義好步驟與狀態,引擎負責依流程執行。

而新技術 AI Agent 也是跑 多步驟任務 (所以很像),但它是靠模型在執行時決定下一步,所以結果可能不同。這類系統在錯誤處理、重試、補償與流程及步驟的可觀測性上,還需要成熟的 Workflow 引擎來補強。

實務上兩者會搭配使用,所以往下看下去吧。

1. Workflow 快速重點回顧

  • Workflow 是用來「編排」跨多步驟流程的分散式系統模型,保證流程在崩潰、重啟、網路波動下依然可恢復、可重試、可觀察。
  • 核心特性
    • 持久性(Durability):狀態不丟失,可從中斷處繼續
    • 可靠性(Reliability):自動重試/退避,避免暫時性故障
    • 可觀察性(Observability):完整事件歷史、易於追蹤除錯
    • 確定性(Determinism):重播同樣事件序列會得到相同結果
  • 基本準則
    • Workflow 內不做外部 I/O、不直接取系統時間/隨機數;一律交給 Activity
  • 計時器、重試、併發、等待外部事件(例如訊號、查詢等機制)由 Workflow 編排
  • 前面 Day02–Day25 篇章已詳細涵蓋 Workflow/Activity、Retry/Timeout、訊號/查詢、版本演進、測試策略等主題
  • AI 串接的「本質」也是分散式系統,那如同上述所說,Workflow 就能夠解決 AI 串接會遇到的各種分散式問題。

2. 理解 AI Agent:智慧決策的力量

2.1 什麼是 AI Agent?

AI Agent(智慧代理)是一種能夠感知環境、做出決策、並採取行動的智慧系統。

在 OpenAI 的 Agent 框架中,一個 Agent 通常由以下部分組成:

  1. Instructions(指令):定義 Agent 的角色和目標
  2. Tools(工具):Agent 可以呼叫的外部能力(如搜索、計算)
  3. Context(上下文):對話歷史、知識庫等
  4. LLM(大語言模型):理解和生成的核心

2.2 AI 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 會自動判斷何時需要呼叫工具

2.3 AI 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 元的支出"
// 內容相同但文字不同 → 難以做精確的業務判斷

成本與延遲

  • 每次 LLM 呼叫都有成本(按 token 計費)
  • 響應時間不可控(幾百毫秒到幾秒)
  • 無法做到「瞬間」決策

3. 為什麼需要結合?互補的完美組合

3.1 各自的角色定位

維度 Workflow AI Agent
核心能力 可靠的協調與執行 智慧的理解與決策
適合場景 固定流程、狀態管理 語義理解、動態推理
確定性 高(可重放) 低(每次可能不同)
可靠性 高(自動重試) 低(需要手動處理)
靈活性 低(需要編碼) 高(自然語言即可)

3.2 結合模式:指揮官與顧問

想像一個指揮系統:

  • 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;
  }
}

3.3 實際案例:記帳功能

假設使用者說:「昨天中午買了午餐花了 120 元」

純 AI Agent 方案的問題

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); // ❌ 重試時會重複記帳
}

問題

  • AI 解析成功,但資料庫崩潰 → 使用者需要重新輸入
  • 網路抖動導致重試 → 可能重複記帳
  • 無法追蹤執行狀態 → 除錯困難

Workflow + AI Agent 方案

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);
  // 所有步驟都有完整的執行記錄
}

優勢

  • ✅ 每一步都自動持久化
  • ✅ 失敗自動重試(避免重複呼叫 AI)
  • ✅ 冪等性保證(不會重複記帳)
  • ✅ 完整的執行歷史可追溯

4. 為什麼選擇企業級 Workflow 引擎?

4.1 業務邏輯即程式碼

傳統架構的痛點

// 需要多個服務協作
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);
}
// 像寫同步程式碼一樣,但具備分散式系統的可靠性保證

4.2 內置的可靠性機制

自動重試

// 設定 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);
}

4.3 強大的並發控制

串行訊息處理

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);
  }
}

優勢

  • ✅ 同一 session 的訊息嚴格按順序處理
  • ✅ 不會因為併發導致訊息亂序
  • ✅ 新訊息可以繼續進隊列(不會丟失)

4.4 長時間運行的 Workflow(長流程)

AI 對話系統可能需要:

  • 一個 session 持續數小時甚至數天
  • 處理成百上千條消息
  • 維護完整的對話上下文
// 企業級 Workflow 引擎支援長時間運行的流程
async function chatSessionWorkflow(sessionId: string) {
  // 這個 Workflow 可以執行幾天、幾個月
  while (true) {
    const message = await waitForMessage(); // 可以等待任意長時間
    await processMessage(message);
    
    // 當歷史事件過多時,可採用「滾動續跑」策略(例如分段重啟以控制歷史長度)
  }
}

4.5 可觀察性與調試

企業級 Workflow 引擎的觀測面通常包括:

  • 每個 Workflow 的執行歷史
  • 每個 Activity 的輸入輸出
  • 重試次數和失敗原因
  • 完整的事件時間線
  • 可在生產環境重放流程以還原問題上下文
  • 排查「為什麼使用者的訊息沒回覆?」
  • 排查「為什麼記帳失敗了?」

5. n8n 與 Temporal 比較(補充)

維度 n8n(No/Low-code 編排) Temporal(程式碼式編排)
建模方式 視覺化節點、拖拉連線 程式碼描述流程(Type/Java/Go 等)
學習曲線 上手快,原型敏捷 工程化較深,但可測可維護
可靠性 依賴執行器與外掛,部分需自行補強 內建長流程、持久化、重試/退避、去重與恢復
可測性 以端到端為主,單元測試較難 內嵌測試環境、虛擬時間、決定論,易寫快測
版本/演進 Flow JSON 管理,Diff/Review 較弱 以 Git 程式碼管理,版本演進與回溯清楚
複雜邏輯 較適合中低複雜度 複雜邏輯(分支/子流程/補償)更自然
擴充方式 節點外掛(HTTP、DB、SaaS 連結器) Activity/Worker(可封裝任意服務/LLM 工具)
運維 容器化部署容易,偏 UI/任務層 分散式/多 Worker、可橫向擴展、觀測與指標完善
使用情境 自動化流程、資料同步、SaaS 整合 企業級長流程、對話/資料管線、強可靠性場景

實務建議:

  • 需要「快速整合第三方、原型驗證」時,n8n 非常好用;也可作為外部事件入口。
  • 需要「長時間、強一致、可測、可回放、可觀測」時,以 Temporal 等企業級 Workflow 引擎承載核心編排更穩妥。
  • 常見混搭:n8n 做外圍輕量自動化與人機互動,核心長流程交給 Temporal;兩者以 Webhook/Queue 交會。

結語

Workflow 和 AI Agent 是互補關係,它們的結合形成了一個強大的模式,用 Workflow 組織流程,用 AI Agent 增強智慧

  • Workflow:提供可靠的協調、狀態管理、錯誤處理
  • 將 LLM/檢索/評估等能力封裝為 Activity,由 Workflow 統一調度
    • 將 Agent 的迴圈(計畫→執行→觀察→反思)以 Workflow 實作,可中斷/恢復/重播
  • AI Agent:提供智慧決策、語義理解、動態適應
    • 透過接收外部事件(使用者輸入/人工審核),驅動 Agent 下一步
    • 以 Timeout/Retry/Backoff 控制成本與穩定性,避免 LLM 波動造成流程失控
  • 使用搜尋屬性/版本演進管理 Prompt/工具版本,確保可追溯與演進

下一篇:我們將鳥瞰一個 AI 對話平台的具體架構,看看 Workflow 引擎與 AI Agents 如何在真實的對話平台中協作。


上一篇
Day25 - Temporal Testing(下):Async Activity Completion、JUnit5 Extension、E2E 測試環境建立
下一篇
(未完成) Day27 - AI 對話平台:整合 Temporal 與 AI Agents (中)
系列文
Temporal 開發指南:掌握 Workflow as Code 打造穩定可靠的分散式流程28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言