”運(yùn)行時(shí))
“Agent 即操作系統(tǒng)”這個(gè)說(shuō)法第一次看到時(shí)我覺(jué)得又是一輪熱詞營(yíng)銷(xiāo)。但后來(lái)真把一個(gè)帶工具調(diào)用、多智能體協(xié)作、長(zhǎng)任務(wù)拆解的系統(tǒng)放到生產(chǎn)環(huán)境里跑我發(fā)現(xiàn)自己每天都在用的概念全是操作系統(tǒng)的老概念調(diào)度、上下文管理、權(quán)限、觀測(cè)、故障隔離。這讓我重新開(kāi)始思考我們可能在經(jīng)歷一個(gè)真正意義上的平臺(tái)遷移而這個(gè)遷移的核心隱藏術(shù)語(yǔ)不是“大模型”而是“Agent Harness Engineering”。這篇文章我準(zhǔn)備從工程視角把這層窗戶(hù)紙捅開(kāi)為什么說(shuō) Agent 會(huì)像操作系統(tǒng)一樣成為計(jì)算平臺(tái)的中樞Harness 到底在解決什么問(wèn)題一個(gè)能落地的 Harness 架構(gòu)大概長(zhǎng)什么樣以及過(guò)程中會(huì)遇到哪些我實(shí)際踩過(guò)的坑。適合正在做 Agent 應(yīng)用、做 AI 基礎(chǔ)設(shè)施、或者只是好奇“未來(lái)計(jì)算平臺(tái)到底會(huì)怎樣演化”的讀者。我的判斷是未來(lái)兩年能否把 Agent 穩(wěn)定、安全、可控地跑起來(lái)取決于你有沒(méi)有把這層“殼”當(dāng)回事。1. “Agent 即操作系統(tǒng)”到底在說(shuō)什么1.1 它不是營(yíng)銷(xiāo)話(huà)術(shù)一套運(yùn)行時(shí)該解決的事我們先別急著討論“會(huì)不會(huì)”先討論“像不像”。操作系統(tǒng)解決的核心問(wèn)題是如何把硬件資源抽象成一個(gè)個(gè)可管理的進(jìn)程再把這些進(jìn)程和外部設(shè)備、存儲(chǔ)、網(wǎng)絡(luò)安全地組織起來(lái)?,F(xiàn)代 Agent 系統(tǒng)面對(duì)的問(wèn)題幾乎是同構(gòu)的。一個(gè)大模型 Agent 有上下文窗口類(lèi)似內(nèi)存、工具調(diào)用能力類(lèi)似系統(tǒng)調(diào)用、任務(wù)規(guī)劃循環(huán)類(lèi)似進(jìn)程調(diào)度、外部工具網(wǎng)絡(luò)類(lèi)似設(shè)備驅(qū)動(dòng)、環(huán)境權(quán)限策略類(lèi)似用戶(hù)權(quán)限控制。任何一個(gè)環(huán)節(jié)失控整個(gè)系統(tǒng)就會(huì)崩掉上下文被塞滿(mǎn)Agent“失憶”工具權(quán)限沒(méi)限制結(jié)果它把整個(gè)數(shù)據(jù)目錄刪了任務(wù)規(guī)劃循環(huán)沒(méi)有退出條件兩個(gè)子任務(wù)互相依賴(lài)永遠(yuǎn)等不到終止信號(hào)。你會(huì)發(fā)現(xiàn)這已經(jīng)完全不是“把 Prompt 寫(xiě)好”就能解決的問(wèn)題了。它要求一個(gè)工程上非常成熟的控制層。這個(gè)控制層在業(yè)界被越來(lái)越多人叫做 Agent Harness也就是所謂的“約束框架”“運(yùn)行骨架”里面的工程實(shí)踐就是 Agent Harness Engineering。我舉個(gè)例子傳統(tǒng)操作系統(tǒng)用進(jìn)程管理來(lái)做資源隔離和恢復(fù)。某個(gè)進(jìn)程掛掉了內(nèi)核會(huì)回收它的內(nèi)存釋放它的文件句柄把崩潰信息寫(xiě)到日志里然后調(diào)度器繼續(xù)跑別的進(jìn)程。Agent 場(chǎng)景里你同樣需要這個(gè)機(jī)制Agent A 在調(diào)一個(gè)外部 API 時(shí)掛了你總不希望整個(gè)任務(wù)鏈都跟著死掉吧你希望超時(shí)觸發(fā)、退避重試、把失敗任務(wù)標(biāo)記出來(lái)、把該回收的 token 預(yù)算拿回來(lái)然后讓主流程往別的分支走。這個(gè)機(jī)制不會(huì)自己長(zhǎng)出來(lái)全部要靠 Harness 做進(jìn)去。1.2 一份懷舊的映射表從操作系統(tǒng)到 Agent 運(yùn)行時(shí)為了更好溝通我把它整理成一份對(duì)照關(guān)系和團(tuán)隊(duì)討論時(shí)也經(jīng)常直接用它當(dāng)目錄操作系統(tǒng)概念A(yù)gent 運(yùn)行時(shí)對(duì)應(yīng)物不做的后果進(jìn)程一次任務(wù)執(zhí)行流程也就是 Agent Run任務(wù)無(wú)法追溯中斷后救不回來(lái)內(nèi)存上下文窗口 / 工作上下文字段上下文塞滿(mǎn)后關(guān)鍵信息被裁掉調(diào)度器任務(wù)規(guī)劃循環(huán)、子任務(wù)拆分與合并多任務(wù)互相阻塞效率無(wú)法保證設(shè)備驅(qū)動(dòng)工具適配層函數(shù)調(diào)用 schema 與執(zhí)行工具沖突、接口參數(shù)錯(cuò)亂用戶(hù)權(quán)限工具權(quán)限策略 / 環(huán)境隔離權(quán)限過(guò)大Agent 篡改關(guān)鍵數(shù)據(jù)日志系統(tǒng)Trace / 過(guò)程記錄出錯(cuò)時(shí)無(wú)法定位是哪一步哪個(gè)工具出的問(wèn)題睡眠喚醒機(jī)制長(zhǎng)期記憶 / 外部持久化狀態(tài)任務(wù)中斷后無(wú)法恢復(fù)進(jìn)度我見(jiàn)過(guò)不少團(tuán)隊(duì)來(lái)來(lái)回回討論“服務(wù)端 Agent 怎么設(shè)計(jì)”大家爭(zhēng)執(zhí)的內(nèi)容幾乎全是操作系統(tǒng)的設(shè)計(jì)思想。沒(méi)有這套 Harness你只能得到一個(gè)“單次對(duì)話(huà)式”的智能應(yīng)用你問(wèn)一句它答一句不能自己安排多個(gè)步驟去解決問(wèn)題。而有了這套 Harness模型才能成為執(zhí)行復(fù)雜任務(wù)的引擎工具才能成為可以被安全調(diào)用的外設(shè)數(shù)據(jù)才能被最小化暴露。操作系統(tǒng)目前是計(jì)算設(shè)備的底座。如果 Agent 真的是新的應(yīng)用形態(tài)那 Agent Harness 就會(huì)成為新的計(jì)算底座的一部分。2. Agent Harness Engineering 在解決什么2.1 六個(gè)繞不開(kāi)的子系統(tǒng)拿我實(shí)際做過(guò)的生產(chǎn)級(jí) Agent 項(xiàng)目拆開(kāi)看一個(gè) Harness 至少要承擔(dān)六件事上下文管理給上下文定預(yù)算、做壓縮、做摘要、控制“哪些信息必須常駐、哪些信息可以被歸檔”。工具接入與管理把外部 API、數(shù)據(jù)庫(kù)、代碼執(zhí)行環(huán)境封裝成“可以安全調(diào)用的函數(shù)”定義函數(shù) schema、鑒權(quán)、超時(shí)、重試。記憶 / 狀態(tài)管理臨時(shí)狀態(tài)和永久記憶要分開(kāi)。臨時(shí)狀態(tài)類(lèi)似于“進(jìn)程里的變量”任務(wù)結(jié)束就釋放長(zhǎng)期記憶要落到外部存儲(chǔ)里。權(quán)限與安全沙箱決定一個(gè) Agent 到底能調(diào)用哪些工具、讀取哪些內(nèi)容、寫(xiě)入哪些系統(tǒng)、訪(fǎng)問(wèn)哪些數(shù)據(jù)范圍。權(quán)限邊界不能寬到讓 Agent 為所欲為??捎^測(cè)性與追蹤記錄一個(gè)任務(wù)里的每一步思考、每一個(gè)工具返回、每一處狀態(tài)變更方便事后回溯。評(píng)測(cè)與閉環(huán)光能跑起來(lái)不算完成你得能量化跑得好不好針對(duì)典型任務(wù)做回歸測(cè)試和分?jǐn)?shù)對(duì)比。這六個(gè)子系統(tǒng)缺哪個(gè)都能跑 Demo但只要到了生產(chǎn)少了任何一個(gè)都會(huì)以最難看的方式暴雷。2.2 它和提示工程、模型訓(xùn)練根本不是一回事行業(yè)里經(jīng)常有人把 Agent 做得不好歸咎于“提示詞不行”或“模型不夠聰明”。在我看來(lái)這是一個(gè)認(rèn)知錯(cuò)誤。提示工程解決的是“怎么讓模型在本輪對(duì)話(huà)里給出更合適的回應(yīng)”模型訓(xùn)練解決的是“在語(yǔ)料里學(xué)到一個(gè)能力”。而 Harness 解決的是“如何讓模型在一個(gè)受控的運(yùn)行時(shí)里安全、可靠、可觀測(cè)地完成一個(gè)可能超出單輪對(duì)話(huà)的任務(wù)?!边@兩者的邊界我是在一個(gè)具體事故里徹底分清的。曾經(jīng)做一個(gè)多步驟研究 Agent用戶(hù)給了一個(gè)很寬泛的問(wèn)題Agent 自己拆出來(lái) 12 個(gè)子問(wèn)題一個(gè)接一個(gè)去搜索。結(jié)果到第 9 個(gè)子問(wèn)題時(shí)前面的搜索上下文已經(jīng)快撐爆窗口它開(kāi)始拿第 4 個(gè)子問(wèn)題的答案去回答第 9 個(gè)問(wèn)題。我當(dāng)時(shí)補(bǔ)了多少句話(huà)術(shù)都不管用因?yàn)閱?wèn)題根子不在提示詞而在上下文管理層根本沒(méi)有做“預(yù)算控制”和“階段性壓縮”。我最后在 Harness 里加了一個(gè)上下文管理模塊每完成 3 個(gè)子問(wèn)題就把前 3 個(gè)的結(jié)論摘要成一個(gè)緊湊的“研究工作筆記”丟進(jìn)長(zhǎng)期記憶再把原始細(xì)節(jié)清出上下文系統(tǒng)才恢復(fù)正常。如果你能把“提示詞解決不了的問(wèn)題”識(shí)別為“運(yùn)行時(shí)問(wèn)題”你就走到正確的工程思路上來(lái)了。2.3 “會(huì)調(diào) API”不等于“能讓 Agent 干活”還有一個(gè)常見(jiàn)的坑以為給 Agent 接上幾個(gè) API就等于擁有了一個(gè)“能幫你干活的智能體”?,F(xiàn)實(shí)是沒(méi)有 Harness 的 API 調(diào)用本質(zhì)上就是一段單輪問(wèn)答加強(qiáng)版它連一個(gè)跨 20 分鐘的長(zhǎng)任務(wù)都沒(méi)法穩(wěn)定完成因?yàn)樗鼪](méi)有狀態(tài)管理沒(méi)有恢復(fù)機(jī)制沒(méi)有上下文清理能力。我們做個(gè)最簡(jiǎn)單的推演。任務(wù)幫用戶(hù)收集三家供應(yīng)商的報(bào)價(jià)并輸出對(duì)比表格。理論上Agent 需要搜索供應(yīng)商 A 的網(wǎng)頁(yè) → 讀取報(bào)價(jià)單 → 記錄 → 搜索供應(yīng)商 B → 記錄 → 搜索供應(yīng)商 C → 記錄 → 對(duì)比。這還沒(méi)算網(wǎng)頁(yè)下載失敗、數(shù)據(jù)格式不一致、廠商頁(yè)面有反爬驗(yàn)證這些中段才出現(xiàn)的意外情況。沒(méi)有 Harness模型一旦走到第 3 步發(fā)現(xiàn)連不上網(wǎng)頁(yè)往往就直接“自由發(fā)揮”要么編一個(gè)假價(jià)格要么把已經(jīng)采集到的 A 數(shù)據(jù)丟掉重新開(kāi)始。而有了 Harness你可以在代碼里規(guī)定“抓取失敗就換一個(gè)可替代的信息源”“已采集到的結(jié)構(gòu)化數(shù)據(jù)要持久化到任務(wù)內(nèi)存里不能因?yàn)橐淮问【蛠G”“如果某個(gè)數(shù)據(jù)源反復(fù)失敗則標(biāo)記為缺失并在最終報(bào)告里如實(shí)說(shuō)明”。你發(fā)現(xiàn)沒(méi)有這些規(guī)則本質(zhì)上跟模型是否聰明已經(jīng)完全脫鉤了它是一套工程規(guī)范。**Agent 的“能力上限”靠模型決定但它的“能力下限”靠 Harness 保證。**生產(chǎn)環(huán)境里我們更關(guān)心下限。3. 一個(gè)可落地的 Harness 架構(gòu)設(shè)計(jì)3.1 設(shè)計(jì)原則不超過(guò)一百行的思考清單我復(fù)盤(pán)了實(shí)際上手過(guò)的幾個(gè)版本有一個(gè)原則非常關(guān)鍵Harness 永遠(yuǎn)要在朝著“系統(tǒng)化”演進(jìn)而不是朝“裝飾性殼子”演進(jìn)。具體拆下來(lái)有五條工具先于模型先把 Agent 能干什么固化下來(lái)定義好工具 schema 和調(diào)用邊界再設(shè)計(jì) Prompt。上下文是有限資源它就像操作系統(tǒng)里的內(nèi)存要有預(yù)算表要有主動(dòng)壓縮策略不能放任自然增長(zhǎng)。默認(rèn)最小權(quán)限Agent 的權(quán)限永遠(yuǎn)只給當(dāng)前任務(wù)真正需要的最小集合。一切行為皆可追溯每一步都要有 trace ID每個(gè)工具調(diào)用都要記錄入?yún)ⅰ⒊鰠?、耗時(shí)。失敗是預(yù)期內(nèi)的事件把超時(shí)、重試、降級(jí)、退出寫(xiě)到設(shè)計(jì)里而不是等到事故爆發(fā)再救火。這五條可能看起來(lái)像正確的廢話(huà)實(shí)際上每一條在實(shí)際落地時(shí)都對(duì)應(yīng)一套具體代碼結(jié)構(gòu)。下面展開(kāi)講。3.2 運(yùn)行時(shí)核心模塊與流程我通常會(huì)把運(yùn)行時(shí)組織成這幾個(gè)模塊描述式地把它們當(dāng)成“內(nèi)部操作系統(tǒng)”的幾個(gè)子系統(tǒng)任務(wù)調(diào)度循環(huán)主循環(huán)負(fù)責(zé)完成任務(wù)拆解和步驟執(zhí)行。每次從“待辦隊(duì)列”提取一個(gè)目標(biāo)在上下文允許的范圍內(nèi)讓模型產(chǎn)出“下一步動(dòng)作Action”再把這個(gè)動(dòng)作路由給工具執(zhí)行器。循環(huán)的退出條件必須明確要么所有目標(biāo)完成要么達(dá)到最大步數(shù)上限要么發(fā)生無(wú)法恢復(fù)的錯(cuò)誤且沒(méi)有 fallback。工具注冊(cè)表一個(gè)工具注冊(cè)中心。每個(gè)工具需要提供函數(shù)名和自然語(yǔ)言描述入?yún)⒑统鰠⒌?JSON Schema一個(gè)校驗(yàn)器用 Schema 對(duì)模型的輸出做校驗(yàn)錯(cuò)了就要求重新生成一個(gè)執(zhí)行器對(duì)應(yīng)到真正的 API 調(diào)用或代碼執(zhí)行超時(shí)設(shè)置和最大重試次數(shù)權(quán)限標(biāo)簽例如“只讀”“寫(xiě)內(nèi)部臨時(shí)文件”“可執(zhí)行外部命令”。上下文管理器維護(hù)一個(gè)上下文內(nèi)存池動(dòng)態(tài)決定哪些內(nèi)容放進(jìn)模型、哪些內(nèi)容放進(jìn)摘要、哪些內(nèi)容落盤(pán)為長(zhǎng)期記憶。有一個(gè)預(yù)算系統(tǒng)提示占多少、工具定義占多少、當(dāng)前任務(wù)內(nèi)容占多少、歷史摘要占多少、最近中間結(jié)果占多少都在預(yù)算表里。狀態(tài)存儲(chǔ)把任務(wù)的中間狀態(tài)序列化到 Redis 或 PostgreSQL 之類(lèi)的外部存儲(chǔ)里。這樣就算服務(wù)重啟Agent 也可以從斷點(diǎn)恢復(fù)。沙箱執(zhí)行環(huán)境工具調(diào)用不等于直接裸奔到生產(chǎn)環(huán)境。代碼執(zhí)行類(lèi)工具放進(jìn)容器里運(yùn)行數(shù)據(jù)庫(kù)操作默認(rèn)走只讀事務(wù)外部網(wǎng)絡(luò)請(qǐng)求走可控出口。權(quán)限底座由 Harness 統(tǒng)一管理。跟蹤器Tracer)每個(gè)任務(wù)一個(gè) Trace ID每個(gè)工具調(diào)用一個(gè) Span ID。每個(gè) Span 記錄調(diào)用了什么、入?yún)⑹鞘裁?、返回了什么、耗時(shí)多少、有沒(méi)有報(bào)錯(cuò)、有哪些相關(guān)子步驟。3.3 上下文管理那筆必須精打細(xì)算的“內(nèi)存賬”給上下文做預(yù)算本質(zhì)上是在說(shuō)“你只有有限的錢(qián)但你需要完成一個(gè)復(fù)雜旅程”。我用一個(gè)約定俗成的預(yù)算配比來(lái)說(shuō)明系統(tǒng)指令與全局規(guī)則約占 5%-10%常駐不動(dòng)的部分告訴模型“你是誰(shuí)你該如何表現(xiàn)”。工具定義與使用說(shuō)明約占 15%-25%。工具數(shù)量太大會(huì)擠占預(yù)算這時(shí)要做工具分層加載只加載當(dāng)前任務(wù)步驟可能用到的工具。當(dāng)前任務(wù)的原始輸入和目標(biāo)約占 10%-15%。必須常駐這是“任務(wù)說(shuō)明”。中間過(guò)程摘要約占 20%-30%來(lái)自之前完成步驟的結(jié)論摘要。當(dāng)前步驟相關(guān)內(nèi)容約占 25%-40%就是最近兩三輪 Action / Observation 的原始內(nèi)容。這個(gè)配比不是死的但它逼著你思考一個(gè)重要問(wèn)題你的上下文里必須存在什么哪些可以刪除哪些可以壓縮哪些必須原樣保留分類(lèi)完之后還要有一個(gè)“壓縮與恢復(fù)機(jī)制”當(dāng)所需內(nèi)容超出預(yù)算時(shí)Harness 先把當(dāng)前步驟最近的原始交互保留再壓縮最遠(yuǎn)的舊步驟同時(shí)把壓縮前的原始信息寫(xiě)入長(zhǎng)期記憶存儲(chǔ)保證后續(xù)任務(wù)還有恢復(fù)的可能。我自己最喜歡用的策略是“結(jié)論筆記 原始分片”每完成一個(gè)子任務(wù)就自動(dòng)把子任務(wù)的結(jié)論整理成筆記同時(shí)把對(duì)應(yīng)原始工具返回內(nèi)容分片存儲(chǔ)到外部數(shù)據(jù)庫(kù)上下文長(zhǎng)文只保留筆記。用戶(hù)追問(wèn)細(xì)節(jié)時(shí)再按筆記里的索引去外部存儲(chǔ)里檢索原始分片。這讓長(zhǎng)任務(wù) Agent 能夠在有限上下文里“走得更遠(yuǎn)”。3.4 工具接口把“外部能力”變成安全的可調(diào)用函數(shù)工具層是大量事故的高發(fā)區(qū)。工具定義得好Agent 會(huì)像裝了瑞士軍刀定義得亂它就像一個(gè)把所有按鈕都做在正面而且沒(méi)有防誤觸的爆炸裝置。我會(huì)要求每種工具都滿(mǎn)足這個(gè)模式一個(gè)自然語(yǔ)言描述盡量說(shuō)清楚“何時(shí)該用這個(gè)工具”。這決定模型調(diào)用的準(zhǔn)確率。一個(gè)嚴(yán)格 JSON Schema 入?yún)⒍x。模型一旦輸出不合法參數(shù)校驗(yàn)器直接拒絕并給出錯(cuò)誤信息要求重新生成。一個(gè)返回值格式化器把原始響應(yīng)整理成對(duì)后續(xù)步驟友好的結(jié)構(gòu)化文本盡量抹掉無(wú)關(guān)噪聲。一個(gè)安全控制層負(fù)責(zé)鑒權(quán)、限速、白名單、數(shù)據(jù)脫敏。舉個(gè)例子一個(gè)“查詢(xún)訂單物流”的工具入?yún)⒍x為order_id字符串必須匹配訂單號(hào)前綴和query_type枚舉只允許 “l(fā)atest_status” 和 “full_trace”。校驗(yàn)器拿到模型輸出后先校驗(yàn)參數(shù)不合法直接拒絕。返回格式化器再把物流記錄整理成“時(shí)間 環(huán)節(jié) 狀態(tài)描述”。這樣模型后續(xù)就不需要看大量 JSON 原始響應(yīng)既能省 token又不容易從中“腦補(bǔ)”出錯(cuò)誤信息。如果你有幾十個(gè)工具還面臨一個(gè)被稱(chēng)為“工具爆炸”的問(wèn)題模型面對(duì) 40 個(gè)工具時(shí)的選擇準(zhǔn)確率明顯低于面對(duì) 8 個(gè)工具。解決方案就是做工具分層一個(gè)頂層工具是“導(dǎo)航工具”告訴模型“你現(xiàn)在這個(gè)需求應(yīng)該跳轉(zhuǎn)到哪個(gè)能力組”每個(gè)能力組內(nèi)部再由“跳轉(zhuǎn)后的子模型”去調(diào)用具體工具。這在多階段任務(wù)場(chǎng)景下尤其明顯。4. 運(yùn)行中的“操作系統(tǒng)”調(diào)度、可靠性與可觀測(cè)性4.1 調(diào)度與資源控制多 Agent 并行時(shí)的“進(jìn)程管理”真實(shí)生產(chǎn)系統(tǒng)很少只有一個(gè) Agent。我實(shí)際跑過(guò)的系統(tǒng)往往是一個(gè)主控 Agent 負(fù)責(zé)最終目標(biāo)拆解多個(gè)執(zhí)行 Agent 并行去完成各自的子任務(wù)比如一個(gè)是搜索信息一個(gè)是查內(nèi)部數(shù)據(jù)庫(kù)一個(gè)是寫(xiě)代碼。然后主控 Agent 收集執(zhí)行 Agent 的結(jié)果做綜合決策。這帶來(lái)了一個(gè)典型的“操作系統(tǒng)”問(wèn)題如何調(diào)度多個(gè)執(zhí)行 Agent 的資源使用和運(yùn)行生命周期才能不餓死主控我最終采用的策略像一個(gè)協(xié)作式多任務(wù)模型每個(gè)執(zhí)行 Agent 是獨(dú)立的 worker跑在獨(dú)立的“執(zhí)行槽位”上有獨(dú)立的最大步數(shù)和超時(shí)時(shí)間。主控 Agent 只負(fù)責(zé)分配任務(wù)、收結(jié)果不阻塞等待執(zhí)行期間的空轉(zhuǎn)。執(zhí)行 Agent 返回結(jié)果后主控再去匯總。如果某個(gè)執(zhí)行 Agent 超時(shí)或連續(xù)失敗主控必須能繼續(xù)處理“部分成功”的結(jié)果而不是整體崩潰做不到這一步就加一個(gè)中轉(zhuǎn)兜底把未完成項(xiàng)標(biāo)記為“待人工確認(rèn)”讓系統(tǒng)流向下游。這里面最考驗(yàn)工程能力的一點(diǎn)是整體失敗不等于局部失敗。局部失敗可以如實(shí)記錄后續(xù)步驟照走。這個(gè)原則也會(huì)反過(guò)來(lái)影響你的 Prompt 設(shè)計(jì)你要在系統(tǒng)指令里告訴模型“某個(gè)子任務(wù)失敗后請(qǐng)繼續(xù)執(zhí)行其他子任務(wù)并在最終報(bào)告里明確列出失敗項(xiàng)”。4.2 可觀測(cè)性看一個(gè) Agent 的“進(jìn)程狀態(tài)”而不只是網(wǎng)絡(luò)請(qǐng)求傳統(tǒng)后端觀測(cè)是“得到 response 就完事”。Agent 系統(tǒng)完全不是一個(gè)邏輯它不止一次外部請(qǐng)求而是一連串的思考 工具調(diào)用循環(huán)。一個(gè)用戶(hù)提問(wèn)背后可能對(duì)應(yīng) 20 次模型調(diào)用、14 次工具調(diào)用其中 2 次失敗重試。這類(lèi)系統(tǒng)出問(wèn)題時(shí)光是看日志根本沒(méi)戲。你要看的是完整的 Trace任務(wù)是怎么從“用戶(hù)問(wèn)題”一步步流轉(zhuǎn)到“工具調(diào)用”中間模型做了哪些決策工具返回了什么模型如何基于返回修正計(jì)劃什么時(shí)候產(chǎn)生了分流和匯總。我用四個(gè)維度來(lái)組織可觀測(cè)性數(shù)據(jù)任務(wù)維度一條 Trace 記錄一個(gè)用戶(hù)任務(wù)的全過(guò)程。步驟維度任務(wù)里每一步模型思考、動(dòng)作選擇、工具調(diào)用、返回結(jié)果拆成獨(dú)立 Span。狀態(tài)維度記錄上下文預(yù)算的消耗、當(dāng)前步驟棧、待辦隊(duì)列長(zhǎng)短、已經(jīng)完成子任務(wù)數(shù)量。結(jié)果維度最終產(chǎn)出是什么哪些子任務(wù)成功、哪些失敗、耗時(shí)多少、成本多少?!翱吹?Agent 的思考過(guò)程”的價(jià)值在于當(dāng)模型做出一個(gè)錯(cuò)誤判斷時(shí)你能看到它當(dāng)時(shí)看到的上下文是什么。之前有個(gè)典型 caseAgent 把用戶(hù)指令理解偏了我們糾了很久但查完 Trace 才發(fā)現(xiàn)是工具返回中夾雜了一段無(wú)關(guān)的推廣信息模型被這段噪聲帶跑了。工具返回值不加清理污染后續(xù)決策這就是 Harness 層面的問(wèn)題如果不靠 Trace你永遠(yuǎn)以為是 Prompt 寫(xiě)得不好。4.3 從 Trace 到評(píng)測(cè)閉環(huán)的“質(zhì)檢體系”有觀測(cè)只是第一步真正的閉環(huán)還需要一整套評(píng)測(cè)機(jī)制。我的做法是準(zhǔn)備一個(gè)“評(píng)測(cè)任務(wù)集”覆蓋典型任務(wù)和邊界案例例如信息檢索任務(wù)、數(shù)據(jù)處理任務(wù)、工具調(diào)用失敗任務(wù)、上下文極端長(zhǎng)任務(wù)。每次 Harness 或 Prompt 改動(dòng)都把這個(gè)任務(wù)集跑一遍。用“過(guò)程指標(biāo)” “結(jié)果指標(biāo)”雙通道評(píng)估過(guò)程指標(biāo)工具調(diào)用成功率、上下文超預(yù)算率、平均步數(shù)、總耗時(shí)、失敗重試率。結(jié)果指標(biāo)最終回答是否滿(mǎn)足用戶(hù)目標(biāo)。這個(gè)可以人工評(píng)分也可以用一個(gè)大模型裁判按規(guī)則打分。對(duì)比同一批任務(wù)在“新版本 vs 舊版本”的得分變化得分回退就回滾。這個(gè)機(jī)制解決的核心問(wèn)題是你改了一行 Harness 代碼到底全局變好還是變壞不能被個(gè)案感覺(jué)左右要有一組數(shù)據(jù)證明。實(shí)際過(guò)程中評(píng)測(cè)的“一致性”比“速度”重要得多。我會(huì)固定一套評(píng)測(cè)用例、一套評(píng)分標(biāo)準(zhǔn)、同樣的隨機(jī)種子。分?jǐn)?shù)偶爾高一點(diǎn)或低一點(diǎn)都可以接受但趨勢(shì)要足夠穩(wěn)定。5. 常見(jiàn)問(wèn)題與避坑實(shí)錄5.1 工具爆炸模型在大量工具面前開(kāi)始“選擇困難”這是接入第三方工具時(shí)幾乎必然發(fā)生的事。工具一多模型選擇準(zhǔn)確率就下降經(jīng)常拿錯(cuò)工具參數(shù)也填錯(cuò)。踩過(guò)坑之后我把工具分成了三層第一層只有 5 個(gè)左右“入口工具”比如“搜索網(wǎng)絡(luò)”“查詢(xún)內(nèi)部知識(shí)庫(kù)”“執(zhí)行代碼”“調(diào)用數(shù)據(jù)庫(kù)查詢(xún)”“讀取郵件”。第二層是每個(gè)入口工具內(nèi)部的具體動(dòng)作。比如“數(shù)據(jù)庫(kù)查詢(xún)”下面才分“執(zhí)行只讀 SQL”“獲取表結(jié)構(gòu)”“查看 schema”。第三層是更細(xì)的輔助操作。模型首先決定“現(xiàn)在這個(gè)任務(wù)該走哪個(gè)入口”然后由 Harness 把對(duì)應(yīng)子工具的詳細(xì) schema 注入到上下文讓模型在那一層里做選擇。一次上下文里永遠(yuǎn)只有當(dāng)前階段會(huì)用到的工具不把全部 90 個(gè)工具一股腦塞給模型。這個(gè)過(guò)程就像在一個(gè)大型 IDE 里手寫(xiě)代碼你不會(huì)把倉(cāng)庫(kù)里所有函數(shù)引用一次性全部導(dǎo)入而是按需引入避免命名空間互相干擾。5.2 上下文碎片化與 API 成本失控長(zhǎng)任務(wù)跑著跑著上下文越來(lái)越滿(mǎn)模型開(kāi)始反復(fù)遺忘用戶(hù)最初指令。最離譜的一次一個(gè)任務(wù)跑 40 分鐘光 token 消耗就是預(yù)期的 6 倍而且答案質(zhì)量越來(lái)越差。問(wèn)題的根因是我們?cè)谏舷挛睦锉A袅颂嘀虚g過(guò)程的原始輸出沒(méi)有做“結(jié)論重構(gòu)”。后來(lái)我做了三件事給每個(gè)子任務(wù)生成“工作筆記”用一個(gè)標(biāo)準(zhǔn)的“目標(biāo) / 步驟 / 結(jié)論 / 下一步”模板寫(xiě)入上下文。對(duì)超過(guò)預(yù)算的內(nèi)容Harness 定期執(zhí)行“上下文壓縮”把舊內(nèi)容摘要化原文轉(zhuǎn)移到外部存儲(chǔ)。對(duì)用戶(hù)核心目標(biāo)始終做一個(gè)“priority directive”強(qiáng)行固定在上下文的頭部壓縮時(shí)不允許裁掉。成本失控的另一個(gè)重要源頭是“過(guò)度重試”。工具調(diào)用失敗后如果設(shè)置了無(wú)限重試Agent 會(huì)像死循環(huán)一樣反復(fù)烤同一個(gè) API。我的規(guī)則是**最多重試 2 次然后標(biāo)記失敗、更換策略或者請(qǐng)求人工確認(rèn)。**對(duì)單次工具調(diào)用的最大 token 消耗也要設(shè)置上限以防模型在一次調(diào)用里生成過(guò)量?jī)?nèi)容。5.3 安全邊界與權(quán)限模型混亂Agent 權(quán)限方案是整個(gè)體系里最不能含糊的部分。我把它們的策略歸結(jié)為“最小權(quán)限 顯式授權(quán) 動(dòng)態(tài)環(huán)境”。最小權(quán)限Agent 默認(rèn)只擁有完成任務(wù)所需的最小權(quán)限集合不做任何“順手”操作。比如查庫(kù)存的工具開(kāi)的是只讀數(shù)據(jù)庫(kù)連接對(duì)接訂單系統(tǒng)時(shí)分環(huán)境讀數(shù)據(jù)歸讀數(shù)據(jù)寫(xiě)狀態(tài)走獨(dú)立受限接口。顯式授權(quán)涉及寫(xiě)操作、刪除、發(fā)消息給外部用戶(hù)等敏感動(dòng)作時(shí)Harness 在流程中顯式插入一個(gè)“人工確認(rèn)步驟”不讓模型直接執(zhí)行。動(dòng)態(tài)環(huán)境代碼執(zhí)行類(lèi)工具一律放到一次性容器里跑跑完銷(xiāo)毀。容器內(nèi)沒(méi)有生產(chǎn)環(huán)境密鑰外部網(wǎng)絡(luò)默認(rèn)不通需要出口才開(kāi)專(zhuān)項(xiàng)白名單。曾經(jīng)有個(gè)項(xiàng)目差點(diǎn)出事Agent 被授權(quán)了一個(gè)“查詢(xún)內(nèi)部 API”的通用憑據(jù)結(jié)果它在某個(gè)工具調(diào)用里順手調(diào)用了內(nèi)部“刪除臨時(shí)任務(wù)”的接口好在我們把寫(xiě)操作都擋在沙箱外了不然那一次事故就要演變成一場(chǎng)真實(shí)生產(chǎn)事故。權(quán)限永遠(yuǎn)不要開(kāi)“所有”這兩個(gè)字。5.4 過(guò)程不可復(fù)現(xiàn)問(wèn)題無(wú)法定位很多 Agent 系統(tǒng)做到后來(lái)最讓人頭疼的是同一個(gè)用戶(hù)問(wèn)題兩次跑出來(lái)的行為可能完全不同你根本沒(méi)法判斷某個(gè)改動(dòng)到底產(chǎn)生了什么效果。我最后把所有隨機(jī)性控制在一個(gè)可管理的范圍里給每次任務(wù)分配全局 Run ID并把它傳到模型調(diào)用、工具調(diào)用的所有日志里。對(duì)模型采樣參數(shù)設(shè)固定值或低溫度。雖然模型仍然有一定的隨機(jī)性但降低到可接受的復(fù)現(xiàn)程度。每個(gè)任務(wù)開(kāi)頭記錄模型版本、Harness 版本、上下文預(yù)算法則、工具列表快照。這樣你才能把“任務(wù)在 A 版本下成功、在 B 版本下失敗”這樣的回歸事實(shí)確認(rèn)下來(lái)再定位是因?yàn)楦牧?Prompt、工具定義還是上下文策略。沒(méi)有這套可復(fù)現(xiàn)機(jī)制評(píng)測(cè)和調(diào)優(yōu)就是一場(chǎng)猜謎游戲。6. 邊界與大問(wèn)題什么場(chǎng)景不適合做 Agent6.1 確定性流程不該強(qiáng)行“智能體化”這個(gè)判斷十分重要。你在生產(chǎn)環(huán)境里大部分真實(shí)任務(wù)其實(shí)不需要 Agent比如固定流程的對(duì)賬、固定規(guī)則的參數(shù)校驗(yàn)、固定模板的數(shù)據(jù)轉(zhuǎn)換這些用傳統(tǒng)代碼做又快又穩(wěn)又便宜。Agent 的價(jià)值在于面對(duì)“非結(jié)構(gòu)化目標(biāo)、不確定路徑、需要?jiǎng)討B(tài)決策”的任務(wù)。如果你發(fā)現(xiàn)一個(gè)任務(wù)實(shí)際上是“輸入一個(gè)參數(shù) → 查一次表 → 輸出一個(gè)結(jié)果”那就把它固化成普通函數(shù)不要為了讓簡(jiǎn)歷好看而強(qiáng)行套一層“智能體”。真實(shí)環(huán)境里這是節(jié)約成本也是保證穩(wěn)定最有效的方式之一。我在很多地方都強(qiáng)調(diào)過(guò)同一個(gè)比喻**Agent 系統(tǒng)不是用來(lái)替換所有流程的高射炮而是專(zhuān)門(mén)負(fù)責(zé)處理那些“沒(méi)有固定說(shuō)明”的難題的特種兵。**特種兵不應(yīng)該被派去站普通崗哨。6.2 成本、延遲與可靠性的三角平衡沒(méi)有任何一個(gè)方案可以三個(gè)目標(biāo)同時(shí)拉滿(mǎn)。Agent 系統(tǒng)的天然代價(jià)就是慢、貴、不確定性高。所以在設(shè)計(jì) Harness 時(shí)我會(huì)明確給每個(gè)流程設(shè)定“允許智能范圍”能走規(guī)則的一定走規(guī)則只有規(guī)則處理不了的路口才交給 Agent。實(shí)踐中我會(huì)做一個(gè)“路由層”請(qǐng)求先進(jìn)一個(gè)輕量分類(lèi)器判斷這個(gè)任務(wù)是否需要真正的多步推理。不需要就直接走預(yù)設(shè) API 或消息處理流程需要才走帶 Harness 的 Agent 運(yùn)行時(shí)。這相當(dāng)于操作系統(tǒng)里“中斷處理”簡(jiǎn)單的命令直接在用戶(hù)態(tài)處理不輕易切換到復(fù)雜的內(nèi)核流程。6.3 “成為未來(lái)計(jì)算平臺(tái)的主流范式”到底會(huì)不會(huì)成真我的判斷是會(huì)但不會(huì)像現(xiàn)在很多熱詞帖子里說(shuō)的那么輕巧。Agent 不會(huì)取代操作系統(tǒng)但 Agent Harness 會(huì)扮演類(lèi)似操作系統(tǒng)的角色為模型、工具、記憶、權(quán)限、協(xié)作提供一套統(tǒng)一的運(yùn)行控制和抽象層。未來(lái)的計(jì)算平臺(tái)里模型是所有應(yīng)用的智能內(nèi)核而 Harness 是這個(gè)內(nèi)核得以安全暴露給外部環(huán)境的殼?,F(xiàn)在說(shuō)這樣的話(huà)為時(shí)尚早但方向足夠清晰。我們能看到一個(gè)明顯的趨勢(shì)各類(lèi)底層模型越來(lái)越便宜、越來(lái)越快、能力越來(lái)越強(qiáng)但同時(shí)上層應(yīng)用對(duì)“可控性、可觀測(cè)性、安全性”的要求倒逼出了全新的領(lǐng)域。Agent Harness Engineering 正是把“模型能力”變成“商業(yè)價(jià)值”的最后一個(gè)關(guān)鍵步驟。這套工程體系當(dāng)然遠(yuǎn)沒(méi)有成熟它還面臨評(píng)測(cè)標(biāo)準(zhǔn)不統(tǒng)一、跨平臺(tái)互操作難、安全性尚未形成行業(yè)共識(shí)等問(wèn)題。但越早進(jìn)入這個(gè)領(lǐng)域、越早把“將 Agent 置于可控運(yùn)行規(guī)則之中”作為核心競(jìng)爭(zhēng)力來(lái)建設(shè)未來(lái)在計(jì)算平臺(tái)遷移中能帶走的東西就越多。我自己的體會(huì)是三個(gè)回退到工程原則的大白話(huà)**第一先約束再開(kāi)放第二讓一切失敗都變得可知、可控、可恢復(fù)第三永遠(yuǎn)把用戶(hù)目標(biāo)和邊界權(quán)限放在同一個(gè)優(yōu)先級(jí)上。**只要這三點(diǎn)不變無(wú)論未來(lái)的平臺(tái)叫不叫 Agent 操作系統(tǒng)你手里的這套 Harness 工程積累都不會(huì)過(guò)時(shí)。