部落格
架構

發布於 更新於

Arag 和 Shouryamaan

如何為長時間執行的 AI 代理建立持久狀態

以 Markdown 閱讀

持久的代理狀態是一份結構化記錄,讓全新的 worker 能繼續工作,而不會重播已完成的操作,也不必從對話記錄猜測。它應指出目前步驟、已完成操作、等待中的訊號、重試狀態及下一個合法轉換。

狀態與記憶、業務資料、成果及稽核歷史不同。若將五者全都視為向量儲存中的同一份文件,復原會變得含糊,存取控制也會更困難。

分開五種儲存資訊

類型 它回答的問題 常見儲存位置
工作流程狀態 本次執行到哪裡?下一步能做什麼? 關聯式資料列或工作流程引擎
業務狀態 訂單、客戶或部署目前的真實狀況是什麼? 權威應用程式資料庫或供應商
記憶 哪些過往上下文可能幫助未來決策? 關聯式記錄、搜尋索引或向量儲存
成果 生成的檔案、報告或程式碼套件在哪裡? 附有中繼資料的物件儲存
稽核記錄 誰在何時決定並執行了什麼? 僅附加事件或稽核資料表

發票狀態屬於業務狀態;工作流程正在等待財務核准,屬於工作流程狀態;客戶偏好摘要可能屬於記憶;PDF 屬於物件儲存;核准決策則屬於稽核記錄。

完整的代理架構指南說明這些儲存系統如何連接工具與持久執行。

儲存狀態機,而不是文字摘要

使用明確狀態與允許的轉換:

stateDiagram-v2
    [*] --> Created
    Created --> Running
    Running --> WaitingForApproval
    WaitingForApproval --> Running: approved
    WaitingForApproval --> Cancelled: rejected or expired
    Running --> RetryScheduled: retryable failure
    RetryScheduled --> Running
    Running --> Completed
    Running --> Failed

工作資料列可以包含 state、state_version、current_step、attempt、wake_at、approval_id 及時間戳記。已完成副作用應透過操作記錄參照,而不是內嵌成模型自由文字。

在程式碼中定義合法轉換,並拒絕過期更新。模型可以提出轉換,但狀態層應判斷沒有核准記錄時,waiting_for_approval 能不能變成 completed。

讓並行 worker 安全地產生歧見

佇列可能重複傳送、lease 可能過期、較慢的 worker 可能在另一個 worker 已繼續同一工作後才完成。可透過版本欄位加入樂觀並行控制,或使用包含擁有者及到期時間的 lease。狀態更新應帶有讀取時的版本;若另一個 worker 已推進狀態,就讓更新失敗。

Lease 要與工作流程狀態分開。當機的 worker 應失去 lease,而不是把工作改成失敗。下一個 worker 能取得 lease、讀取持久狀態,再繼續執行。

在副作用前後建立檢查點

寫入前保存意圖,驗證完成後保存結果。如果逾時導致結果未知,應進入 reconciling 等狀態,而不是假裝步驟失敗。

持久執行指南會詳細說明冪等性與結果對應。狀態儲存的工作是保留操作參照,並在結果尚未解決時阻止不安全的轉換。

將人類等待保存成一級記錄

核准記錄應包含確切動作、資源、要求的權限範圍、請求者、核准者、到期時間、決策及政策版本。工作流程數小時後繼續時,重新檢查核准是否仍適用目前參數,以及其代表的使用者是否仍有存取權。

不要讓伺服器程序在等待時持續睡眠。保存條件,再由訊號或排程工作將下一個轉換排入佇列。Temporal 的持久執行模型使用事件歷史與訊號處理這類等待,但相同設計也能用資料庫及佇列實作。

讓狀態可版本化,避免遺棄舊執行

長時間工作可能跨越一次部署。儲存工作流程定義版本,並為作用中的狀態設計遷移。新 worker 應知道自己能直接讀取舊承載資料、需要遷移,或應繼續使用舊處理函式。

避免將整個模型上下文放進一個沒有版本的 JSON blob。JSON 適合存放步驟專用資料,但用於排程、授權、保留及操作的穩定欄位應明確定義並建立索引。

為每筆記錄設定保留規則

工作流程狀態完成後可以壓縮;稽核記錄可能需要保留更久;記憶應支援修正與刪除;成果需要到期時間與所有權中繼資料;業務資料則遵循產品本身的政策。

刪除必須跨越所有參照。如果移除使用者記憶,卻把同一份個人資料留在提示詞、追蹤及成果中,刪除就不完整。應儲存參照與分類,讓清理路徑能找到每一份副本。

使用空白程序測試恢復執行

在等待核准、供應商呼叫後及重試 backoff 期間停止 worker,再用沒有本機快取或對話物件的程序繼續。它應從持久狀態及權威後端記錄推導下一個動作。

下方提示詞會在建議變更前完成這項清查。任何只存在日誌文字或提示詞中的必要事實,都是具體的持久性缺口。