本版本由 AI 自英文原文翻譯而成,尚未經人工譯者審閱。引文以英文原文呈現,其後附上譯文。 閱讀英文原文

FestPass AI 工作流程模擬器:由七個節點組成的代理團隊——負責接待的 Grace、建立客戶輪廓的 Marcus、負責知識檢索的 Ava、負責法規遵循的 Daniel、進行訪談的 Maya、負責審查的 Theo,以及負責使用者體驗的 Zara——下方是活動紀錄,以及保存本次執行狀態的共享剪貼簿,每列一個欄位。

第 I 部 · 第 7 章

從聊天機器人到代理團隊

六大元件,接著是防護機制,再來是以來源為依據,最後是一支代理團隊。

向下捲動閱讀

第一天,大家在白板上把一個聊天機器人拆開,替每個部件命名:介面、大腦、記憶、個性、決策路徑、工具。六大元件,讓在場的每個人一說出聊天機器人這個詞,就知道裡面裝了什麼。

The bot is the GPS,(「機器人是 GPS」)T. Valerie Onu 在那第一個早上這樣告訴他們。The human is the driver.(「人是駕駛。」)

此後的一切,都建立在這個框架上。先是字典式機器人,把問題對應到事先存好的答案,大家也很快發現這種做法能承載的東西少得可憐。接著是防護機制,讓它寧可拒絕也不即興發揮。然後是黃金紀錄(Golden Record),讓每一項事實都附帶來源與日期。再來是檢索,讓答案出自客戶擁有的文件,而不是模型對網際網路的記憶。

到了第四週開始時,營隊學員已經有了一個不錯的機器人。不過它只有一種形態,而且那個形態從來不變:問題進來,系統查點東西,答案送回去。

一個回合。一個決定。一項職責。

真實的工作,不會以這種形態出現。

先有工作流程,才有 AI

下一步完全不是技術性的。

學員被要求去觀察那些平凡又繁瑣的業務流程——每個人都曾在某個時候排隊卡在裡面的那種——然後把它們拆解成工作流程。不是把「申請貸款」當成單一事件,而是當成一個序列:誰經手、按什麼順序、每個人在採取行動之前手上需要有什麼,以及當他們需要的東西不在時,會發生什麼事。

結果,最後那個問題就是整個主題。

在碰觸客戶的問題之前,他們先在模擬器上練習,而這些模擬刻意設計得很好玩——核發一張節慶通行證、把一份申請從頭走到尾、一步步推進流程,看著共享剪貼簿上隨著流程推進累積了哪些東西。模擬的價值在於你可以一再重跑,也可以故意把它弄壞。沒有人能拿一家銀行這樣做。

故意弄壞它,才是真正學到東西的地方。一個永遠順順跑完的工作流程什麼也教不了你,因為每一個真實的流程,大部分時間都耗在例外狀況裡。所以每個模擬器都內建了失敗情境:缺少年齡證明的節慶通行證。付款失敗。身分證件模糊到看不清楚。

直到這時,自動化才登場——而且它是以一個問題的形式出現,而不是一個工具。這些步驟中,哪些可以交給系統?哪些必須留給人?當某個步驟無法完成的那一刻,又必須發生什麼事?

這個問題的實例示範,就落在 Tariq 身上。

Tariq 想要貸款

整個前提就這樣,而且刻意平凡。他走進一家銀行——或者打開一個聊天視窗,到了 2026 年,這兩者已經是同一回事——想借一筆錢來拓展生意。接下來發生的,不是一個問題配一個答案。而是一個序列,其中每一步都屬於不同的人。

得有人接待他,弄清楚他真正需要什麼。得有人確認他是誰、是什麼樣的客戶。得有人去查銀行自己的規定對放款是怎麼說的。得有人拿這些規定去核對他的文件。如果少了什麼,得有人回頭向他索取——這表示整個序列必須能夠掉頭。得有人在結果送出之前加以審查。最後,還得有人用 Tariq 用得上的語言,把結果交還給他。

要單一聊天機器人包辦這一切,它會試著去做。它也會在過程中的某個地方,悄悄編出一條放款規定。

為什麼我們以代理團隊來教

就在這一刻,營隊不再教生成式 AI 聊天機器人,而是開始教代理式 AI 工程。

代理團隊不是多加了幾條提示詞的聊天機器人。它是把同一個問題拆解成一項項有名字的工作,每一項都有自己的輸入、自己的限制,以及自己拒絕的權利。Tariq's Digital Crew(Tariq 的數位代理團隊)為這些工作配上了面孔:Grace 負責接待,Marcus 建立客戶輪廓,Ava 檢索規定怎麼說,Daniel 檢核法規遵循,Maya 在缺少資料時進行訪談,Theo 進行審查,Zara 把結果交還出去。

七個代理、一個共享剪貼簿,還有——最關鍵的部分——一條往回繞的邊。當 Daniel 發現缺少一份文件時,工作既不會失敗,也不會繼續往下走。它會回到 Maya 那裡,由 Maya 向 Tariq 索取缺少的東西,然後才繼續前進。

先說成一個故事

這一切,如果在某個星期二早上以架構圖的形式端出來,是不會有人聽得進去的。

所以它是以故事的形式來教的。營隊為這些代理製作了漫畫,讓每一個代理在成為函式之前,先成為一個角色;還製作了一支影片,帶大家走過 Tariq 從提出請求到得到答案的整段歷程。學員先把 Grace、Daniel 和 Maya 當成有工作在身的人來認識,之後才把他們當成圖中的節點來認識。

這個順序正是重點。一個十五歲的孩子,只要跟著 Tariq 的申請走過七雙手,就已經懂得交接、狀態與條件式路由——只是他們還不知道這些東西就叫這些名字。等到程式碼出現時,那不是新的概念,而是他們自己的想法,用 Python 寫了下來。

然後是困難的部分

說故事能帶你理解概念,卻無法帶你做出可正式上線的系統,而營隊也沒有假裝不是這樣。

學員被帶去學的框架是 LangGraph,而這件事值得說得精確一點,因為人們很容易以為,一個暑期計畫會選擇手邊最溫和的工具。它反其道而行。

LangGraph 是一個低階框架。在軟體工程裡,低階意味著細緻的控制與更明確的程式碼——沒有人會遞給你一層替你思考的抽象。高階框架讓開發者用淺白的英文宣告一個代理的角色,再信任模型自己想出步驟;LangGraph 則要求你親手寫出三樣東西:

節點——執行某個動作的精確程式碼區塊或模型呼叫。

邊——連接這些動作的條件邏輯與決策路徑,包括那些往回繞的路徑。

狀態——一份中央結構描述(schema),精確記錄代理團隊在任何時刻所知道的一切。

正因為它不把這些藏在方便的抽象層後面,它讓你對迴圈、自我修正與人在迴路(human-in-the-loop)的介入擁有絕對的控制權。這種控制權,正是企業選擇它的全部理由。當一個產生幻覺的代理可能讓銀行賠錢時,你要的是一台邊界嚴格的狀態機,而不是一個可能四處亂飄的自動駕駛。

為什麼偏偏是低階

營隊大可選用高階框架。那樣會更快、更溫和,當天下午就能做出可以展示的東西。但營隊選擇不這麼做,理由是資安。

在高階框架裡,由模型決定下一步要做什麼。這正是它的賣點——描述一個角色,系統就會自己想出步驟。但這也恰恰是它的攻擊面。

提示詞注入的原理,是把一段文字塞進模型的上下文,讓模型把它當成指令。如果模型只負責寫回覆,一次成功的注入只會產生一個糟糕的回覆。如果模型還負責選擇路徑,一次成功的注入就會替它選路徑:跳過法規遵循檢查、動用一個它原本不該碰的工具、回傳一個沒有人查核過的數字。一道被操弄的指令,波及範圍就是整個工作流程。

把圖明確地寫出來,這一類攻擊就無路可走。注入仍然可以竄改某個節點說出的內容。它無法憑空造出一條不存在的邊。它無法繞過 Daniel,因為 Daniel 不是一項建議——他是所有流量都必須通過的節點。它無法呼叫一個圖裡從來沒有接上的工具。模型的權限,止於它所運行的那個節點的邊界。

這就是這裡所謂「強化」(hardening)的意思。不是事後才硬加上去的過濾器,而是一套從一開始就沒有建出危險路徑的架構。

這也是第九天那堂實驗課值得一做的原因。學員花了一整節課,試著越獄自己的機器人,而這種練習,只有在有一個結構可以拿來測試時,才教得到東西。攻破一個自動駕駛,你只證明了模型可以被說動去做某些事,而這大家早就知道了。攻破一張用程式寫成的圖,你就能查出究竟是哪個節點洩漏了、它又被允許接觸到哪些東西——這是一個範圍明確到可以修補的發現。

這也是為什麼 CUB-VA 能夠如此斬釘截鐵地陳述它的不變原則:它絕不會索取、儲存或揭露機密的銀行憑證——不碰帳號、不碰密碼、不碰餘額。一個自己決定下一步的代理,無法誠實地做出這樣的承諾。一個只走別人寫好之路徑的代理,才做得到。

這對學習者的實際要求是什麼

LangGraph 是把圖論與狀態機直接應用在生成式 AI 上的實作。要把它用好,需要用到有向圖與循環圖、資料持久化,以及非同步程式設計——這些是電腦科學的基本功,不是聊天機器人的小撇步。它是大學進階課程與正式上線等級 AI 工作坊的必備內容,一般也被認為對於正在打造第一個原型的人來說太過進階。

而它在第四週,被教給了加勒比海的青少年。

這個領域真正的現況

值得說清楚的是,這一切有多新。檢索與代理編排,並不是有十年教科書撐腰的定型做法。它們是應用 AI 領域中正在發生的問題——此刻正由資源遠比一個暑期計畫充裕得多的團隊,在正式環境中摸索解決。

原因在於,模型從來就不是難的部分。任何機構都可以呼叫應用程式介面(API)。把一段展示和一個銀行願意掛上自己名字的東西區分開來的,是圍繞在模型周圍的一切安排:事實從哪裡來、系統被允許說什麼、某一步失敗時會怎樣,以及在它根本不該回答時,要升級處理、轉交給誰。這就是編排,也是目前真正的難題所在。

這正是關於這個計畫值得提出的主張,而且是一個範圍很窄的主張。學員拿到的,不是上個十年的技術重新包裝給學校用的版本。他們被帶到這個領域中仍在爭論不休的那一塊——並被要求在其中交出成品。

同一個代理,兩種寫法

Daniel 負責檢查貸款申請人是否備齊規定要求的文件。以下先用高階框架寫出他,再用營隊所教的方式寫一次。

class State(TypedDict):        # what the crew knows, exactly
    applicant: str
    documents: list[str]
    missing_items: list[str]
    compliance_status: str

def daniel(state: State) -> State:          # the NODE
    missing = required_docs() - set(state["documents"])
    return {
        **state,
        "missing_items": sorted(missing),
        "compliance_status": "pass" if not missing else "hold",
    }

def route(state: State) -> str:             # the EDGE
    return "maya" if state["compliance_status"] == "hold" else "theo"

graph.add_node("daniel", daniel)
graph.add_conditional_edges("daniel", route)   # loops back on a fail

節點、邊與狀態,全都明確寫出。沒有任何部分交由推斷——包括那條條件邊:它會把未通過的檢查送回給 Maya,而不是放行。

高階LangGraph
抽象程度高——宣告角色,由模型自行推想步驟低——每一條允許的路徑都明確寫出
控制權自動駕駛。由模型決定何時迴圈、何時往下走完全掌控。由開發者決定何時迴圈、重試或停止
可預測性較低。代理可能偏離方向,或卡在邏輯迴圈裡較高。嚴格的邊界讓模型保持在軌道上
學習曲線平緩。適合趕在明天早上前做出原型陡峭。需要扎實的軟體架構基礎

程式碼為說明差異而撰寫,並非取自營隊學員的程式碼儲存庫。代理團隊、各個角色,以及返回 Maya 的條件邊,則確實出自營隊。

學員當時一步步完成的那堂實驗課是公開的,至今依然公開。它一行一行地建構出一個檢索代理——一邊是你輸入的內容,另一邊是 LangGraph 提供的部分,以及每一步如何對應到你在寫任何程式碼之前就畫好的代理組織。

學員帶走了什麼

那麼,讓我們撇開聊天機器人這個框架,看看這二十天究竟傳授了什麼。

應用圖論。節點、邊、有向與循環的流程——不是抽象概念,而是決定 Tariq 的申請要退回還是繼續往下走的那個東西。

狀態設計。一套說明系統在任何時刻所知內容的結構描述,以及推想其中一部分缺失時會發生什麼事的思考紀律。

不確定狀況下的控制流程。什麼時候重試、什麼時候中止、什麼時候停下來轉交給真人。多數軟體都假設自己會成功;代理則必須由一個假設它們會失敗的人來撰寫。

在受管理的語料庫上進行檢索。讓答案以一個有明確擁有者的來源為依據,並加以引用。

對抗式測試。第九天,學員攻擊自己的系統,秉持的原則是:要用駭客的思維思考,用防守者的態度打造。

輸出驗證。結構描述檢查器、拒絕條件,以及不因為模型的輸出讀起來通順就信任它的習慣。

部署。從 FastAPI 到 GitHub 再到 Render,還有一個必須分毫不差的啟動指令。

還有 Python,達到經外部考核的水準。

前七項,是用人主管一看就知道屬於資深等級的能力。最後一項,是寫得進證書裡的那一項。而任何清單上都沒有列出的,是這一切底下的判斷力——知道系統什麼時候應該拒絕——那是你查不到的部分。

學以致用

這種嚴謹,只有在經得起真實客戶的考驗時才算數;而正是在這裡,這二十天可以被稽核,而不只是被描述。

W.E.S 在收集姓名之前,就先分流緊急狀況——這是一條條件邊,之所以這樣走,是因為淹水的院子等不及身分查核。A.I.D.A. 寧可升級處理、轉到員工控制台,也不即興做出稅務裁定——這是一個人在迴路的節點,正好放在出錯代價最高的地方。ASPIRE AI 在代理於多輪對話測試中打結之後,加上了輸出結構驗證器——這是一個狀態問題,由造成它的人自己診斷、自己修好。PILOT 把任何涉及海關的問題轉交給港口調度員——這是一個中止條件,是刻意寫出來的,而不是寄望它自然發生。

這些都不是任何人想得到要提出的功能需求。它們是一張圖在畫圖的人真正理解之後會有的樣子——理解一個代理最難的部分,在於知道它什麼時候必須停下來。

在台上,看著自己的系統在壓力下正確完成轉交,有一支團隊說得比上面這些都更直白:That is what agentic means in practice!(「這就是『代理式』在實務上的意義!」)