Benchmark

與通用 Agent(Claude Code)比較:Precision / F1 更高,token 只要 1/9

一句話結論

與通用 agent(Claude Code)比較,Open Code Review 在相同底層模型下達到顯著更高的 Precision 與 F1,而 token 消耗只有約 1/9、完成得更快。注意它的 Recall 較低——這是刻意取捨:優先精準、降低雜訊。

基準建構

指標

指標量什麼為什麼重要
F1Precision 與 Recall 的調和平均整體評審品質的最佳單一數字
Precision回報問題中「真實缺陷」的比例越高 = 越少的誤報要 triage
Recall真實缺陷中被找到的比例越高 = 越少問題漏過
Avg Time每次評審的牆鐘時間影響 CI 管線延遲
Avg Token每次評審消耗總 token直接影響 API 成本
為什麼省 token?確定性管線(精確檔案選擇、智慧 bundling、規則匹配、定位模組)讓 agent 只需要專注在「真正要動腦」的部分——不重複讀檔、不盲目探索,token 自然只有通用 agent 的 1/9。
Recall 的取捨:通用 agent 通常會掃更多、報更多(高 Recall),但誤報也多。OCR 刻意選擇「少而準」——多數工程團隊在 code review 上更痛的是雜訊而不是漏檢。
📖 教學解說:Benchmark 深入解讀

Precision vs Recall 的取捨邏輯

通用 agent(Claude Code)通常有較高的 Recall(找到更多問題),但 Precision 較低(誤報多)。OCR 刻意選擇「少而準」——多數工程團隊在 code review 上更痛的是雜訊而不是漏檢。誤報需要人工 triage,成本高;漏檢可以在後續 review 中補上。

為什麼省 9 倍 token

確定性管線讓 Agent 只需要專注在「真正要動腦」的部分:

  • 精確檔案選擇 → 不審不需要的檔
  • 智慧 bundling → 相關檔案併在一起審
  • 規則匹配 → 模型注意力精準聚焦
  • 定位模組 → 不浪費 token 在行號計算上

結果:同一個模型,token 消耗只有 1/9。

基準建構的可信度

50 個熱門開源 repo、200 個真實 PR、10 種語言、80+ 資深工程師交叉驗證、1,505 條標註 ground-truth。這不是玩具基準——這是生產級的評估。

🔍 Worked Example:解讀 Benchmark 結果

Step 1 — 比較 Precision

假設 OCR 回報 10 條評論,其中 8 條是真實缺陷 → Precision = 80%。通用 agent 回報 25 條,其中 12 條是真實缺陷 → Precision = 48%。

Step 2 — 比較 Recall

地面真相有 15 條缺陷。OCR 找到 8 條 → Recall = 53%。通用 agent 找到 12 條 → Recall = 80%。

Step 3 — 比較 F1

OCR: F1 = 2 × (0.8 × 0.53) / (0.8 + 0.53) = 64%。通用 agent: F1 = 2 × (0.48 × 0.8) / (0.48 + 0.8) = 60%。OCR 的 F1 更高,因為 Precision 的提升補償了 Recall 的下降。

Step 4 — 比較成本

OCR 平均消耗 3,200 token/PR。通用 agent 平均消耗 28,800 token/PR。OCR 只花 1/9 的成本。

練習 / 驗收清單

  • 能解釋 Precision vs Recall 的取捨邏輯
  • 能說明為什麼省 9 倍 token
  • 能描述基準建構的可信度

完整 benchmark 圖表與方法論見上游 README Benchmark 段。

① 進階真實情境 Worked Example:在自己 repo 上跑一次迷你 Benchmark

情境

你的團隊想驗證「OCR 在我們自己的 codebase 上值不值得上 CI」。你不信任公開 benchmark(那 50 個 repo 跟你的技術棧無關),所以決定用最近 20 顆已合併的真實 PR 跑一次迷你測量——比對「OCR 發現」對「開發者事後真正修的 bug」。

Step 1 — 收集 PR 的事後修正當 ground truth

# 挑 20 顆已合併 PR,用 git log 找「合併後緊接的 bug-fix commit」
git log --oneline --grep="fix" main..feature  | head -20

事後修正 commit 裡的 diff 就是「這顆 PR 漏掉的真實缺陷」——標準的 ground-truth 素材。

Step 2 — 對每顆 PR 跑 OCR(固定 ref,避免漂移)

for pr in $(cat pr-shas.txt); do
  ocr review -c "$pr" --format json --audience agent \
    --background "review for benchmark" > "out/$pr.json"
done

用 -c <sha> 而非 --from/--to——單 commit 評審的結果可重現,適合量測。

Step 3 — 對照統計

jq -r '[.comments[] | {path, content}]' out/*.json \
  | rg -i "null pointer|nil|panic|data race|deadlock|leak" | wc -l

關鍵問題:OCR 有沒有在「事後 bug-fix 會碰的同一段程式碼」發評論?命中 = 真 Recall;沒命中 = 漏檢。

為什麼選這條審查路徑

公開 benchmark 回答「這工具整體強不強」;你自己 repo 的 mini-benchmark 回答「這工具對我的 codebase 有沒有用」。用「合併後 bug-fix」當 ground truth,比人工標註省力且客觀——但注意取樣偏誤:只會測到「被發現的 bug」,「還沒爆的雷」是統計不到的。

預期產出

20 顆 PR、OCR 平均 2.4 條評論/PR、每顆 4,200 token
其中 6 顆 PR 的事後 fix 落在 OCR 有評論的同一區塊 → 粗略 Recall ≈ 30%
→ 結論:上 CI 當「第一道閘」值得,但別當最後一道

② 深入原理擴充:評分的統計陷阱與「看起來高分其實有隱患」

F1 背後的統計陷阱

  • 標註偏誤——1,505 條 ground-truth 是 80+ 工程師標的。對「有爭議的評論」標成 positive 還是 negative,直接決定 Precision 高 10% 還是低 10%。
  • 取樣偏誤——200 顆 PR 多數是「中等複雜度」。如果你的 repo 全是巨型 PR 或全是 5 行小 PR,數字會大幅漂移。
  • 模型偏誤——benchmark 是「某個時刻的某個模型」跑出來的。換模型、換 prompt 模板、換 --max-tokens,Precision/Recall 都會變。基準數字是快照,不是承諾。

「看起來通過評分但其實有隱患」的案例

# 假設你的 repo 規則太鬆:include 只有 src/**,exclude 沒擋 generated/
# → OCR「精準地」評審了一堆生成碼,真正的核心邏輯沒被審

ocr review --preview   # 才發現 40% 的「可審檔案」是 .gen.ts / .pb.go

Precision 95% 看起來很美——但如果那 95% 都集中在生成碼上,對真實生產程式碼的 Recall 是 零。分數高 ≠ 有效,要同時看「被評審的檔到底是不是你關心的檔」。用 --preview 檢查過濾範圍,是你自己的「benchmark 有效性檢查」。

③ 診斷式疑難排解

症狀可能原因解決方案
mini-benchmark 的 Precision 特別低你的 repo 規則沒針對自家慣例寫,Agent 在猜寫 rule.json 涵蓋自家慣例(nil 慣例、錯誤處理模式),再重跑
OCR 幾乎每顆 PR 都零評論規則 include 太窄,或變更都是生成碼跑 ocr review --preview 看過濾範圍;擴 include / 縮 exclude
同顆 PR 重跑結果不同非確定性 LLM + 不同時刻模型版本固定模型與模板版本;量測用 -c <sha> 單 commit
公開 benchmark 的 token 數字比你的高很多人家的 PR 平均變更量、語言複雜度不同用「每行 diff token」做正規化再比較
「事後 bug-fix」完全沒被任何評論命中OCR 的「少而準」取捨下,漏掉正是它的代價接受低 Recall;把 OCR 定位成第一道閘,配人工複查與測試

④ 進階挑戰題

  1. 挑戰一:你的 repo 有 3 種語言(Go、TS、SQL XML mapper)。設計一套規則檔,讓 OCR 在 benchmark 中「對三種語言各有一套檢視重點」。
  2. 挑戰二:解釋為什麼「用合併後的 bug-fix commit 當 ground truth」會系統性低估 Recall?提示:未爆的 bug、被 review 檔掉的 bug、以及「換了修法但沒標 fix」的 commit。
  3. 挑戰三:如何設計一個實驗來分離「模型強度」與「OCR 管線」對 Precision 的貢獻?(提示:同一模型跑通用 agent 與 OCR 對照)

① 專案級端到端 Worked Example:建立團隊自己的「評審品質評測平台」

情境

你們公司要在「換模型」與「改規則」時知道會發生什麼——不想每次靠感覺。你要建立一套持續評測平台:固定的測試集(golden set)、可重現的評審、自動計算 Precision/Recall/成本、每次變更(模型、規則、模板)都跑一遍並出報告。

Step 1 — 建立 golden set(把「事後修正」當 ground truth)

# 挑 50 顆已合併 PR + 它們的「事後 bug-fix commit」
# fix commit 的 diff = 該 PR 漏掉的真實缺陷(ground truth)
for pr in $(cat golden-pr-shas.txt); do
  git show --stat "$pr" | head -5
done

Step 2 — 建立評測腳本(固定 ref 與模型,可重現)

#!/usr/bin/env bash
# eval-ocr.sh <model> <rules-file>
MODEL="$1"; RULES="$2"
for pr in $(cat golden-pr-shas.txt); do
  ocr review -c "$pr" --model "$MODEL" --rule "$RULES" \
    --format json --audience agent > "out/$MODEL/$pr.json"
done

Step 3 — 自動比對「評論是否命中 ground truth 的檔案/行」

# 對每條評論,檢查 fix-commit 改到的檔案是否被評論覆蓋
python3 eval-match.py out/$MODEL/*.json golden-fixes.json
# → 輸出 precision / recall / f1 / total_tokens / wall_time

Step 4 — 每次變更跑一遍,輸出對照報告

eval-ocr.sh claude-opus-4-6 .opencodereview/rule.json
eval-ocr.sh claude-sonnet-4-5 .opencodereview/rule.json   # 換模型
eval-ocr.sh claude-opus-4-6 .opencodereview/rule-v2.json  # 改規則
# 比較: F1、成本、延遲 → 用數據決定「升級 or 維持」

為什麼選這條路徑

公開 benchmark 回答「這工具整體強不強」;自己的 golden set 回答「對我的 codebase、我的模型、我的規則,強不強」。固定的 -c <sha> + 固定模型讓評測可重現;自動比對「評論 vs fix commit」讓 Precision/Recall 客觀(雖會低估 Recall,因為「未爆的 bug」測不到)。這套平台讓「換模型」從爭論變成看表決策。

預期產出

model A: F1 0.58, $1.9/PR, 38s
model B: F1 0.61, $3.4/PR, 51s
rule v2: F1 0.63 (both models), 成本 -12%(規則讓 agent 少探索)
→ 決策: 保留 model A + rule v2(成本效率最高)

② 效能 / 品質 / 安全深度:評測三面向

效能:評測本身的成本

評測 50 顆 PR × 2 模型 × 2 規則 = 200 次評審——這是會燒錢的。控制方式:① 用「每行 diff token」正規化比較(PR 大小不同);② 只對「高資訊量」的 20 顆 PR 做每日 smoke eval,50 顆做每週 full eval;③ 把輸出 out/<model>/<pr>.json 快取,模型/規則沒變的組合直接重用。

品質:評測指標的陷阱

「Precision 95%」若評論集中在生成碼就沒意義——分數高 ≠ 有效。評測要同時輸出的不是只有 F1,還有「評論落在真實生產碼 vs 生成碼」的分布。另外「用事後 fix 當 ground truth」會系統性低估 Recall(未爆的雷、被 review 檔掉的 bug 都測不到)——這代表「Recall 提高」是真改善,「Recall 低」未必是退化。

安全:評測資料的敏感性

golden set 是「真實 PR + 真實缺陷」——可能含未公開的漏洞細節。不要把 golden set 放公開 repo;評測用的 OCR_LLM_* secret 用獨立的評測帳號(與生產 CI 分離),避免評測失敗波及生產流程。

③ 文件間比較對照表

面向本文(Benchmark)相關文差異說明
量測目的公開 benchmark:工具整體強度telemetry.htmlbenchmark 是「離線量測品質」,telemetry 是「上線量測運行健康」——前者測 F1,後者測時長/錯誤率
ground truth80+ 工程師標註 1,505 條faq.html(零評論診斷)FAQ 教你「評審結果為何如此」;benchmark 教你「結果準不準」——不同層次
成本數據token 1/9 的對比結論configuration.html(max_tokens)成本來自「管線設計」;設定頁教「用參數控制成本」——兩個槓桿不同
模型影響「某時刻的某模型」的快照cli.html(--model)benchmark 數值是快照;CLI 可隨時換模型——換了就要重測,這就是評測平台存在的理由

④ 互動式檢核清單

進階驗收:你能建立並維護一套評測平台嗎?

  • - [ ] 能收集 20-50 顆「PR + 事後 fix」當 golden set 並說明其偏誤
  • - [ ] 能用固定 -c <sha> + 固定模型跑出可重現的評審
  • - [ ] 能寫腳本自動比對「評論 vs fix commit」算出 Precision/Recall/F1
  • - [ ] 能解釋「分數高 ≠ 有效」並檢查評論是否落在真實生產碼
  • - [ ] 能用每行 diff token 正規化跨模型成本比較
  • - [ ] 能保護 golden set 與評測憑證的安全邊界