,而是失敗時(shí)誰在兜底?)
這篇我按“先跑起來、再講取舍”的方式寫《一次Agent項(xiàng)目復(fù)盤問題最后出在流程而不是模型》。概念會(huì)講但重點(diǎn)放在代碼怎么組織、哪里容易踩坑。摘要摘要上周把自研的 Agent 從 Demo 扔到協(xié)作環(huán)境結(jié)果不是模型不干活是權(quán)限日志和回滾機(jī)制徹底失效。本文基于一次真實(shí)上線事故復(fù)盤 Agent 工具調(diào)用、記憶與任務(wù)規(guī)劃中那些“模型不背鍋”的工程細(xì)節(jié)給出可落地的兜底方案。---目錄1. 為什么 Agent 在 Demo 里完美一上線就翻車2. 任務(wù)規(guī)劃別只盯著模型推理要管住“誰有權(quán)執(zhí)行”3. 工具調(diào)用權(quán)限隔離比 Prompt 更重要4. 記憶系統(tǒng)狀態(tài)管理不等于存?zhèn)€變量5. 失敗恢復(fù)日志、回滾、監(jiān)控三件套6. 實(shí)戰(zhàn)建議Agent 上線前的三把“安全鎖”---目錄為什么 Agent 在 Demo 里完美一上線就翻車任務(wù)規(guī)劃別只盯著模型推理要管住“誰有權(quán)執(zhí)行”工具調(diào)用權(quán)限隔離比 Prompt 更重要記憶系統(tǒng)狀態(tài)管理不等于存?zhèn)€變量失敗恢復(fù)日志、回滾、監(jiān)控三件套實(shí)戰(zhàn)建議Agent 上線前的三把“安全鎖”為什么 Agent 在 Demo 里完美一上線就翻車上周我們團(tuán)隊(duì)把自研的 AI Agent 從本地 Demo 推到了協(xié)作環(huán)境原本以為只要把 Prompt 調(diào)好、模型選強(qiáng)就行。結(jié)果第一個(gè)周末就出事故Agent 誤刪了生產(chǎn)測(cè)試庫(kù)的臨時(shí)表而且日志里連“誰干的”都查不到。這不是模型的問題是流程的問題。Agent 的核心不是“它能干什么”而是“它在出問題時(shí)誰能及時(shí)止損”。任務(wù)規(guī)劃別只盯著模型推理要管住“誰有權(quán)執(zhí)行”很多開發(fā)者寫 Agent 時(shí)把 80% 的精力花在讓模型更好地生成步驟。但真正決定 Agent 能不能上生產(chǎn)環(huán)境的是任務(wù)規(guī)劃中的權(quán)限控制。舉個(gè)例子一個(gè) Agent 要執(zhí)行“部署代碼 回滾配置”的任務(wù)模型可能會(huì)生成1. 檢查當(dāng)前代碼版本 2. 執(zhí)行部署腳本 3. 更新配置文件 4. 啟動(dòng)服務(wù)如果 Agent 沒有權(quán)限校驗(yàn)機(jī)制它可能直接執(zhí)行rm -rf /這樣的危險(xiǎn)操作而模型根本意識(shí)不到。我的做法是在任務(wù)規(guī)劃層加一層“權(quán)限過濾器”在執(zhí)行每個(gè)步驟前檢查操作權(quán)限def validate_permission(action: str, context: AgentContext) - bool: 權(quán)限驗(yàn)證函數(shù) if action delete_database: return context.user.role admin and context.environment test if action deploy_code: return context.user.role in [developer, admin] return True這個(gè)函數(shù)必須在任務(wù)執(zhí)行的每個(gè)節(jié)點(diǎn)前調(diào)用而不是等執(zhí)行完再檢查。工具調(diào)用權(quán)限隔離比 Prompt 更重要在團(tuán)隊(duì)協(xié)作場(chǎng)景中Agent 調(diào)用工具如 Git、數(shù)據(jù)庫(kù)、API是最容易越權(quán)的地方。我見過很多項(xiàng)目Prompt 寫得再好只要工具調(diào)用沒有隔離Agent 就能干出“越級(jí)操作”。我的方案是“工具沙箱”“操作審計(jì)”class ToolSandbox: def __init__(self, user_role: str, environment: str): self.allowed_actions self._get_allowed_actions(user_role, environment) def _get_allowed_actions(self, role: str, env: str) - set: # 根據(jù)角色和環(huán)境限制可執(zhí)行的操作 if role developer and env production: return {read_only} return {execute, deploy, rollback} def execute(self, tool_name: str, **kwargs): if tool_name not in self.allowed_actions: raise PermissionError(f無權(quán)執(zhí)行工具: {tool_name}) # 執(zhí)行工具并記錄日志 log_action(tool_name, kwargs)每次工具調(diào)用都要記錄操作人、時(shí)間、參數(shù)以便事后審計(jì)。記憶系統(tǒng)狀態(tài)管理不等于存?zhèn)€變量Agent 的記憶系統(tǒng)常被誤解為“記住之前對(duì)話的內(nèi)容”實(shí)際上在協(xié)作環(huán)境中記憶更多是“任務(wù)上下文 權(quán)限狀態(tài) 執(zhí)行歷史”。我們之前的 Agent 把記憶存在內(nèi)存里結(jié)果一重啟就丟了而且無法追溯。現(xiàn)在的做法是把記憶持久化到數(shù)據(jù)庫(kù)并打上“操作ID”標(biāo)簽class AgentMemory: def __init__(self): self.store {} # 持久化存儲(chǔ)如 Redis 或 DB def save(self, task_id: str, key: str, value: Any): self.store[f{task_id}:{key}] value log_memory_update(task_id, key, value) def retrieve(self, task_id: str, key: str) - Any: return self.store.get(f{task_id}:{key})這樣不僅能恢復(fù)狀態(tài)還能回溯 Agent 在某個(gè)任務(wù)中的決策路徑。失敗恢復(fù)日志、回滾、監(jiān)控三件套Agent 上線前我最關(guān)注的不是它有多聰明而是它掛了怎么辦。我們之前沒做失敗恢復(fù)結(jié)果一次執(zhí)行失敗導(dǎo)致數(shù)據(jù)不一致。現(xiàn)在的方案是1. 操作日志每個(gè)步驟都記錄入?yún)ⅰ⒊鰠ⅰ⒑臅r(shí)、錯(cuò)誤碼2. 自動(dòng)回滾對(duì)寫操作如刪除、修改必須配套回滾邏輯3. 異常監(jiān)控設(shè)置閾值當(dāng)錯(cuò)誤率超過 5% 自動(dòng)告警例如一個(gè)數(shù)據(jù)庫(kù)刪除操作的回滾邏輯def safe_delete(db: Database, table: str, user: User): log_before_delete(table, user) try: db.delete(table) log_after_delete(table, user) except Exception as e: log_failure(table, user, str(e)) trigger_rollback(table, user) # 觸發(fā)回滾 raise實(shí)戰(zhàn)建議Agent 上線前的三把“安全鎖”基于這次事故我總結(jié)了 Agent 上線前必須檢查的三點(diǎn)1. 權(quán)限鎖所有工具調(diào)用必須有權(quán)限校驗(yàn)且校驗(yàn)在調(diào)用前執(zhí)行2. 日志鎖所有操作包括讀必須記錄支持回溯3. 回滾鎖所有寫操作必須有對(duì)應(yīng)的回滾機(jī)制且回滾可測(cè)試如果這三點(diǎn)沒做到再?gòu)?qiáng)的模型也不該上線。Agent 不是模型的游戲是工程的產(chǎn)物。總結(jié)本文完成了關(guān)鍵概念、工程實(shí)踐和落地建議的梳理。資料展示下面是我整理的AI大模型學(xué)習(xí)資料和工具包預(yù)覽適合收藏后按主題逐步學(xué)習(xí)。如果你想看完整資料目錄可以在評(píng)論區(qū)留言「資料」也歡迎告訴我你更關(guān)注AI大模型里的哪類內(nèi)容。