與通用 agent(Claude Code)比較,Open Code Review 在相同底層模型下達到顯著更高的 Precision 與 F1,而 token 消耗只有約 1/9、完成得更快。注意它的 Recall 較低——這是刻意取捨:優先精準、降低雜訊。
| 指標 | 量什麼 | 為什麼重要 |
|---|---|---|
| F1 | Precision 與 Recall 的調和平均 | 整體評審品質的最佳單一數字 |
| Precision | 回報問題中「真實缺陷」的比例 | 越高 = 越少的誤報要 triage |
| Recall | 真實缺陷中被找到的比例 | 越高 = 越少問題漏過 |
| Avg Time | 每次評審的牆鐘時間 | 影響 CI 管線延遲 |
| Avg Token | 每次評審消耗總 token | 直接影響 API 成本 |
通用 agent(Claude Code)通常有較高的 Recall(找到更多問題),但 Precision 較低(誤報多)。OCR 刻意選擇「少而準」——多數工程團隊在 code review 上更痛的是雜訊而不是漏檢。誤報需要人工 triage,成本高;漏檢可以在後續 review 中補上。
確定性管線讓 Agent 只需要專注在「真正要動腦」的部分:
結果:同一個模型,token 消耗只有 1/9。
50 個熱門開源 repo、200 個真實 PR、10 種語言、80+ 資深工程師交叉驗證、1,505 條標註 ground-truth。這不是玩具基準——這是生產級的評估。
假設 OCR 回報 10 條評論,其中 8 條是真實缺陷 → Precision = 80%。通用 agent 回報 25 條,其中 12 條是真實缺陷 → Precision = 48%。
地面真相有 15 條缺陷。OCR 找到 8 條 → Recall = 53%。通用 agent 找到 12 條 → Recall = 80%。
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 的下降。
OCR 平均消耗 3,200 token/PR。通用 agent 平均消耗 28,800 token/PR。OCR 只花 1/9 的成本。
完整 benchmark 圖表與方法論見上游 README Benchmark 段。
你的團隊想驗證「OCR 在我們自己的 codebase 上值不值得上 CI」。你不信任公開 benchmark(那 50 個 repo 跟你的技術棧無關),所以決定用最近 20 顆已合併的真實 PR 跑一次迷你測量——比對「OCR 發現」對「開發者事後真正修的 bug」。
# 挑 20 顆已合併 PR,用 git log 找「合併後緊接的 bug-fix commit」
git log --oneline --grep="fix" main..feature | head -20
事後修正 commit 裡的 diff 就是「這顆 PR 漏掉的真實缺陷」——標準的 ground-truth 素材。
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 評審的結果可重現,適合量測。
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 當「第一道閘」值得,但別當最後一道
--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 定位成第一道閘,配人工複查與測試 |
你們公司要在「換模型」與「改規則」時知道會發生什麼——不想每次靠感覺。你要建立一套持續評測平台:固定的測試集(golden set)、可重現的評審、自動計算 Precision/Recall/成本、每次變更(模型、規則、模板)都跑一遍並出報告。
# 挑 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
#!/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
# 對每條評論,檢查 fix-commit 改到的檔案是否被評論覆蓋
python3 eval-match.py out/$MODEL/*.json golden-fixes.json
# → 輸出 precision / recall / f1 / total_tokens / wall_time
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.html | benchmark 是「離線量測品質」,telemetry 是「上線量測運行健康」——前者測 F1,後者測時長/錯誤率 |
| ground truth | 80+ 工程師標註 1,505 條 | faq.html(零評論診斷) | FAQ 教你「評審結果為何如此」;benchmark 教你「結果準不準」——不同層次 |
| 成本數據 | token 1/9 的對比結論 | configuration.html(max_tokens) | 成本來自「管線設計」;設定頁教「用參數控制成本」——兩個槓桿不同 |
| 模型影響 | 「某時刻的某模型」的快照 | cli.html(--model) | benchmark 數值是快照;CLI 可隨時換模型——換了就要重測,這就是評測平台存在的理由 |
-c <sha> + 固定模型跑出可重現的評審