iT邦幫忙

2026 iThome 鐵人賽

DAY 29
0
Claude AI

從 LLM 到 Agent:用 Claude 拆解現代 AI 工程的每一層系列 第 29 篇

代理評測(agent evaluation):分數不再上升,是代理到頂了,還是題目量不出來?

  • 分享至 

  • xImage
  •  

第 28 篇最後留了一個問題:同一套 10 題,第三層 6 分、第六層 8 分、第七層還是 8 分。分數停住了,是代理到頂了,還是這 10 題已經量不出差別?

先講結論:是題目量不出來。 要說清楚為什麼,得先拆開一次代理評測是由哪些零件組成的,每個零件又會在哪裡壞掉。


一次代理評測的零件

評測一個模型,傳統做法是給一段輸入、比對一段輸出。代理不一樣:它會跑好幾圈、開工具、改檔案,結束時環境已經跟開始時不同了。Anthropic 在 2026 年 1 月的〈Demystifying evals for AI agents〉把代理評測拆成幾個零件:

零件 定義 在這個系列裡
任務(task) 一道有固定輸入和成功標準的題目 10 題裡的一題
試次(trial) 對一道任務的一次嘗試 第 28 篇每題跑了 3 次
評分者(grader) 替代理表現的某一面打分的邏輯 我照標準判,或第 26 篇到第 28 篇的審查者
執行紀錄(transcript) 一次試次的完整紀錄:輸出、工具呼叫、推理、中間結果 token-inspectour 攔下來的每一個請求
結果(outcome) 試次結束時環境的最後狀態 第 9 題的 changelog.md 有沒有真的存在
評測 harness 從頭到尾把評測跑完的基礎設施 那支逐題呼叫 claude -p 的腳本
代理 harness 讓模型能當代理的那套系統 Claude Code(第 23 篇)

最後兩列最容易混在一起:你評的是「模型加代理 harness」這一整包,換了 harness,分數就不是同一個東西。

評的是結果,不是路徑。 代理評測量的是環境最後變成什麼樣子:τ-bench 拿對話結束時資料庫的狀態跟標註好的目標狀態比對,SWE-bench 跑單元測試,OSWorld 每一題都附一支執行式的評測腳本。Anthropic 那篇也建議,與其逐步檢查代理開了哪些工具,通常不如評它產出了什麼,因為代理常常走出一條你沒想到、但一樣對的路。但它同時提醒:不讀執行紀錄,就不會知道評分者有沒有判對。結果拿來打分,執行紀錄拿來檢查打分。


題目本身要可信:兩種效度

Zhu et al.(2025)檢查了十個代理評測,提出一份檢查表(Agentic Benchmark Checklist),核心是兩種效度:

  • 任務效度(task validity):一道題應該在、而且只在代理有那項能力時解得出來。
  • 結果效度(outcome validity):評測結果(測試或檢查)真的代表任務完成了。

他們找到的例子:SWE-bench Verified 有些題的測試不夠多,錯的修法也能過。τ-bench 在故意設計成做不到的題目上,什麼都不回的代理也算成功。十個裡有七個結果效度有問題、七個任務效度有問題,高估或低估最多可以差到相對 100%。

拿這兩把尺回頭看這套 10 題,第 5、6 題就是任務效度壞掉的例子。它們考記憶,答案留在第一個對話裡,而我把第一個對話開在另一個資料夾。Claude Code 的自動記憶以專案資料夾為單位,所以不管代理有沒有記憶的能力,這兩題都解不出來,等於把記憶關掉再問記憶題。Anthropic 那篇有一句很實用:跑很多次都是 0%(例如 0% pass@100),通常代表題目壞了,不是代理不行。

同一篇也要求每次試次從乾淨的環境開始,因為殘留的檔案、快取會讓失敗彼此相關。隔離是對的,但這兩題需要的狀態剛好是跨對話的,隔離把它一起隔掉了。題目要什麼狀態、環境就要留什麼狀態,這得在出題時就想清楚。

資料污染(data contamination) 從另一邊破壞任務效度:模型沒有那項能力也解得出來,因為訓練時看過答案。Xu et al.(2024)的整理是,這會讓評測的表現不準、不可靠。這套題是 2026 年 9 月才在第 4 篇公開的,token-inspectour 攔到 Claude Code 告訴模型的知識截止時間是 2026 年 6 月,照理沒看過。


能力評測與回歸評測:題目會到頂

Anthropic 那篇把評測分成兩種用途。能力評測(capability eval) 問「這個代理能做好什麼」,應該從低分開始,留給它爬的空間。回歸評測(regression eval) 確認改了東西之後原本會的還會,應該接近 100%。代理把所有解得出來的題都過了,就叫飽和(saturation),分數從此不會再動。

Kiela et al.(NAACL 2021)講的是它的後果:模型很快在評測上拿到漂亮的分數,卻在簡單的挑戰題和真實情境裡出錯。

這套題的生命週期剛好走完一輪:

層 分數 這一層翻盤的題 10 題總詞元 10 題總費用(美元)
第二層:只有提示詞 4 起點:第 1、2、7、10 題 217,805 0.9778
第三層:附上團隊筆記 6 第 3、4 題 216,585 0.9695
第四層:記憶 沒跑
第五層:工具與技能 沒單獨跑
第六層:代理迴圈,可以用工具 8 第 8、9 題 302,014 0.9953
第七層:寫審圖 8 沒有 707,790(三次平均) 1.6070(三次平均)

全部是 Claude Opus 5.5、effort medium。第二層是我寫這篇時照第 24 篇的設定重跑的(原本第 4 篇在 Opus 5 上跑,過的題一模一樣),第三、六層出自第 24 篇,第七層出自第 28 篇。

在第二到第六層,它是能力評測:每一層翻盤的題,剛好是那一層補上的能力,因為我就是照著每一層要補的洞出題的。到了第六層,剩下的八題全過,它就變成了回歸評測,只能告訴你第七層沒有把東西弄壞。第七層想換來的,是把拆得開的任務分給幾個窗口(第 25 篇引的 Kim et al.),這 10 題每一題都是單一的小問題,一題都沒考。

Kapoor et al.(2024)主張準確率和成本要一起看,所以費用那兩欄跟分數一樣重要:同樣 8 分,第七層貴了六成,詞元是 2.3 倍。


同一題跑很多次:pass@k、pass^k 和誤差

代理每次走的路都不一樣,所以一道題要跑好幾次,再決定怎麼把好幾次的結果合成一個數字:

  • pass@k:k 次裡至少一次對就算過。Chen et al.(2021)用它評測寫程式的模型,並給了不偏的估計方法。適合「可以多試幾次,挑一個對的」的場景。
  • pass^k:k 次全部都對才算過。τ-bench(Yao et al., 2024)提出它來量可靠度,量到當時的 gpt-4o 在零售情境裡 pass^8 不到 25%。客服退款這種事,對九次錯一次就是出事。

k 越大,pass@k 越往上、pass^k 越往下,兩條線分得越開,就代表代理越不穩。

分數本身也有誤差。Miller(2024)建議把評測當成統計實驗,裡面有四條:

  1. 分數要附標準誤。
  2. 同一組題目比兩個版本時,用逐題相減的差去算,誤差會小很多。
  3. 題目成群出現時(例如同一段文章出好幾題),標準誤要照群來算。
  4. 開始之前先做檢定力分析(power analysis),確認題目數量量得出你在乎的差距。

下面把這些式子寫成程式,資料是第 28 篇審查者「第一輪就放行」的次數,以及第三層到第六層的逐題差:

from math import comb, sqrt

def pass_at_k(n, c, k):   # Chen et al. 2021:k 次裡至少一次對
    return 1 - comb(n - c, k) / comb(n, k)

def pass_hat_k(n, c, k):  # Yao et al. 2024:k 次全部都對
    return comb(c, k) / comb(n, k)

def mean_se(xs):          # Miller 2024:平均數與它的標準誤
    m = sum(xs) / len(xs)
    var = sum((x - m) ** 2 for x in xs) / (len(xs) - 1)
    return m, sqrt(var / len(xs))

# 第 28 篇:審查者第一輪就放行的次數(每題跑 3 次)
c = [3, 3, 2, 3, 3, 3, 1, 1, 3, 3]
print(f"pass@3 = {sum(pass_at_k(3, x, 3) for x in c) / 10:.2f}")
print(f"pass^3 = {sum(pass_hat_k(3, x, 3) for x in c) / 10:.2f}")

# 第三層 → 第六層:同樣 10 題逐題相減(只有第 8、9 題從錯變對)
m, se = mean_se([0, 0, 0, 0, 0, 0, 0, 1, 1, 0])
print(f"差 {m:+.1f},95% 信賴區間 {m - 1.96 * se:+.2f} ~ {m + 1.96 * se:+.2f}")
pass@3 = 1.00
pass^3 = 0.70
差 +0.2,95% 信賴區間 -0.06 ~ +0.46

第一組數字是不穩的樣子:每題至少有一次被直接放行,但只有七題每次都放行。最後的答案三次都一樣,路徑卻每次不同。

第二組更值得看:第三層到第六層多了 2 分,但只有 10 題,信賴區間跨過了 0,光看統計,連這 2 分都不能說是確定的進步。(10 題用常態近似本來就粗,這裡只是示意。)我還是相信那 2 分,理由不在統計裡:執行紀錄裡看得到第六層真的開了 shasum、真的寫了檔。題目少的時候,執行紀錄能補上統計補不了的那一塊,但它是另一種證據,不能拿來假裝樣本變大了。


誰來打分:三種評分者

Anthropic 那篇把評分者分成三種:

評分者 優點 缺點
程式(code-based) 快、便宜、客觀、可重現 對「對但寫法不同」的答案很脆,判不了細節
模型(model-based) 有彈性、可擴展、抓得到細節 不確定、比程式貴,要先跟人類評分校準
人 品質的標準答案,最接近專家的判斷 貴、慢

第 4 篇引過 Zheng et al.:模型當評審跟人類的一致率超過八成,但有偏好自己答案之類的偏誤。代理評測還多一個問題:評分者看得到什麼。第 28 篇的審查者只拿到最後的文字,寫手查過的時間、算過的雜湊都沒傳過去,它就把對的答案判成「無法驗證」。Zhuge et al.(2024)的 Agent-as-a-Judge 走的是反方向:讓評審本身也是代理,可以自己去翻工作區和執行過程。他們在自建的 55 個開發任務上,量到這樣的評審比只看文字的 LLM 評審好得多,跟他們的人類評分一樣可靠。

評分者也會錯在另一邊。Anthropic 那篇記了一個例子:在 τ2-bench 的訂機票任務裡,Opus 4.5 找到政策裡的一個漏洞,照評測的寫法算失敗,實際上卻替使用者找到更好的解法。這是結果效度的另一面:評分邏輯沒想到的對答案,也會被判錯。

我的順序是:能寫成測試的就交給程式。寫不成的,先由人照固定標準判一批,拿來校準模型評分者。模型評分者要拿到執行紀錄,不能只看最後的文字。


想量第七層,該看哪些評測

這些都有論文,也都量多步、會動手的代理:

評測 量什麼 怎麼評
SWE-bench(Jimenez et al., ICLR 2024) 真實的 GitHub issue,改程式碼 單元測試,第 23 篇介紹過
terminal-bench(Merrill et al., 2026) 89 道命令列任務,每題一個獨立環境 跑測試檢查最後的狀態
GAIA(Mialon et al., 2023) 需要推理、看圖、瀏覽網頁和用工具的真實問題 比對一個簡短的標準答案
τ-bench(Yao et al., 2024) 模擬使用者和要守規則的代理之間的多輪對話 比對資料庫最後的狀態,用 pass^k
OSWorld(Xie et al., 2024) 真的作業系統上 369 個開放式的電腦操作任務 每題一支執行式評測腳本,人類 72.36%,論文當時最好的模型 12.24%

如果要量第七層,GAIA 這種需要同時查好幾個來源的題目,比較接近 Kim et al. 說多代理會贏的那一類。這是我的判斷,我還沒跑過。


這麼做的代價

第一,多跑幾次要錢。 k 次試次就是 k 倍的費用,第 28 篇三次的 10 題就花了 4.82 美元,而題目少的時候,跑再多次也縮不了題目數造成的誤差。

第二,評分者本身要被評。 程式評分要確認測試夠嚴,模型評分要先跟人校準,兩邊都要有人回頭讀執行紀錄。

第三,評測會飽和,也會壞。 能力評測過關之後只剩回歸的用途,要量新的能力就得出新的題,而新的題要先過兩種效度那一關。


這一篇多了什麼,又多付了什麼

多了什麼能力:拆得開一次代理評測的零件(任務、試次、評分者、執行紀錄、結果、兩種 harness),用兩種效度檢查題目本身,分得清能力評測和回歸評測、pass@k 和 pass^k,知道分數要附誤差,也知道三種評分者各適合什麼。回頭看這個系列的成績單,知道 8 分為什麼停住。

多付了什麼代價:k 倍的評測費用、一套要被校準和抽查的評分者,以及一套到頂之後就得換掉的題目。


下一篇

七層都走過了。第 1 篇那個只有模型名稱、長度上限和一個訊息陣列的請求,現在長成了什麼樣子?那三個洞又各補在哪一層?


延伸閱讀

文章與論文


上一篇
多代理的代價:分數沒動、帳單多六成,以及 MAST 整理的 14 種壞法
下一篇
從 LLM 到 Multi-Agents:七層走完,一個 messages 請求裡到底多了什麼
系列文
從 LLM 到 Agent:用 Claude 拆解現代 AI 工程的每一層 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言