程級與代碼級落地實踐)
做Agent開發(fā)的朋友聚在一起聊天時“沙箱”這個詞出現(xiàn)的頻率高得嚇人。無論你是搭一個能自動寫代碼的助手還是讓模型按流程調(diào)用外部工具的系統(tǒng)文檔里幾乎必有一章在講“沙箱”。我最早接觸它時以為就是一個“把環(huán)境隔離開”的省略說法后來真正動手給Agent套隔離層才發(fā)現(xiàn)這玩意兒的形態(tài)、粒度、邊界每個選擇都直接影響任務(wù)能不能跑通、安不安全。這篇文章不打算給一句字典式定義就收工我想從實際運行場景出發(fā)把Agent語境下的沙箱徹底拆開看它到底是什么、解決哪些具體問題、有哪些隔離層次、怎么選型落地以及我踩過的一些坑。1. 沙箱的本質(zhì)給AI圈一塊帶圍墻的試驗場1.1 一個生活化的比喻操作臺與護欄想理解沙箱可以先想一個場景。你剛招了一個能干但完全沒經(jīng)驗的操作員要教他在實驗室里做實驗又不能讓他隨便碰強酸強堿怎么辦最穩(wěn)妥的辦法是給他隔出一塊獨立操作臺所有試劑按最小用量提前分好規(guī)定他只能在這片區(qū)域里活動每一步動作都在玻璃墻后面完成。哪怕他真的把某個瓶子打翻了飛濺范圍也只在操作臺內(nèi)清理掉重新開始就行。沙箱對Agent做的事情完全一樣。Agent里的大模型本質(zhì)上是一個“不可信的代碼生成器”。它能生成文本、代碼、命令、工具調(diào)用序列但沒人能保證它每一步都在預(yù)設(shè)范圍內(nèi)。它可能因為依賴沖突寫錯路徑可能被用戶輸入里的額外指令誘導(dǎo)去做不該做的事也可能只是單純地在循環(huán)里停不下來。沙箱的作用就是把“它可能造成的破壞半徑”縮小到一塊可回收、可重置、可追溯的試驗區(qū)域里讓一切風(fēng)險可控。這塊區(qū)域通常會在四個維度做限制文件系統(tǒng)、網(wǎng)絡(luò)、進(jìn)程和資源配額。文件系統(tǒng)上Agent只能看到被允許掛載的目錄網(wǎng)絡(luò)上默認(rèn)不放行任何外部連接或者只放行白名單域名進(jìn)程上它無法創(chuàng)建無限多的子進(jìn)程資源上內(nèi)存、CPU、運行時長都有硬上限。四個維度合起來就構(gòu)筑了一個“看得見但摸不著”的隔離層。1.2 Agent為什么離不開沙箱從項目演進(jìn)的角度看Agent對沙箱的需求不是某個人拍腦袋想出來的而是被一連串事故逼出來的。第一個理由是安全。模型生成代碼后直接塞進(jìn)系統(tǒng)執(zhí)行意味著你把執(zhí)行權(quán)交給了一個對后果沒有判斷力的統(tǒng)計模型。舉個常見場景你讓Agent清理工作目錄里的臨時文件它可能生成一條rm -rf /tmp/*的命令如果在宿主機上跑萬一環(huán)境變量或路徑拼接出問題刪除范圍就不是你想要的。這類問題在真實工作流里出現(xiàn)過太多次而且模型還會一本正經(jīng)地在代碼注釋里寫“刪除所有臨時文件”完全意識不到風(fēng)險。第二個理由是環(huán)境一致性。每個開發(fā)者的本機環(huán)境都有差異某些工具版本不一樣、某些依賴缺了、某些緩存過期了同一套Agent工作流在不同機器上跑出來的結(jié)果就是不一致。沙箱提供了一個干凈、可重復(fù)、可隨時重建的標(biāo)準(zhǔn)環(huán)境讓任務(wù)結(jié)果從“看運氣”變成“看代碼”。第三個理由是資源控制。Agent執(zhí)行任務(wù)是有預(yù)算的內(nèi)存、CPU、運行時長都該被硬性約束。沒有沙箱一次死循環(huán)或者一個失控的并行任務(wù)可能把宿主機拖垮。沙箱把每一次執(zhí)行限制在一個固定大小的容器里超限就殺不拖泥帶水。1.3 沒有沙箱會怎樣我見過一個沒有沙箱的現(xiàn)場印象很深。某個團隊的Agent任務(wù)是讀取一批表格并輸出匯總報告模型寫了一段數(shù)據(jù)清洗腳本其中有個步驟是“讀取舊的配置文件標(biāo)準(zhǔn)化后寫回”。腳本在宿主機上跑結(jié)果把生產(chǎn)環(huán)境的一個配置選項改了線上服務(wù)半夜觸發(fā)重啟。問題排查了很久才發(fā)現(xiàn)是Agent干的。這不是模型“惡毒”它只是在執(zhí)行“標(biāo)準(zhǔn)化”這個指令時把所有匹配到的文件都當(dāng)成了目標(biāo)。這個例子說明沙箱不只是為了防御惡意攻擊更是為了承接模型天然的“無差別執(zhí)行”。另一個常見事故是并發(fā)沖突。多個Agent同時跑任務(wù)共享文件系統(tǒng)里出現(xiàn)同名的臨時文件任務(wù)A寫到一半任務(wù)B讀到了殘缺內(nèi)容把它當(dāng)成合法輸入最終結(jié)果完全錯亂。兩個Agent的日志互相指向?qū)Ψ侥愀痉植磺迨钦l先污染的數(shù)據(jù)。有了沙箱每個任務(wù)都有自己的工作目錄生命周期和任務(wù)綁定結(jié)束即銷毀就從根本上避免了這種互相踩踏。2. 沙箱的四種形態(tài)不同粒度的隔離方案2.1 容器Agent的標(biāo)配宿舍今天聊Agent沙箱繞不開容器。以常見容器運行時為例它之所以成為事實標(biāo)準(zhǔn)是因為它在隔離性和便利性之間找到了一個非常實用的平衡點。容器共享宿主機內(nèi)核但通過命名空間和約束機制讓每個容器擁有獨立的文件系統(tǒng)視圖、進(jìn)程空間、網(wǎng)絡(luò)棧和用戶權(quán)限。類比來說容器像一棟宿舍樓每個Agent有自己的房間、自己的門禁卡房間內(nèi)可以自由裝修但你出不了這棟樓樓里的水電暖也是共用的。容器最大的好處是環(huán)境可復(fù)制、啟動快。Agent需要跑Python腳本你構(gòu)建一個帶Python運行時、相關(guān)依賴庫的鏡像每次任務(wù)直接用這個鏡像起一個新容器幾十毫秒到幾秒不等就能拉起一個完整環(huán)境。跑完刪除容器所有寫入內(nèi)容隨之消失宿主機干干凈凈。所以大部分Agent項目只要涉及“執(zhí)行模型生成的代碼”默認(rèn)首選就是容器。2.2 進(jìn)程級沙箱更輕但更考驗配置容器雖好但每次啟動仍有開銷。如果Agent要執(zhí)行的任務(wù)非常小、頻率非常高比如在一個消息循環(huán)里反復(fù)調(diào)用一個計算函數(shù)容器方案就顯得笨重。這時可以跳過容器直接用操作系統(tǒng)自帶的隔離機制拉起一個受限子進(jìn)程。這里提到的機制包括命名空間做資源視圖隔離控制組限制CPU和內(nèi)存seccomp過濾系統(tǒng)調(diào)用根目錄切換讓子進(jìn)程只能看到一個受限目錄樹。這些機制疊加在一起能讓一個普通進(jìn)程變成“看起來把自己鎖在了一個小房間里”的進(jìn)程。啟動開銷是毫秒級比容器輕得多。不少開源封裝工具也基于這些原始機制提供配置入口叫法是進(jìn)程級沙箱。但代價是配置復(fù)雜度上來了。你要自己理解每個機制的作用和邊界任何一層配置出錯都可能留下逃逸面。比如忘了限制某個危險系統(tǒng)調(diào)用惡意代碼就能直接訪問宿主機內(nèi)核接口。如果團隊里沒人熟悉這些底層機制我建議不要輕易在生產(chǎn)環(huán)境用進(jìn)程級方案調(diào)試成本會遠(yuǎn)超容器。2.3 代碼級沙箱讓模型只寫“純函數(shù)”還有一種場景Agent要執(zhí)行的不是一段需要完整系統(tǒng)能力的命令而是一個公式、一個數(shù)據(jù)轉(zhuǎn)換函數(shù)、一段可驗證的腳本邏輯。這時候連子進(jìn)程都顯得重更優(yōu)解是在一個受控語言運行時內(nèi)執(zhí)行。這類運行時天然屏蔽了底層系統(tǒng)能力比如默認(rèn)沒有任何網(wǎng)絡(luò)和文件訪問權(quán)限需要顯式開啟對應(yīng)開關(guān)才能觸碰外部資源。典型代表是某些帶有權(quán)限模型的安全運行時以及WebAssembly這類編譯目標(biāo)。前者的模型是“默認(rèn)全部拒絕按需放行”后者則是“代碼跑在隔離的線性內(nèi)存里宿主機和它之間有明確的邊界”。這種沙箱極其輕量執(zhí)行一個純函數(shù)幾乎無感知適合高頻、小粒度的Agent工具調(diào)用。但它的局限也很明顯你只能執(zhí)行目標(biāo)運行時支持的語言和庫沒法跑一個完整的shell腳本或拉起一個數(shù)據(jù)庫服務(wù)。如果你的Agent經(jīng)常需要操作文件、調(diào)用系統(tǒng)命令代碼級沙箱就滿足不了還是得回到容器方案。2.4 四種形態(tài)對比形態(tài)隔離強度性能開銷啟動速度適用場景上手難度虛擬機極高高慢強對抗、高安全需求高容器高中快執(zhí)行模型生成代碼、工具鏈調(diào)用低進(jìn)程級中高低極快高頻小任務(wù)、低頻但需要系統(tǒng)能力高代碼級中極低幾乎無感純函數(shù)、公式計算、輕量數(shù)據(jù)處理低大多數(shù)Agent項目用容器加代碼級就夠覆蓋了。虛擬機那層除非有很強的對抗需求否則就是過度設(shè)計。進(jìn)程級適合真正了解底層機制、有精力維護的團隊。我的建議很樸素先別追求“絕對安全”先做到“常規(guī)風(fēng)險可控”跑通之后再逐步加厚度。3. Agent沙箱在解決哪些實際問題3.1 安全執(zhí)行模型生成的代碼這是最典型的場景。Agent寫代碼只是它完成任務(wù)的手段執(zhí)行權(quán)必須交到沙箱手里。這里要特別注意一個問題模型需要看到執(zhí)行結(jié)果所以沙箱里的輸出要怎么傳出來。我常用的做法是給沙箱掛兩個目錄一個只讀的輸入目錄一個可寫的輸出目錄。Agent只能讀取輸入目錄的內(nèi)容也只能把結(jié)果寫到輸出目錄宿主機再從這個輸出目錄取走結(jié)果。這樣即便模型生成了ls /之類的命令它也列不出宿主機上的其他路徑因為容器里的根目錄就是一個全新的、只包含必要內(nèi)容的小世界。3.2 隔離密鑰與外部API調(diào)用Agent要調(diào)用外部API時很多人第一反應(yīng)是把密鑰直接塞進(jìn)沙箱環(huán)境變量里這非常危險。沙箱一旦被模型生成的不安全代碼攻破或者因為網(wǎng)絡(luò)配置錯誤泄露了環(huán)境變量密鑰就等于直接交給了不可信代碼。正確做法是把密鑰放在沙箱外層沙箱內(nèi)不落任何真實憑證。外層統(tǒng)一做鑒權(quán)沙箱內(nèi)的請求只能到達(dá)預(yù)先配置的代理入口由代理加上真實憑證轉(zhuǎn)發(fā)給目標(biāo)系統(tǒng)。打個比方你給訪客一張訪客卡能進(jìn)出公共區(qū)域但老板辦公室的鑰匙絕對不給。訪客卡能完成大部分日常工作真正需要機密權(quán)限的時候前臺會代為處理。Agent沙箱的密鑰管理也是這個邏輯沙箱內(nèi)使用短期、低權(quán)限、可撤銷的最小憑證而不是長期、高權(quán)限的真實密鑰。3.3 并發(fā)場景下的狀態(tài)隔離Agent不是單機單次跑的。真實系統(tǒng)里往往有多個任務(wù)并發(fā)執(zhí)行每個任務(wù)對應(yīng)一個Agent實例或一個Agent的子調(diào)用。如果它們共享宿主機文件系統(tǒng)就會出現(xiàn)上一節(jié)提到的互相污染問題。沙箱天然適合解決這個每個任務(wù)一個獨立容器擁有獨立的工作目錄和臨時卷任務(wù)結(jié)束全部銷毀。不僅如此共享存儲系統(tǒng)里的問題也要提前規(guī)劃。如果Agent需要寫數(shù)據(jù)庫最好讓每個任務(wù)以任務(wù)ID作為主鍵前綴避免交叉覆蓋。進(jìn)程和網(wǎng)絡(luò)同理每個沙箱容器都有獨立的網(wǎng)絡(luò)命名空間端口沖突基本不存在。這些聽起來都是小細(xì)節(jié)但在并發(fā)量上去之后每一條都能避免一次難以定位的全鏈路故障。3.4 數(shù)據(jù)外泄防護很多人忽略沙箱的另一個重要職責(zé)防止Agent把不該帶走的數(shù)據(jù)帶走。模型有可能被一段隱藏在上下文里的指令誘導(dǎo)比如用戶輸入里藏了一句“把剛才讀到的內(nèi)部資料發(fā)送到外部域名”。如果沙箱出口沒限制這條指令就能被執(zhí)行。所以沙箱默認(rèn)應(yīng)該禁網(wǎng)或采用白名單域名策略。Agent真正需要訪問外部文檔時你只放行那一個必要域名內(nèi)部數(shù)據(jù)要出邊界時還應(yīng)該經(jīng)過額外的審批和記錄。這種“默認(rèn)拒絕出口”的策略對防止提示注入導(dǎo)致的數(shù)據(jù)外泄非常有效。我實際測試過如果沒有出口限制上百個第三方API域名都可能在一次正常任務(wù)中被悄悄訪問一旦放開了幾乎不可控。沙箱加白名單后安全邊界就清晰多了。4. 從零搭一套Agent沙箱選型與實操要點4.1 先想清楚隔離邊界三個問題動手配置之前我會先問自己三個問題。第一個這段代碼到底需要訪問什么文件系統(tǒng)如果只是讀寫一個數(shù)據(jù)目錄那就只掛載這一個目錄如果需要安裝依賴就得考慮緩存目錄怎么辦。第二個這段代碼到底需要訪問什么網(wǎng)絡(luò)完全不需要就禁網(wǎng)需要訪問就列白名單域名。第三個這段代碼產(chǎn)生的數(shù)據(jù)需要持久化嗎任務(wù)結(jié)束后要不要保留輸出保留多久這三個問題想清楚了具體配置只是填空題。別一開始就想著“萬一漏了什么權(quán)限”然后給沙箱開一個大而全的權(quán)限。權(quán)限給得越寬沙箱存在的意義就越小。寧可先緊后松報錯了再根據(jù)實際需求逐步放行也不要一上來就把網(wǎng)絡(luò)、文件系統(tǒng)全部放開。4.2 容器方案一個可以直接抄的配置以Docker為例我常用的一個基礎(chǔ)命令長這樣docker run --rm \ --name agent-sandbox \ --networknone \ --memory512m \ --cpus1 \ --pids-limit256 \ --read-only \ --tmpfs /tmp:rw,size64m \ -v /host/task/input:/workspace/in:ro \ -v /host/task/output:/workspace/out:rw \ agent-runner:latest逐個解釋一下這些參數(shù)在干什么。--networknone表示容器內(nèi)沒有任何網(wǎng)絡(luò)接口這是最嚴(yán)格的外發(fā)限制。--memory512m限制最大物理內(nèi)存512MB--cpus1限制最多使用1個CPU核心--pids-limit256限制最多創(chuàng)建256個進(jìn)程這幾個參數(shù)一起防止Agent把宿主資源耗盡。--read-only讓根文件系統(tǒng)變成只讀任何嘗試寫入系統(tǒng)目錄的操作都會失敗。--tmpfs /tmp:rw,size64m在內(nèi)存里掛一塊臨時可寫空間專門給緩存和臨時文件用。最后兩個卷掛載把任務(wù)輸入和輸出目錄映射進(jìn)去而且是輸入只讀、輸出可寫。這套配置的默認(rèn)哲學(xué)是什么權(quán)限都不給。如果Agent真的需要網(wǎng)絡(luò)訪問我不建議直接一路放開--networkhost更好的做法是把外部服務(wù)包裝成一個內(nèi)部API由宿主側(cè)的代理統(tǒng)一轉(zhuǎn)發(fā)沙箱內(nèi)仍然只能訪問白名單內(nèi)的請求入口。這樣網(wǎng)絡(luò)權(quán)限始終掌握在人手里而不是模型手里。4.3 進(jìn)程級與代碼級的適用決策如果容器啟動開銷已經(jīng)影響到Agent的響應(yīng)速度再考慮進(jìn)程級和代碼級。我的決策邏輯是這樣的如果每次任務(wù)要執(zhí)行完整shell命令、安裝依賴、啟動子進(jìn)程那就乖乖用容器如果任務(wù)只是幾十行代碼、高頻調(diào)用優(yōu)先嘗試代碼級沙箱如果確實需要一定系統(tǒng)能力但又不想每次啟動容器再去評估進(jìn)程級方案。代碼級沙箱有一個額外的好處它天然適合Agent工具函數(shù)的“插件化”。你可以把常用的計算邏輯編譯成一小段可執(zhí)行字節(jié)碼沙箱只暴露幾個固定的函數(shù)入口參數(shù)和返回值都是嚴(yán)格校驗的結(jié)構(gòu)化數(shù)據(jù)。這樣整個執(zhí)行邊界非常清晰出問題時排查范圍也小。4.4 網(wǎng)絡(luò)隔離與密鑰管理的三種常用做法網(wǎng)絡(luò)層我歸納過三種做法。第一種是全禁網(wǎng)最安全但Agent無法訪問任何外部資源第二種是白名單域名只允許訪問特定的外部API能覆蓋大部分真實需求第三種是代理出口沙箱內(nèi)所有請求先到代理由代理決定是否轉(zhuǎn)發(fā)、加什么鑒權(quán)頭安全性和靈活性最高。密鑰管理同樣有三種常用方式。環(huán)境變量注入最簡單、直觀但會被模型生成的代碼以print(os.environ)的方式直接讀出來只讀掛載憑證文件讓沙箱能看到但不允許修改比環(huán)境變量稍好一點臨時令牌最推薦通過內(nèi)部服務(wù)簽發(fā)短期有效的低權(quán)限令牌用完即失效即使被泄露影響也有限。我自己的默認(rèn)組合是生產(chǎn)環(huán)境默認(rèn)禁網(wǎng)或白名單外加內(nèi)網(wǎng)代理密鑰用臨時令牌或只讀掛載的最小憑證。這套組合在多個項目里跑過安全和效率都能接受。5. 常見問題與排查實錄5.1 任務(wù)超時與僵尸進(jìn)程Agent任務(wù)最常見的故障是跑超時。模型生成了一段循環(huán)邏輯沒有設(shè)置終止條件就直接在沙箱里空轉(zhuǎn)。容器的做法通常是外部給一個總超時比如借助timeout命令timeout 30 docker run --name agent-task --rm agent-runner:latest但這有一個坑timeout只殺它直接啟動的進(jìn)程如果容器里還有子進(jìn)程在跑容器可能不會立刻退出。我建議服務(wù)端調(diào)度容器時每次超時都執(zhí)行兩件事先docker kill容器再docker rm -f強制清理不要只依賴timeout。進(jìn)程級沙箱更麻煩需要記錄整個進(jìn)程組ID超時后先往進(jìn)程組發(fā)終止信號再殺。測試下來處理子進(jìn)程要比處理主進(jìn)程重要得多。5.2 只讀文件系統(tǒng)導(dǎo)致工具無法工作用了只讀根文件系統(tǒng)后常見的pip、npm安裝依賴會報Permission denied因為它們默認(rèn)把緩存寫在系統(tǒng)目錄。很多人第一反應(yīng)是“把只讀去掉”這就錯了。正確做法是給這些工具單獨指定臨時緩存目錄。比如啟動容器時設(shè)置環(huán)境變量--env NPM_CONFIG_CACHE/tmp/npm-cache --env PIP_CACHE_DIR/tmp/pip-cache這樣依賴緩存全部寫到/tmp的臨時內(nèi)存空間既不影響運行也保持了根文件系統(tǒng)的只讀性。這類問題的排查思路是不是權(quán)限不夠就要放開權(quán)限而是讓軟件把狀態(tài)信息放到它本來就有權(quán)限寫的地方。5.3 容器啟動慢與高頻執(zhí)行矛盾每次新起一個容器慢則一秒快則幾十毫秒對個人Demo完全夠用但如果是Agent高頻調(diào)用工具的線上系統(tǒng)這個延遲會被放大。我有三個優(yōu)化經(jīng)驗。第一鏡像預(yù)熱提前把鏡像拉到宿主機并保持常駐避免每次任務(wù)都重新拉取層。第二復(fù)用容器監(jiān)聽一個常駐worker容器通過執(zhí)行接口向它提交任務(wù)而不是每次重啟容器。第三用更輕的運行時如果任務(wù)很簡單直接降級到代碼級沙箱啟動時間幾乎可以忽略。需要注意的是容器復(fù)用會削弱“任務(wù)結(jié)束即銷毀”的隔離優(yōu)勢所以復(fù)用的容器要設(shè)計成每個任務(wù)在一個新的臨時目錄里跑任務(wù)結(jié)束后把目錄一并清掉保證狀態(tài)不串。5.4 沙箱逃逸永遠(yuǎn)不要只依賴一層說句實話沒有絕對安全的沙箱。容器逃逸、內(nèi)核漏洞、配置錯誤這些都是真實存在的風(fēng)險。所以我會把沙箱當(dāng)作“第一道防線”而不是“唯一防線”。縱深防御的意思是多層限制疊加只讀根文件系統(tǒng)擋掉大部分寫入型攻擊seccomp配置擋住危險系統(tǒng)調(diào)用非root用戶運行降低提權(quán)風(fēng)險關(guān)閉對外端口減少入口容器定期銷毀重建避免長期駐留擴大攻擊面。同時一定要有日志審計。Agent每次調(diào)用了什么命令、訪問了哪個網(wǎng)絡(luò)地址、讀寫了哪些文件這些日志全部記錄下來。一旦出現(xiàn)異常行為能快速定位是哪個任務(wù)、哪個模型輸出、哪個環(huán)節(jié)出的問題。日志既是排查工具也是安全防線的一部分。5.5 沙箱內(nèi)網(wǎng)絡(luò)失敗的排查開發(fā)階段最常見的網(wǎng)絡(luò)故障是“默認(rèn)禁網(wǎng)”導(dǎo)致的。Agent明明生成了一個合法的請求卻超時報錯看起來很像是外部服務(wù)出了問題其實是沙箱把請求攔在了里面。排查時要先確認(rèn)網(wǎng)絡(luò)策略本身再去看外部服務(wù)。我會用一個最小復(fù)現(xiàn)方式來判斷手動在沙箱里跑一條curl命令訪問白名單域名如果失敗就查看容器的網(wǎng)絡(luò)命名空間和代理日志確認(rèn)請求到底卡在哪一層。不要一上來就放開網(wǎng)絡(luò)限制這樣很可能因為一次誤判把整個安全邊界撕開一個口子。確認(rèn)是規(guī)則問題之后再精確地調(diào)整白名單一個一個域名地加。6. 按場景抄作業(yè)三種配置清單與一條核心經(jīng)驗如果是個人Demo、本地跑通一個Agent想法不需要上重武器。代碼級沙箱就夠或者用一個最簡單的容器禁網(wǎng)、只讀根文件系統(tǒng)臨時目錄掛到/tmp能解決大多數(shù)調(diào)研場景。重點是把“執(zhí)行不可信代碼”這個動作隔離在宿主機之外。如果是團隊內(nèi)部試用、Agent需要調(diào)用內(nèi)部工具和外部API容器方案加白名單網(wǎng)絡(luò)、只讀掛載最小憑證、任務(wù)級臨時工作目錄這套組合可以應(yīng)付絕大多數(shù)情況。還要加上統(tǒng)一的日志收集保證每個Agent任務(wù)都能回溯。如果是生產(chǎn)服務(wù)我會再加一層代理出口和密鑰服務(wù)。沙箱內(nèi)不落任何真實密鑰權(quán)限審批走獨立服務(wù)日志審計和異常監(jiān)控常駐容器定期重建。這已經(jīng)不是“要不要隔離”的問題而是“隔離做得多細(xì)”的問題。我自己在實際項目里的體會是沙箱配置的每一條策略都像是在給Agent的行為畫一條邊界。邊界越清晰Agent能完成的任務(wù)范圍看起來變小了但它真正能做好的任務(wù)反而更可靠、更容易維護。我最后想分享的一條經(jīng)驗就七個字權(quán)限先禁后放。這個“先緊后松”的調(diào)試過程確實會有點痛苦但換來的穩(wěn)定性和安全感是任何模型能力都替代不了的。