OCR 讀你的 Git diff,把變更檔交給可呼叫工具的 LLM Agent,產生精確到行的結構化評論。它能讀完整檔案、搜尋 codebase、查看其他變更檔做脈絡,產出「深層評論」而非表面的 diff 回饋。
如果你用過 Claude Code 這類通用 agent 的 review skill,一定遇過這些痛點:
| 問題 | 現象 |
|---|---|
| 覆蓋不全 | 較大的變更集,agent 傾向「偷工」——只挑部分檔案審,漏掉其他 |
| 位置漂移 | 評論的檔案與行號常對不上實際程式碼 |
| 品質不穩 | 自然語言驅動的 skill 難除錯,prompt 微調就會讓品質大幅波動 |
根因:純語言驅動的架構,對評審流程缺乏硬性約束。
OCR 把「不能出錯的部分」交給工程邏輯,把「動態決策」交給 Agent。
message_en.properties 與 message_zh.properties),每個 bundle 以子 agent 隔離執行——大變更集也穩、可並行。ocr review
→ bootstrap 解析 LLM 端點、載入模板/工具/規則
→ diff provider git diff → []model.Diff(workspace/commit/range)
→ filter & rules 五重門過濾 + 每檔選規則
→ subtask dispatch 每檔一個子 agent(concurrency=8):plan → main 迴圈
→ output writer 行解析 + 評審過濾,渲染 text 或 JSON
每個通過過濾的檔案,OCR 啟動一個子 agent,在自己的 goroutine 中跑,受 --concurrency(預設 8)約束。
PLAN_MODE_LINE_THRESHOLD)才跑。單次 LLM 呼叫、不給工具,產出清單作為 main prompt 的指引。MAX_TOOL_REQUEST_TIMES)。收集 code_comment 呼叫作為評審評論。記憶體超過預算時觸發三分區壓縮。長的工具呼叫迴圈終會溢出 context。OCR 用 MAX_TOKENS = 58888 的預算管理:
| 閾值 | 動作 |
|---|---|
| 60% | 啟動非同步背景壓縮,當前迴圈繼續 |
| 80% | 下一個請求前同步執行壓縮 |
訊息分三區:frozen(前 2 則 system+user)、compress(摘要成一則)、active(最近可裝進預算的完整輪次)。compress 區以 XML 渲染交給 MEMORY_COMPRESSION_TASK,摘要包在 <previous_review_summary> 標籤內。
existing_code 用滑動視窗與 diff 比對,算出精確 start_line/end_line。RE_LOCATION_TASK 請模型重新錨定。REVIEW_FILTER_TASK 對照 diff 檢查評論,移除可證明為錯的。file_read_diff/code_search 理解,但不對「其他檔」的發現發表評論。問自己一個問題:哪些事情是「不能出錯」的?檔案選擇、規則匹配、排除邏輯——這些用工程程式碼(確定性)處理。哪些是「需要動腦」的?理解 diff、判斷缺陷、寫評論——這些用 LLM Agent。混合的關鍵是界線:確定性管線為 Agent 準備好精確的輸入,Agent 只需要專注在推理。
frozen(前 2 則 system+user)永遠不壓縮——這是 Agent 的「記憶起點」。compress 區是已被摘要的歷史。active 是最近的完整輪次。壓縮發生在 60%(非同步,迴圈繼續)和 80%(同步,阻塞下一次請求)。實務意義:60% 時壓縮幾乎無感,80% 時你會感受到延遲。這就是為什麼 --max-tokens 很重要——越大的預算,壓縮觸發越晚。
OCR 刻意不做的三件事都有同一個原因:確定性。
這些選擇讓 OCR 的行為可重複、成本可預測。重試和跨檔推理是包住它的 CI 管線的責任。