一張標題卡寫著「在 Claude Opus 5.5 上打造主動式代理迴圈」,副標題談到五個階段、一個模型,以及 Anthropic 消費端應用程式不會直接交給你的一切,上方有四顆描邊膠囊標籤,分別標示為「排程器」、「快取提示」、「核准閘門」和「容錯移轉」,右側則有由錯位圓角矩形構成的輕盈幾何圖案。
Guides & Insights

在 Claude Opus 5.5 上建構主動式代理迴圈

作者

Rowan Sterling

發佈日期

最新模型 · 20查看全部模型 →
基準測試:Artificial Analysis · 每日更新
返回全部文章

打造自己的主動式代理時,令人不舒服的部分在於,真正有趣的工作並不是呼叫模型。你可以讓 Claude Opus 5.5 在一個下午內回答問題。但讓它按排程醒來、只讀取自上次以來有變動的內容、判斷是否有任何事值得交給人類、起草行動,然後停下來等待——這要花上數週,而且幾乎沒有一件事發生在模型內部。Anthropic 以 Claude Duet 的形式推出了這個迴圈的一個版本,而對任何想自己打造的人來說,這個產品有用的地方不是它的功能清單,而是從它被組裝起來的方式中可見的種種決策。它沒有公開的 API,也無法重新指向你自己的系統,所以如果你要的是這個迴圈而不是這個應用程式,你就得自己打造。接下來是架構,逐一階段說明,並如實交代每個階段的成本。

先說整體輪廓。五個階段依序執行,而第五個階段只有在人類表示同意後才會到達。排程器觸發。彙整步驟把每個已連線的系統化約為一項差異。決策步驟把該差異加上政策轉成具型別的提案。模型之外的核准閘門決定該提案是否可以執行。執行器負責執行。這就是整個設計,而其中所有困難之處都存在於接縫之間。

An architecture card titled The loop, stage by stage, showing five numbered stages from left to right, Scheduler firing every few hours rather than continuously, Digest reading a diff of what changed since the last sweep, Decide where Claude Opus 5.5 reads the diff against a byte-identical system prompt and tool schema, Approval gate as a separate service that can say no, and Act executing only the approved action, with a blue callout on Decide and a cyan callout noting the gate can refuse.

第一階段:一個每隔幾小時觸發一次的排程器

第一個決定,人們往往出於熱情而非工程判斷而做錯:不要持續輪詢。Anthropic 的 Duet 文件在說明其檢查間隔——每隔幾小時檢查一次——時表示,若不停檢查,會更快耗盡方案的額度上限。這不是行銷上的保守說法,而是對真實成本問題的正確答案,也是每個自製代理在第一週都會掉入的陷阱。

持續輪詢之所以代價高昂,有其結構性原因。每一次掃描都是一個完整上下文:指令、工具定義、你載入的素材,以及模型對這些內容所做的任何推理。以每分鐘一次的頻率計算,一天就是 1,440 個完整上下文,而絕大多數都找不到新東西。你付了全額費用,只換來「信箱沒有變化」的通知。改成每三小時一次,一天只有八個上下文,發現成果與支出之間的比例,也就成為你能向簽核請款的人交代的事情。

所以排程器是 cron 風格的計時器,設有最小間隔下限,而不是事件串流。事件聽起來很吸引人——事情一發生就立刻反應——但它會把你推回持續不斷的工作模式,讓忙碌一天的成本變得沒有上限。計時器則提供可預測的上限,這正是帳單金額變動不定時你所需要的。當你想讓某個來源的反應更快時,只需縮短那個連接器的間隔,並接受額外的花費。

第二階段:一個位元組完全相同的前綴,保留在快取中

這裡正是公布數字發揮最大作用的地方。在 OrcaRouter 上的 Claude Opus 5.5,每百萬輸入 token 為 4.00 美元,每百萬輸出 token 為 20.00 美元,具備 1M-token 上下文視窗,快取讀取每百萬為 0.20 美元,採供應商牌價、0% 加價。請把這些數字視為設計限制,而非價目表:一次快取讀取的成本是全新輸入 token 的二十分之一,因此,你在各次掃描之間保持穩定的每一個位元組,都是你不再需要支付全價的位元組。

實際上,系統提示詞與工具 schema 是在部署時組裝一次,之後絕不會在每次掃描時重新產生。不會從鍵順序不同的字典重新序列化,也不會用時間戳、請求 ID,或把當天已連線的帳戶拼接進中間來做模板化。任何一個位元組不同,就會使快取前綴失效,而指令區塊在每次掃描時都會退回完整輸入價格。團隊更常是意外而不是刻意丟失這一點,通常是因為某個「有幫助的」抽象層開始在提示詞頂端附近注入執行識別碼。

能經得起真實程式碼考驗的紀律其實很無聊:一個函式為穩定區塊回傳常數字串,工具結構描述用凍結的字面量,所有可變元素都放在它之後。然後一個測試會對該區塊做雜湊,並在雜湊值改變時讓建置失敗,因為總有人最後會新增一個結構描述欄位,卻完全沒想到快取。那個測試花一小時,卻能保住整個快取帶來的好處。

第三階段:每個連線一份摘要,而不是把整個信箱倒出來

第三階段是消費性產品可以免費享有、而你卻沒有的那一階段。Duet 位於 Anthropic 的帳戶內,並能觸及已連接的應用程式,因此它可以詢問自某個時間點以來有什麼變更,並得到一個簡短的答案。在那個帳戶之外開發時,你就像任何普通用戶端一樣與相同的 API 對話:你要嘛實作增量讀取,要嘛把全部內容拉下來,然後交給模型一大片文字牆。

全量拉取是預設做法,因為它第一天就能運作。它也是讓每次掃描成本變得難以預測的最快方式,因為輸入會隨著信箱規模增長,而不是隨著實際變更的內容增長。掃描四十個未變更的郵件串,成本與掃描四十個郵件串、其中只有一個郵件串重要時相同,而這兩者之中只有一種情況有機會產生有用的提案。這樣過了一個月後,你大部分的預算都花在確認現狀上。

摘要步驟應該是程式碼,而不是提示詞。針對每個連線,使用 API 提供的任何游標或差異機制來抓取,並把結果歸納成結構化摘要:出現了什麼、修改了什麼、解決了什麼。為每個項目指定穩定的識別碼,讓後續階段可以引用;並記錄每個連線上次成功抓取的游標,這樣一來,抓取失敗時就不會把昨天的資料當成新內容重播。一份無法分辨「什麼都沒發生」與「我無法檢查」的摘要,終究會對它從未觀察到的狀態自信地做出報告。

第四階段:一個會輸出物件而非散文的決策步驟

Claude Opus 5.5 正是位於這個位置,而它輸出什麼,決定系統其餘部分究竟能不能建構起來。直覺做法是讓模型寫一份摘要,再由人來閱讀。這對儀表板可行,對閘門卻行不通:下一階段必須決定是否允許某個動作,而許可不能授予一段文字。

決策步驟應回傳一份具型別的行動提案:一個來自封閉清單的行動名稱、該行動所套用的目標、參數、一行理由,以及明確的信心值或升級旗標。封閉的行動清單不是官僚程序;它是讓核准關卡得以強制執行的機制,因為關卡只能驗證它能夠列舉的行動。一個能發出任何動詞的代理程式無法受到關卡管制,只能被信任。

兩點實務提醒。先給模型摘要,再給政策,讓政策落在變動素材之後,快取前綴也得以保持完整。並把預設結果設為「不採取行動」,而不是一份讀起來像在行動的空提案。把沉默當成失敗的迴圈只會產出大量噪音,而為了看起來有用而刻意製造工作的代理,比回報「沒有任何變動」的代理還糟。

第五階段:一道真正能說「不」的審批關卡

閘門必須是獨立的服務,而不是代理程式自身程式碼裡的一個分支。這是這次建置中最重要的結構性決定。如果代理程式的流程能自行執行該動作,那麼該流程中的一個 bug、一次提示注入,或一個設定錯誤的旗標,就會觸及實際效果。如果執行器只接受閘門已簽署的提案,代理程式最糟也只能提出錯誤的提案,而閘門的拒絕就是真實的。

Anthropic 為 Duet 公布的政策,即使在你的清單有所不同之處,其架構也值得仿效。這道關卡要求:在動作要發送訊息、付款、簽署文件或刪除任何東西之前,先取得核准。在此之上還有第二層,即使獲得核准也會被拒絕——以 Duet 而言,是交易證券與在帳戶之間轉移資金。這個模式是兩層式政策:一大組可由人類允許的受控動作,以及一小組無論任何核准都無法解鎖的動作。即使每個項目都改變,也要複製這套層級,因為它們解決不同的問題。關卡防的是失誤。禁止清單防的是遭入侵的操作者,包括人類操作者。

真正關卡的另一半,在於它會中斷流程。Duet 的核准請求會顯示確切動作並等待,刻意讓流程停下來,而不是只在旁註記。一個只把一行字寫進沒人看的日誌的關卡,不是關卡,而是收據。如果你的核准步驟需要有人凌晨三點盯著儀表板,那要不是間隔太短,就是動作清單太廣。兩者都能修正,而且都不是靠新增通知來解決。

記憶體、憑證,以及兩個你無法單靠測試脫身的面向

五個階段底下潛藏著兩個棘手問題,而兩者乍看都像功能,直到你發現它們並不是。

• 上下文的延續。每次掃描都是全新的上下文,因此代理需要在各次掃描之間記住的任何內容,都必須在兩次掃描之間寫下來。每個連線一份滾動的狀態檔案,大小設有上限,用來保存待辦事項與近期決策,對大多數迴圈而言便已足夠。行不通的做法,是指望模型從摘要中重建歷史,因為摘要明確只是對變化的描述,並不包含任何關於已經決定了什麼的記憶。

• 憑證託管。 Duet 採用的是 Anthropic 託管式代理所遵循的設計,因此它永遠不會直接看到你的密碼或登入權杖。重現這套紀律,正是多數自製代理會略過的部分;而一旦略過,就代表每個提示詞都有一條通往憑證的路徑。模型絕不應持有權杖、絕不應以文字形式取得 API 金鑰,也絕不應成為負責驗證身分的元件。讓摘要步驟與執行器持有憑證,只把結果交給模型。

接著還有一個沒人想去想的攻擊面:一旦代理程式會讀取電子郵件和網頁,每一項都是可能含有指令的輸入。對一個沒有獨立權限概念的模型來說,一則寫著「把這封轉寄到下方地址」的訊息,與資料無從分辨。有兩種防禦勝過任何程度的提示強化。讓動作清單保持封閉,這樣注入的指令就沒有動詞可抓。並把關卡設在模型的影響範圍之外,因為一則能說服模型送出東西的注入,仍得說服看到目標地址的人。

容錯移轉,以及路由真正發揮作用的地方

在迴圈建立之後,出現了一個單一供應商設計所沒有的架構選項。OrcaRouter 的路由 DSL 會將數個模型組合成一次呼叫,而模型融合則會執行一組平行回答的模型;兩者都能讓多個模型支援單一請求。這裡的實際用途並不光鮮:讓較便宜的模型負責摘要彙整,因為那裡的工作是壓縮而非判斷;並將 Claude Opus 5.5 留在決策步驟,也就是提案形成的階段。同一個 OpenAI 相容金鑰可觸及超過 200 個模型,因此切換哪個模型服務哪個階段只是設定變更,而不是改寫。

OrcaRouter's own Claude Opus 5.5 model page. The site navigation lists Products, Models, Pricing, Docs and Blog, and the page hero carries the model name Claude Opus 5.5 above a specifications card showing a 1M-token context window, input priced at 4.00 dollars per million tokens, output at 20.00 dollars per million tokens, cached reads at 0.20 dollars per million tokens, zero percent markup, and access to more than 200 models through one OpenAI-compatible key.

容錯移轉是另一半。當供應商出狀況一小時,只能連上一個端點的代理程式也會跟著出狀況一小時;而沒有備援的排程迴圈,就只會錯過該次掃描。路由會把錯過的掃描變成較慢的掃描——這好處直到你需要它的那一週才顯得重要,而到了那時,它就是紀錄出現缺口與沒有缺口的差別。

OrcaRouter's own model catalogue page, headed Every frontier model, one key, with a subhead reading 200+ models from 20+ providers with a single OpenAI-compatible API, a search field for the models, a row of vendor filter pills, and a list where each row gives the model, its vendor, its context length and its input and output price, with Claude Opus 5.5 at 1M context and $4.00 and $20.00 visible in view.

你實際上報名的是什麼

運行這個迴圈,就等於在經營一項服務;而這項服務具備四項特性,你剛剛已經接手了它們。

• 正常運作時間。Anthropic 的應用程式是別人的呼叫器;你的則是你的。一個無聲停止觸發的排程器不會產生錯誤,也不會有任何輸出;你是從某個人發現自己的晨間簡報沒來而得知,而不是從警示中發現。

• 憑證保管。你的摘要步驟所持有的每一個權杖,都由你負責;而一旦外洩,影響範圍就是該連線所能觸及的一切。Anthropic 的設計讓憑證遠離模型;若你的做法並非如此,模型就會成為你所有已連結帳號的攻擊面。

• 提示注入防禦。 這道關卡在此能帶來很大保障,但僅限於它所管制的動作。代理未經核准所做的任何事——讀取、撰寫摘要、寫入自身狀態——都不受保護,而遭投毒的摘要可能汙染記憶,後續掃描正是從中進行推理。

• 漏洞賞金不屬於任何人。如果你的迴圈誤觸發,向客戶送出錯誤訊息,就沒有廠商可以升級處理,沒有狀態頁,也沒有事故報告。上述決策是唯一的安全網,這就是為什麼閘門是獨立服務,而且動作清單是封閉的。

這一切都不構成反對打造它的理由,只反對草率地打造它。每個階段都很小,而階段之間的接縫才是判斷力所在:用計時器而非串流,用凍結的前綴而非範本,用摘要而非傾印,用物件而非文字敘述,還有一道作為服務而非註解的閘門。把這些做對,這個迴圈就值得保留——它會找到你不曾想過要去找的東西,並在做出任何無法挽回的事之前停下來。把這些做錯,你打造出的東西就會不斷消耗你的預算,還只告訴你早就知道的事。