AI 代理也正走到同一個拐點。

大多數人以為,代理就是模型、執行時環境,或是目前正在執行任務的迴圈。那些東西很重要,但它們不是代理。

在這篇文章裡,我要主張:代理就是它的資料,特別是它的事件歷史,我們稱之為日誌(log)。當日誌建構得正確時,代理只靠日誌本身就能被接續執行。而這一個性質,會解鎖一整套能力,讓即使是進階的代理使用案例,也更容易推理、也更容易納入日常應用中。

定義代理

那麼,什麼是日誌?定義代理,就等於定義日誌。從核心來看,日誌就是事件歷史:代理運作時累積的每一筆使用者輸入、模型輸出、工具呼叫與工具結果——一份只追加、不覆寫的紀錄,記下所有發生過的事。

日誌也會帶著對工作階段定義的參照:系統提示、工具描述,以及代理所執行的技能。這些內容不會隨著每一輪而改變,所以它比較像是帶版本的常數,而不是串流中活躍的一部分。

兩者合在一起,就構成了代理的完整狀態。代理的一切,都不會存在於執行時環境、模型或工具裡;它們只是解讀器與追加器。它們讀取持久化狀態,根據狀態採取行動,然後把下一個事件寫回去。所以你可以把同一份日誌交給一個全新的執行器,它就能完全重建代理當時所在的位置,並從那裡繼續下去。只靠日誌本身,就足以接續代理。

日誌在實務中的樣子

一旦你把代理定義成日誌,整個系統就更容易推理了。對代理的每一種操作,不是讀取日誌、就是追加日誌,或是渲染日誌的某種視圖。模型讀取視圖並產生下一步動作。工具執行器執行工具呼叫並追加結果。使用者介面讀取日誌並渲染時間軸;追蹤系統讀取日誌並渲染追蹤資訊;稽核人員讀取日誌來重建發生過的事。這和多年以前資料庫最後採用的模式很像:資料表、索引與快取,都是建立在底層變更日誌上的投影。這篇文章的線上版本有一張改編自 @dexhorthy 很棒的 12-factor agents exploration 的圖,值得一看。

實務上,一個簡化的迴圈可以長這樣:

Python code snippet

看起來很簡單,但關鍵洞見在於:每一輪都先取得暫時性的租約,讀取日誌,往前推進一步,然後把結果寫回去。這個迴圈具有冪等性與容錯性:只要每一次有意義的狀態轉換都被可靠地寫入,任何執行器都能接手這個工作階段並繼續跑下去。

壓縮不是日誌

雖然日誌可以無限增長,但模型能看到的視圖卻不行:上下文視窗是有限的。你不可能在每次呼叫時都把完整的原始歷史交給模型。這就是壓縮(compaction)出現的地方。而且既然壓縮會用摘要取代它之前的一切,那這不就破壞了「日誌就是代理」這個主張嗎?

不會。記住,壓縮是有損的。壓縮後的摘要,並不是用更小的形式重現代理狀態;它是把資訊捨棄掉。

這其實反而強化了這個主張。完整日誌才是紀錄;壓縮只是它的一種投影,就像具體化視圖不是資料庫、摘要也不是對話一樣。保留原始日誌,你就永遠可以從中產生新的投影。把原始日誌丟掉,只保留壓縮結果,你就失去了代理的一部分。所以最清楚的做法,是把壓縮視為一種盡力而為、且有損的分支,並把它當成一份新的日誌來接續。

完整的工作階段日誌會流入較小的壓縮立方體,在過程中逐步捨去細節。

日誌不是整個世界

有一個很明顯、也值得認真看待的反對意見:那那些會在日誌之外改變狀態的工具呢?代理可能編輯檔案、建立 GitHub issue、寄送電子郵件。這樣一來,狀態就存在於日誌之外了。這不就推翻了這個主張嗎?

不會。你是從日誌重建代理的狀態,而不是從整個世界重建:如果它已經寄出那封郵件,回到分支點也不會讓郵件消失;如果它編輯過的檔案,底下也可能已經被別人改動了。日誌不會讓世界變得可預測或可逆。它保留的是一份忠實、可接續的紀錄,記下代理做過什麼、看見什麼,而這正是你絕對不能失去的東西。存檔檔案也做了同樣的事:它不包含《上古卷軸 V》的引擎或地圖,只包含把你帶回遊戲所需的、玩家專屬狀態。而如果自從代理上次執行以來,世界已經改變,那代理就會像角色一樣,在重新與周遭互動時更新自己的世界觀。

自然產生的特性

用這種方式思考代理,會得到一組很好的系統特性。它們彼此並不獨立;它們都源自同一個假設:日誌就是代理。

  • 可靠性。以 Claude Code 為例,假設代理碰到權限提示時程序掛掉了,而你之後重新接續,它就不見了,代理也暫停了。這在生產環境中是不可接受的。當日誌就是代理時,執行器就可以是不可靠的:新的工作執行緒接手工作階段、重建狀態,而權限提示也會還在原來的位置。掛掉的是程序,不是代理。

  • 可擴充性。大多數執行框架是一個代理配一個程序,這表示代理綁定在執行它的機器上。當日誌就是狀態時,你就反轉這個模型:一個程序可以推進成千上萬個代理,而每個代理都在每一輪從日誌重建自己的狀態。代理不再綁定單一機器或工作執行緒,故障轉移也就變得很簡單。水平擴充只是增加更多工作執行緒而已:不需要黏性工作階段、不需要狀態遷移,也不需要協調額外負擔。

  • 分支。你不必只有一條線性的路徑;你可以把日誌分叉。一個分支跑 Claude,另一個跑 GPT,還有一個跑本機 Qwen,各自探索不同策略、在不同的沙盒中、使用不同工具。探索不同做法,在架構上會簡單很多。

  • 多人協作。分享一個代理,不該只是把逐字稿複製到 Slack。那就像截一張資料庫螢幕截圖,然後說這叫複寫一樣。如果日誌就是代理,分享就代表授權別人存取一份持久化歷史,讓對方可以檢視、接續或延伸它。

  • 遷移。如果代理的身分被困在供應商專屬假設裡,切換供應商就會很痛苦。如果日誌就是代理,遷移就變成一個轉接器問題。不同模型可能需要不同的投影,但那是工程問題,不是身分問題。日誌就是連續性,而代理應該能夠以任何模型供應商,無縫接手並繼續執行。

這只是少數幾個例子。當你開始用這種方式思考代理,它們就會變成資料的一種,而許多你能對資料做的事,也同樣能對代理做到。請到 DEV 閱讀本文其餘內容。更多資訊請見 link.dev.to/aie26。


原文出處:https://dev.to/dailycontext/the-log-is-the-agent-5096


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝15   💬3   ❤️3
629
🥈
我愛JS
📝2   💬3   ❤️3
116
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登