這天我在整理自己的 AI agent 記憶系統,順手研究了兩個開源專案(TencentDB-Agent-Memory 和 obra/superpowers),挑出幾個值得學的改動。
其中兩個我沒自己下判斷,而是交給同一套流程:讓一個較快、較便宜的 model 實作,再讓另一個同型 model 去對抗式複審。兩個改動、同一套流程,結果卻相反——一個被否決、一個通過合併。
回頭看,決定結果的不是流程本身,是「複審手上有沒有客觀標準可以打」。
那套流程長什麼樣
拆成兩個角色,刻意用不同的 agent:
- 實作 agent:在隔離的 git worktree 改 code、自己驗證、commit、回報。
- 複審 agent:進同一個 worktree,被明確指示「去 refute 第一版的宣稱、找邊界 case」,不是幫忙背書。
關鍵設計只有一條:複審不能是實作者自己。實作者對自己寫的東西有動機說「大致還好」,這個動機本身就是盲點來源。
第一輪:一個排序改動,被 golden bench 打回
背景是記憶搜尋的排序,想從線性加權換成 RRF(reciprocal rank fusion)。
實作 agent 加了新模式、保留舊的當預設、跑了幾個 query 的 A/B 對照,自評「大部分持平,有一個 query 略差」,並宣稱測試通過。
複審 agent 做了實作 agent 沒做的一件事:跑 repo 裡本來就有的 golden benchmark。結果不太好看:
- MRR 從 0.675 掉到 0.188、Recall@1 從 0.60 掉到 0.07。15 題裡 8 題退步、0 題改善。不是「略差」,是全面退化。
- 一個真 bug:RRF 讀到的是四捨五入到小數點三位的顯示值。在低區分度的 query 上,幾百個候選塌成十來個相異值、出現 35-way 平手,排序退化成按掃檔順序抽籤。
- 一個空測試:複審做了突變測試——把舊路徑的一個關鍵係數整段拿掉,測試竟然全綠。所謂「測試通過」根本沒在保護舊行為。
判決:否決,branch 直接刪掉。舊的本來就是預設,零損失。
這一輪複審之所以有殺傷力,是因為 repo 裡本來就有一把客觀的尺。實作 agent 沒去量,複審一量就現形。
第二輪:一個流程改動,沒 bench 可跑
背景是給「造 skill」的工具加一個階段:skill 出生前,先在壓力情境下讓一個沒有這個 skill 的 agent 去失敗,逐字記錄它逃避正確做法時用的藉口,再針對那些藉口寫 skill。
問題來了——這是一份 markdown 工作流文件,沒有 pytest 可跑,也沒有 benchmark。複審還能打什麼?
複審沒有因此放水,它把打擊面從「跑數字」換成「核對可獨立驗證的事實宣稱」:
- 實作 agent 宣稱「用了既有腳本的資料格式、欄位是這四個」→ 複審實際讀那支腳本,逐欄位比對,確認一字不差。
- 宣稱「某個 flag 存在、某自訂值不會被拒絕」→ 複審實跑
--help、自己丟一個不存在的名字進去,確認不會爆。 - 宣稱「skill 還不存在時也能先跑」→ 複審自己跑一次 dry-run 確認。
六條宣稱逐條實測,全部屬實,沒有造假。判決:通過,合併。
複審誠實地補了一句:RED/GREEN 那兩個 subagent 的實際行為,它無法在靜態複審裡重現,只驗證了工具鏈跑得起來。這句「我驗不到的部分」,恰恰是它可信的原因。
兩輪的差別:有沒有 ground truth
把兩輪並排:
| 面向 | 排序改動 | 流程文件改動 |
|---|---|---|
| 有無客觀標準 | 有(golden benchmark) | 無 |
| 複審主打 | 跑現成 bench,量退化 | 核對每個可驗證的事實宣稱 |
| 抓到什麼 | 全面退化 + 真 bug + 空測試 | 無(宣稱皆屬實) |
| 結果 | 否決 | 通過 |
結論不是「複審很神」,而是複審的殺傷力取決於它手上有沒有一把客觀的尺:
- 有 ground truth(benchmark、golden set、能跑的測試):複審的第一件事就是去量,別讓實作 agent 的自評當數。實作 agent 沒跑現成的 bench,就是最容易讓退化溜過去的破口。
- 沒有 ground truth(文件、流程、主觀輸出):複審退而求其次,去核對「可被獨立驗證的事實宣稱」——腳本欄位、flag 存在性、指令跑不跑得動。打不到數字,就打事實。
還有一個副產品的教訓:實作 agent 的自評不可信,不是因為它不誠實,是因為它對自己的東西有動機往好處想。第一輪那個「略差」跟真實的「全面退化」之間,差的就是一次它沒去跑的 benchmark。
可以帶走的
- 核心邏輯(排序、去重、門檻這類一改就影響大量輸出的東西)改動,複審跟實作一定要拆給不同 agent。
- repo 裡有 benchmark / golden set,複審第一步就是跑它,不要接受「我看起來對」。
- 沒有客觀標準的改動也能對抗複審,只是打擊點從數字換成事實宣稱。
- 「我這部分驗不到」是複審該講的話——那不是失格,是可信度。
