工作坊 Session 2: Frameworks & Dev Platforms

打造能從失敗中活下來的 AI Agent

Nikolay Advolodkin — Senior Staff Developer Advocate, Temporal

8 月 1 日(六) · Compass Stage · 00:59:44–02:00:02 · 下午場直播

把 agent 的商業流程放進 workflow、把所有會失敗的非確定性動作(LLM 呼叫、API、DB 查詢)包成 activity,Temporal 就會替你記住歷史、無限重試、並在故障排除後像什麼都沒發生過一樣接著跑下去——現場直接拔掉 weather API 給大家看。

開場:先讓整個房間站起來(約 01:04:39–01:06)

在連聽了好幾場 AI 演講之後,Advolodkin 一上台先請全場站起來,找兩個人擊掌、看著對方的眼睛說「你超棒的」,然後拍了一段全場歡呼的自拍影片(第一次他嫌太冷淡,要大家再來一次、聲量五倍)。自我介紹:Temporal 的 developer advocate、狗爸爸、直排輪玩家,狗叫 Mia。

他說明工作坊的哲學:動手做才會記得住,被動聽留不下東西。原訂四個主題——agentic AI 系統的基礎(並實作一個)、用 agentic framework(OpenAI Agents SDK)蓋、human in the loop、以及 orchestrate micro-agents——他一開始就坦白「大概講不完,但沒關係,結束後我會給你們 GitHub repo」。

主題一:什麼是 agentic loop(約 01:07)

LLM 能對我們給它的 context 進行推理,但它缺的是「資訊不夠時自己去採取行動」的能力。agent loop 提供的就是這個:讓 LLM 能夠在自身之外行動。

流程是:給定 instruction 與目標(他的例子:「你是旅遊助理,幫我找一班去邁阿密的班機,訂票付款前先跟我確認」)→ 把 context 交給 decision maker(也就是 LLM)→ LLM 判斷:我的資訊夠不夠?夠就給最終答案,不夠就呼叫工具。工具由 harness 定義、有時由你定義;你只負責告訴 LLM 這些工具存在,由 LLM 決定什麼時候用。拿到工具輸出後再判斷一次,不夠就繼續這個蒐集資訊的迴圈,直到能安心給出答案。

他也現場做了一輪投票,問大家對 Temporal 的熟悉程度——結果大多數人沒聽過,或聽過但沒用過。他笑說「那這場對很多人會偏進階」,但承諾會盡量帶。

主題二:Temporal 的心智模型(約 01:10:47–01:13)

一句話:Temporal 讓你「寫程式時假裝失敗不存在」。

  • 你專注在 agent / 分散式系統的商業邏輯(他強調:agent 就是分散式系統),把它放進一個 workflow——也就是你想執行的一連串步驟。
  • 然後把非確定性的步驟——API 呼叫、LLM 呼叫、資料庫查詢——抽出來,放進所謂的 activity
  • 用 SDK 包住這些 activity 之後(Python、TypeScript、Java、Go、Ruby 等主流語言都支援),Temporal 會建立一份到目前為止所有已執行動作的 history
  • 一旦發生任何失敗,它就停在 history 的那個點等待,等失敗被解決——可能是幾秒、幾分鐘,也可以是好幾年。解決之後,它會像失敗從未發生過一樣繼續執行後面的操作。
  • 而且這段等待不消耗你的資源,因為狀態全都記在 history 裡。他提到 Temporal 有 six nines 的可靠度

那什麼會失敗?幾乎所有東西:LLM 呼叫因網路問題失敗(他說當天早上才被 OpenAI 回了一個 429 rate limit)、API 呼叫失敗、rate limit、服務掛掉、AWS 掛掉。把這些包進 activity,Temporal 就能在故障解除後接手。

主題三:動手做——第一個 workflow(約 01:13–01:25)

環境是一個虛擬 lab(免安裝、Docker 容器,開機約 90 秒),分頁包含 worker 終端機、starter 終端機、Temporal UI、一個可以模擬網路故障的 network control panel,以及程式編輯器。學員在 exercise/ 資料夾工作,solution/ 有相同結構的解答。現場有三位 TA 加上後方的 Melanie 支援。

練習內容:在 exercise/tools/workflow.py 裡把 agent 的建構取消註解。用的是 OpenAI Agents SDK 整合——給名字、給 system prompt、選模型(他說這題用 GPT-4o 就夠了)、給工具。工具本身只是幾個 web request(取座標、取 IP 位置資訊、取天氣),但它們是以 activity 的形式傳入,因此自動獲得 Temporal 的 durability。

執行:先啟動 worker(他解釋 worker 是負責輪詢 task queue、決定要執行哪些工作的程序),再跑 starter,送出「What is the weather in Tokyo?」。

成果:到 Temporal UI 重新整理,workflow 已完成。他強調這是他自己最喜歡 Temporal 的地方——可見性:整條 timeline 一目了然(invoke model activity → get coordinates → invoke model activity → get weather → invoke model activity),每一步都能點進去看 header、輸入與輸出。最後答案是東京 79.6°F、微風。

主題四:把它弄壞——durability 的現場證明(約 01:25–01:28)

這是整場最核心的示範。到 network control panel 把 weather API 關掉(他舉的情境:你的網路擋掉了、企業政策不准、API 本身掛了、或 AWS 掛了所以連帶掛了),然後重跑「What is the weather in London?」。

在 Temporal UI 裡:

  • workflow 進入 Running 狀態,而且會一直維持 Running 直到問題解決
  • 那個 activity 持續重試。因為他們沒有明確指定 retry policy,用的是預設值,所以會永遠重試下去;而且內建 automatic backoff 與 backoff coefficient。他順帶解釋為什麼需要 backoff:你不會希望 LLM 一直狂打 OpenAI API,那很燒資源;打 10 次失敗就等 10 秒,再失敗就等 30 秒——這就是 exponential backoff,沒有 Temporal 的話這段邏輯得自己寫,而且會寫得很醜
  • 錯誤訊息顯示 503 service unavailable

接著把 weather API 打開:「想像 AWS 的故障排除了」。幾個瞬間之後 workflow 自動恢復,像失敗從未發生過——不需要動任何程式碼,從失敗發生的那一點精確接續,沒有額外資源被消耗,workflow 正確結束,終端機拿到倫敦的天氣。

主題五:自己寫 loop vs 用 SDK(約 01:28–01:30)

他順帶拆穿了 agentic framework 的神祕感:很多框架把 agentic loop 藏在背後,但它本質上就是一個 while True 迴圈——等待使用者輸入、判斷資訊是否足夠、不夠就呼叫工具或做別的事。

自己寫大概 50 行;用 OpenAI Agents SDK 就是 runner.run 一行,loop 由 SDK 處理。而 activity_as_tool 這類包裝則負責替所有被呼叫的工具提供 durability。

主題六:為什麼要拆成多個 agent(約 01:36–01:38)

中途他讓現場投票決定接下來講 human in the loop 還是 multi-agent orchestration,現場選了 multi-agent,human in the loop 因此跳過(他解釋 human-in-the-loop 就是一個「詢問並等待人類回饋」的工具,可以等核准也可以等資訊——「ChatGPT 本身就是一種 human in the loop,它會等你回應才繼續」)。

拆分的理由是 context 的四種病:context poisoning、distraction、context clash、confusion。小 workflow 還好,但流程愈大、資料愈多、塞進去的東西愈多,LLM 就愈難推理

主題七:三種呼叫 sub-agent 的方式與 Nexus(約 01:38–01:43)

架構是:personal assistant agent 作為整個流程的入口(他類比為你的 ChatGPT),由它決定要呼叫 weather agent、F1 agent,或兩個都叫。

呼叫 sub-agent 有三種做法:

  1. 當成 activity 呼叫
  2. 當成 child workflow 呼叫——主 workflow 啟動一個子 workflow,兩者綁在一起;適合把決策邏輯放進另一個流程。
  3. 透過 Nexus——Temporal 的另一項技術,可依團隊領域、地區、安全性考量、程式碼需求做切分,例如你希望某個 agent 用和別的 agent 不同的頻率部署。

他對 Nexus 的解釋是:把它想成一個 API。你決定要向另一個團隊或另一個組織暴露哪些 endpoint,對方只能呼叫那些;呼叫方提供 endpoint 與 service 名稱就能呼叫,背後怎麼實作可以隨時改(升到 v2 之類),而契約不變,呼叫方不必改程式碼

主題八:多 agent 實作與再次弄壞它(約 01:44–01:52)

Demo 5 的架構:personal assistant workflow 收到「下一場 F1 比賽在哪、那裡現在天氣如何?」→ 透過 Nexus operation 呼叫 F1 agent(跑在不同檔案、不同 task queue,最終呼叫他們自架的 F1 MCP server,再打到 F1 API)→ 資訊回到 personal assistant → 它判斷「還缺天氣」→ 以 child workflow 呼叫 weather agent(內部再呼叫 get coordinates 與 get weather 兩個 activity,就是公開 HTTP 請求)→ 彙整後給出最終答案。

實跑結果:下一場是 8 月 23 日的荷蘭大獎賽,當地 64.7°F。在 Temporal UI 中可以看到兩個 workflow 同時執行,而且 Nexus link 是可以點進去的——點進去就是 F1 expert 那個獨立 workflow 的完整執行紀錄。

然後他又把 weather API 關掉重跑:兩個 workflow 都不會完成,卡點精準落在 weather agent workflow 的 get_coordinates,持續失敗直到問題解決。打開之後兩者都成功結束——他提醒恢復時間取決於 retry policy 與 exponential backoff,等久了可能要多等幾秒才會重試。

主題九:隨堂測驗與收尾(約 01:31–01:36、01:52–01:59)

他穿插了手機搶答測驗與排行榜,前三名送周邊。幾個值得記的答案:

問題 答案要點
誰決定下一步要做什麼動作? LLM 是 decision maker。我們給 context、告訴它有哪些工具,由它決定資訊夠不夠、接下來要不要再呼叫工具
Demo 2 裡的 loop 是誰寫的? 我們沒寫 loop,用的是 OpenAI Agents SDK,loop 在 runner.run 裡面
如果 workflow 有了但工具沒加進 tools 物件會怎樣? workflow 照樣啟動、activity 照樣跑,只是沒有工具可呼叫,所以會回一個無效的答案
為什麼 LLM 呼叫要包在 activity 裡? 因為它們是非確定性的。非確定性的程式碼放 activity 才能被 replay;確定性的商業流程留在 workflow
Nexus 相對於在程式碼裡直接 import,多給了什麼? 它是 API 契約;但它不會幫你處理額外的操作,namespace 一致性也仍是開發者的責任

收尾(約 01:58–01:59):時間到被請下台,他只要求兩件事——到 LinkedIn 追蹤他(所有內容會放上去)、以及在 lab 的 feedback 分頁留下可以據以改進的回饋(「你可以說我很爛,沒問題,但請告訴我為什麼很爛」)。測驗前三名是 Anton、Henrik、Ming,周邊在後排領。有問題也可以去 Temporal 的 Slack 社群。

提到的專案與資源 / Projects & Resources

名稱 Name 說明 Description 備註 Notes
Temporal workflow / activity workflow 放確定性的商業流程,activity 放非確定性、會失敗的步驟(LLM、API、DB) Workflows hold deterministic business flow; activities hold non-deterministic, failure-prone steps (LLM, API, DB) 工作坊的核心心智模型 / the core mental model
Temporal worker / task queue worker 輪詢 task queue、決定要執行哪些待辦工作 The worker polls the task queue to decide what backlog work to execute
Temporal UI 逐步檢視 workflow timeline、每個 activity 的輸入輸出與 header Step-by-step timeline with per-activity inputs, outputs, and headers 講者最推薦的賣點 / his favorite feature
Temporal Nexus 以 API 契約形式跨團隊/地區/安全邊界呼叫其他 workflow Calling other workflows across team, region, or security boundaries as an API contract UI 中的 Nexus link 可點進被呼叫的 workflow
OpenAI Agents SDK 工作坊使用的 agent 框架,runner.run 內含 agentic loop The agent framework used; the agentic loop lives inside runner.run 與 Temporal 有官方整合
F1 MCP server 由 Temporal 代管、供 F1 agent 呼叫的 MCP server,底層打 F1 API Temporal-hosted MCP server the F1 agent calls, which in turn hits the F1 APIs demo 5 使用
Network control panel lab 內建的網路故障模擬器,可關閉 geolocation / weather 等 API Built-in lab tool to simulate network failures by disabling APIs durability 示範的關鍵道具
Temporal Slack community 後續提問管道 Follow-up channel for questions

逐字稿勘誤 / Transcript Corrections

字幕原文 Heard as 應為 Should be
Nikolai Lotkin Nikolay Advolodkin
temp using temporal Temporal
agenda loop / gentic loop agentic loop
GPT40 GPT-4o
task Q task queue
activity this tool activity_as_tool(推定 / inferred)
codeex / cla / cloth code Codex / Claude / Claude Code
runner.run run runner.run
get coco coordinates get coordinates
six nines(字幕正確)

待確認 / To Verify

  • 虛擬 lab 平台字幕作 "instruct environment",聽起來像 Instruqt,需確認。/ The lab platform was transcribed as "instruct environment", plausibly Instruqt — to confirm.
  • 工作坊 GitHub repo 與 lab 網址在字幕中只以口頭「navigate to that URL」帶過,未出現實際網址。/ The workshop repo and lab URLs were only pointed at on screen; no URL appears in the captions.
  • 他說 Temporal 有 "six nines of reliability",指的是雲端服務 SLA 還是別的指標,現場未說明。/ He cited "six nines of reliability" without specifying whether that's the cloud SLA or another measure.
  • 包裝工具用的 API 字幕作 "activity this tool",推定為 activity_as_tool,需對照 repo 確認。/ The tool-wrapping API was transcribed as "activity this tool", inferred here as activity_as_tool — check against the repo.
  • 現場提到的 TA 名字 "Melanie" 僅為聽寫,未查證。/ The TA name "Melanie" is as transcribed only.

GitHub 上的 Markdown 原始檔 ↗