戰(zhàn)(五):失敗反饋不是新目標(biāo),用證據(jù)轉(zhuǎn)向守住原始意圖)
本篇讀取上一篇的runs/demo-001/grader_snapshot.json、裁判產(chǎn)生的check_finished事件以及 083 的contract.json??煺照C明失敗來自受保護(hù)裁判契約提供不變目標(biāo)本篇新增steer.py輸出runs/demo-001/steer.json作為下一次模型調(diào)用的唯一指令輸入。一、最危險(xiǎn)的反饋是“想當(dāng)然的總結(jié)”測(cè)試輸出可能很長宿主常把它總結(jié)成“測(cè)試仍失敗請(qǐng)修復(fù)”。這句話丟掉了原目標(biāo)和具體證據(jù)模型自然把“綠燈”當(dāng)成優(yōu)化對(duì)象。好的轉(zhuǎn)向信息不是重新發(fā)明任務(wù)而是原目標(biāo)、不可變約束和最小失敗片段的組合。它應(yīng)明確說允許修改哪里、禁止修改哪里并引用裁判原始輸出的摘要。失敗片段不能簡(jiǎn)單取最后幾行。不同測(cè)試框架可能把關(guān)鍵斷言放在中間末尾只有統(tǒng)計(jì)。我們按錯(cuò)誤關(guān)鍵字選擇相鄰行再施加字符上限完整輸出單獨(dú)落盤并求摘要。這樣模型得到足夠定位信息審計(jì)者仍能證明片段來自哪份完整證據(jù)。from__future__importannotationsimporthashlibimportjsonfrompathlibimportPath KEYWORDS(AssertionError,FAILED,ERROR,expected,actual)defevidence_slice(text:str,limit:int1600)-str:linestext.splitlines()selected:list[str][]forindex,lineinenumerate(lines):ifany(word.lower()inline.lower()forwordinKEYWORDS):start,endmax(0,index-1),min(len(lines),index2)selected.extend(lines[start:end])ifnotselected:selectedlines[-12:]compact\n.join(dict.fromkeys(selected))returncompact[:limit]defbuild_steer(contract:dict,snapshot:dict,output:str)-dict:output_hashhashlib.sha256(output.encode(utf-8)).hexdigest()return{contract_sha256:contract[sha256],grader_contract_sha256:snapshot[contract_sha256],goal:contract[goal],must_not_change:contract[protected],instruction:只修改允許的生產(chǎn)代碼以滿足原目標(biāo)不得修改裁判材料。,failure_evidence:evidence_slice(output),full_output_sha256:output_hash,}defmain()-int:rootPath(runs/demo-001)contractjson.loads((root/contract.json).read_text(encodingutf-8))snapshotjson.loads((root/grader_snapshot.json).read_text(encodingutf-8))output(root/artifacts/check-001.txt).read_text(encodingutf-8)steerbuild_steer(contract,snapshot,output)ifsteer[contract_sha256]!steer[grader_contract_sha256]:raiseSystemExit(contract mismatch)(root/steer.json).write_text(json.dumps(steer,ensure_asciiFalse,indent2),encodingutf-8)print(fevidence_chars{len(steer[failure_evidence])}goal_heldTrue)return0if__name____main__:raiseSystemExit(main())運(yùn)行輸出evidence_chars184 goal_heldTrue二、為什么保留原文片段而不是讓模型總結(jié)模型總結(jié)會(huì)引入第二次推斷原檢查說“期望 9000實(shí)際 10000”總結(jié)可能變成“折扣測(cè)試有問題”責(zé)任對(duì)象從實(shí)現(xiàn)漂到測(cè)試。確定性切片雖然不優(yōu)雅卻保留裁判措辭。我們可以刪除顏色轉(zhuǎn)義、重復(fù)堆棧和無關(guān)路徑但不能把失敗含義改寫成新的命令。這里的非平凡記憶點(diǎn)是轉(zhuǎn)向只能增加證據(jù)不能替換目標(biāo)。實(shí)現(xiàn)上用契約摘要強(qiáng)制關(guān)聯(lián)每次重試都重新從contract.json取目標(biāo)而不是沿用上一輪模型對(duì)任務(wù)的復(fù)述。如果模型回復(fù)里聲稱目標(biāo)已經(jīng)變化宿主仍以契約為準(zhǔn)。importjsonfrompathlibimportPathdefvalidate_steer(path:Path,contract_path:Path)-None:steerjson.loads(path.read_text(encodingutf-8))contractjson.loads(contract_path.read_text(encodingutf-8))ifsteer[contract_sha256]!contract[sha256]:raiseValueError(steer uses another contract)ifsteer[goal]!contract[goal]:raiseValueError(goal drift detected)ifnotsteer[failure_evidence].strip():raiseValueError(missing failure evidence)rootPath(runs/demo-001)validate_steer(root/steer.json,root/contract.json)print(steer_okTrue goal_driftFalse evidence_presentTrue)運(yùn)行輸出steer_okTrue goal_driftFalse evidence_presentTrue三、失敗證據(jù)也可能具有攻擊性編譯器輸出、網(wǎng)頁內(nèi)容和測(cè)試數(shù)據(jù)都可能包含“忽略之前指令”之類文本。它們是數(shù)據(jù)不應(yīng)與宿主指令混在同一無邊界字符串中。發(fā)送給支持結(jié)構(gòu)化消息的模型時(shí)把目標(biāo)放系統(tǒng)或開發(fā)者層把證據(jù)放標(biāo)記清晰的工具結(jié)果不支持時(shí)至少使用長度限制與明確分隔并聲明分隔區(qū)內(nèi)容不可執(zhí)行。敏感信息也是風(fēng)險(xiǎn)。堆??赡馨^對(duì)用戶目錄HTTP 錯(cuò)誤可能回顯令牌。寫入工件前做字段級(jí)脫敏賬本只存摘要與相對(duì)路徑。脫敏規(guī)則本身要測(cè)試不能用一個(gè)貪婪正則把真正的錯(cuò)誤行全部抹掉。四、何時(shí)不該自動(dòng)轉(zhuǎn)向契約損壞、裁判快照變化、權(quán)限拒絕和環(huán)境缺依賴不是代碼修復(fù)反饋繼續(xù)讓模型改生產(chǎn)代碼沒有意義。它們應(yīng)進(jìn)入blocked或infrastructure_failed等待宿主或人工處理。只有“受保護(hù)檢查執(zhí)行成功且結(jié)果不滿足”才生成修復(fù)轉(zhuǎn)向。重復(fù)出現(xiàn)完全相同的失敗摘要也值得停止。模型連續(xù)三次制造同一結(jié)果說明缺少信息或沒有可行權(quán)限再重試只會(huì)燒預(yù)算。下一篇將讀取steer.json和事件賬本構(gòu)建顯式預(yù)算狀態(tài)機(jī)把次數(shù)、時(shí)間、工具費(fèi)用與重復(fù)失敗一起變成可解釋的停止條件。轉(zhuǎn)向文件還要保存生成器版本。證據(jù)選擇算法升級(jí)后同一裁判輸出可能得到不同片段版本字段讓重放器知道差異來自選擇策略而不是歷史被改寫。若片段達(dá)到上限必須顯式標(biāo)記截?cái)嗖⒔o出完整工件摘要。參考來源Dev.toLoop Engineering: How to Stop Your Agent Reward-Hacking Its Own ChecksOWASPPrompt Injection Prevention Cheat Sheet 覺得有用就點(diǎn)個(gè)贊 收藏方便回頭查閱有疑問直接在評(píng)論區(qū)留言我看到都會(huì)回。 本文屬于《Agent可靠性工程實(shí)戰(zhàn)》系列持續(xù)更新關(guān)注不迷路。 文章里的代碼都能直接跑。想要可直接 clone 的完整工程 配套部署腳本 / 踩坑清單評(píng)論一聲或發(fā)郵件到cj2664qq.com我免費(fèi)發(fā)你。如果你正好在做類似系統(tǒng)、或有工程化難題想找人做也歡迎郵件聊一句——我按實(shí)際情況評(píng)估能落地的就接單或出方案。評(píng)論和郵件都能直接找到我不用跳別的平臺(tái)。