AI程式碼審查需要異議,而不是共識
adamsreview描述了一套由6個命令組成的程式碼審查流程,包含平行審查視角、驗證關口、人類導覽、Codex同儕審查,以及在提交前重新審查變更的修正迴圈。1
這套設計指出了AI程式碼審查真正的前沿。更好的審查,不是再多一串機器人留言。更好的審查來自彼此獨立的審查者:它們會提出不同意見、保留分歧、驗證主張,並在專案把某項發現視為阻擋因素之前,把判斷交回人類審查者。
重點摘要
AI程式碼審查應該優化的是有紀律的異議,而不是共識。一套有用的審查系統會分派獨立視角、合併重複發現、驗證每一項主張、區分已確認的錯誤與需要人工判斷的事項,並讓人類審查者維持正式審查者身分。共識可能掩蓋罕見但重要的發現。審查資料包應該保留少數主張,直到證據推翻它們,再追蹤修正與重新審查結果。
關鍵收穫
給工程主管: - 將AI審查視為證據流程,而不是投票系統。 - 即使代理找到真實錯誤,合併權限仍應留在人類手上。
給代理建置者: - 指派具備不同任務的獨立審查視角:正確性、安全性、測試、使用者影響、可維護性、執行環境行為與發布風險。 - 在驗證推翻之前,將少數發現保留為結構化主張。
給程式碼審查者: - 要求證據、重現步驟、受影響檔案、驗證結果、人類決策狀態與修正驗證。 - 拒絕那些把「一致同意」當成信心、卻沒有證明底層主張的審查系統。
為什麼AI程式碼審查需要異議?
當每位審查者都在尋找同一類缺陷時,程式碼審查會悄悄失效。
單一代理審查會形成單一失敗模式。模型掃描差異、產生看似合理的留言,然後漏掉注意力範圍之外的問題。多代理審查只有在代理保持獨立時,才能改善這種模式。如果5個代理讀同一個提示、繼承同一套優先順序,最後收斂成同一份摘要,系統得到的只是重複。
異議會改變審查涵蓋面。安全性審查者可能反對一段正確性審查者接受的請求流程。測試審查者可能在產品審查者認可行為後,指出缺少回歸測試覆蓋。執行環境審查者可能拒絕一個程式碼看起來乾淨、但在部署限制下會失敗的實作。
少數發現很重要,因為嚴重錯誤往往一開始只是孤立的反對意見。共識分數可能埋掉這個反對。一套好的審查流程會讓反對意見存活夠久,直到主張被證明或推翻。
獨立審查者應該檢查什麼?
獨立審查者需要分開的任務,而不是不同的名稱。
| 視角 | 核心問題 | 必要證據 |
|---|---|---|
| 正確性 | 程式碼是否做到變更宣稱的事? | 受影響路徑、失敗情境、預期行為 |
| 安全性 | 使用者、相依套件或呼叫端是否能濫用這項變更? | 威脅模型、可到達輸入、攻擊草圖或阻擋因素 |
| 測試 | 如果沒有失敗測試,這個錯誤是否會回來? | 測試缺口、建議斷言、測試夾具或路徑 |
| 產品 | 這個行為是否服務使用者? | 使用者路徑、狀態轉換、文案或互動風險 |
| 可維護性 | 未來變更是否會破壞設計? | 耦合、重複邏輯、不清楚的所有權 |
| 執行環境 | 這項變更能否承受真實部署? | 設定、遷移、快取、佇列或效能證明 |
| 發布 | 團隊能否回復或稽核結果? | 提交邊界、部署證明、監控、未解缺口 |
視角清單應依儲存庫調整。付款系統需要詐欺與對帳視角。編譯器需要健全性、診斷與效能視角。出版系統需要引用、SEO、翻譯與快取視角。
機制保持穩定:每個視角產生的是主張,不是裁決。
為什麼共識不是好的審查訊號?
共識回答的是錯誤問題。
多數決問的是許多審查者是否同意。程式碼審查需要知道的是,一項主張能否經得起程式碼、測試、執行環境與專案政策檢驗。
一致同意可能代表發現很明顯。也可能代表每位審查者都共享同一個盲點。分歧可能是雜訊。也可能代表某位審查者找到了真正的錯誤。
更好的指標是主張狀態:
| 狀態 | 意義 | 下一步 |
|---|---|---|
| 已提出 | 某個視角提出可能缺陷 | 合併重複項並驗證 |
| 已確認 | 證據支持這項發現 | 修正或指派負責人 |
| 已推翻 | 驗證反駁這項發現 | 記錄原因並關閉 |
| 人工判斷 | 由人類判斷決定結果 | 轉交審查者 |
| 僅報告 | 發現重要但不應阻擋 | 保留在資料包中 |
| 已修正 | 已嘗試用變更解決發現 | 重新審查修正 |
| 已回歸 | 修正引入新問題 | 還原或重新設計 |
這個狀態機勝過共識,因為它把分歧視為證據庫存。流程可以關閉嘈雜的發現而不抹除它們,也能在驗證證明缺陷時,把孤立發現升級。
強健的AI審查流程會做什麼?
強健的AI程式碼審查流程會分階段執行。
- 獨立偵測。審查視角在看不到彼此結論的情況下檢查差異。
- 合併重複主張。系統會群組等價發現,但不會把不同證據壓平。
- 低成本驗證。快速檢查會抓出站不住腳的主張:檔案是否存在、變更行是否可到達、測試是否存在、型別錯誤與明顯過期的脈絡。
- 深度驗證。高影響主張會接受較慢的審查:重現、讀取追蹤、聚焦測試、安全推理或第二模型批判。
- 分類狀態。流程會將每項發現標記為已確認、已推翻、人工判斷、僅報告或低於門檻。
- 帶人類走過不確定性。審查者決定需要判斷的事項、升級重要主張,並拒絕低價值工作。
- 按群組修正。相關發現一起移動,避免系統套用互相衝突的修補。
- 重新審查修正。流程再次審查已變更的程式碼,並在提交前還原回歸。
- 寫出資料包。最終產物會記錄發現、證據、決策、測試、提交與未解缺口。
adamsreview提供了這種形態的具體範例。它的README描述最多7個平行子代理視角、重複項合併、先低成本後深度的驗證、選用的整體審查、Codex審查同儕、外部發現注入、不確定發現的導覽,以及會在提交存活修正前重新審查並還原回歸的修正迴圈。1 README也把效能主張標為軼事證據,這點很重要。應把這個專案視為有用的設計證據,而不是基準測試。
AI程式碼審查發現應該長什麼樣子?
有用的發現需要足夠的結構,讓另一位審查者、代理或CI工作稍後檢查。
id: SEC-003
lens: security
claim: "The new webhook endpoint accepts unsigned retry requests."
severity: high
affected_files:
- app/routes/webhooks.py
evidence:
- "Handler reads JSON before signature validation."
- "Test suite covers valid signatures but not missing signatures."
validator:
cheap_check: pass
deep_check: manual
reason: "Reachable path confirmed; exploit impact needs owner judgment."
human_decision:
status: promoted
reviewer: "reviewer of record"
fix_group: webhook-auth
post_fix_review:
status: pending
remaining_gap: "Need replay test against malformed retry payload."
確切欄位可以改變。紀律不應改變。發現要命名主張、證據、驗證結果、人類決策、修正群組、修正後狀態與剩餘缺口。只寫「檢查webhook auth」的留言,無法支撐負責任的合併決策。結構化發現可以。
為什麼人類必須維持正式審查者身分?
GitHub的審查模型在合併前給審查者3種高階結果:留言、核准或要求變更。2 AI審查可以支援這些結果。不應悄悄取代它們。
Rust草案LLM政策清楚劃出這條界線。截至2026年5月18日,該政策仍是開放中的pull request,尚未成為已採納的Rust政策。3 草案允許私人LLM審查,但禁止把LLM審查視為足以合併或拒絕變更。它也說審查機器人必須維持諮詢性質,機器人留言本身不得阻擋合併,而人類審查者必須明確背書他們希望處理的留言。4
這條邊界保護問責。一個機器人可以發現真實錯誤。機器人也可能產生過期留言、膚淺的風格反對,或充滿自信的誤判。正式審查者擁有阻擋、合併、要求變更或忽略主張的決策責任。
人類角色應該出現在產物中:
| 欄位 | 重要原因 |
|---|---|
| 審查者決策 | 區分機器主張與人類判斷 |
| 已升級發現 | 記錄人類升級了哪些不確定主張 |
| 已拒絕發現 | 避免後續執行重複出現機器人雜訊 |
| 政策邊界 | 顯示主張是阻擋合併,還是只支援審查 |
| 剩餘缺口 | 摘要之後仍讓未驗證工作可見 |
AI審查在讓人類審查更銳利時贏得信任。當它把權限藏在機器人裁決裡時,就會失去信任。
審查資料包應包含什麼?
審查資料包會把一次審查執行轉化為可持久保存的決策物件。
最低欄位:
| 資料包欄位 | 內容 |
|---|---|
| 範圍 | PR、分支、基底提交、head提交、已審查檔案 |
| 視角 | 審查任務、模型或工具身分、獨立性註記 |
| 發現 | ID、主張、嚴重性、檔案、行號、證據、受影響路徑 |
| 驗證 | 低成本檢查結果、深度檢查結果、狀態原因 |
| 人類決策 | 已升級、已略過、已接受、已拒絕、需要負責人 |
| 修正群組 | 群組化發現、修補摘要、提交邊界 |
| 重新審查 | 修正後結果、找到的回歸、還原 |
| 發布證明 | 測試、CI、部署或相關執行環境檢查 |
| 缺口 | 未驗證主張、人工後續處理、原生領域審查 |
資料包不應讀起來像逐字紀錄。逐字紀錄顯示發生過的一切。審查資料包顯示負責任的審查者做決策時需要知道的事。
資料包也保留組織記憶。當同一個誤判下週再度出現,團隊可以看到它為什麼不成立。當少數發現變成正式環境錯誤時,團隊可以檢視該主張如何通過系統。
研究如何看待代理式PR失敗?
這種失敗模式不只發生在審查機器人身上。
一篇MSR 2026論文分析了GitHub上33,000個由代理撰寫的pull request,發現文件、CI與建置更新任務的合併成功率最高,而效能與錯誤修正任務表現最差。5 作者也發現,未合併的PR通常觸及更多檔案、變更更大,而且CI失敗。他們的質性分析指出了多種拒絕模式,例如審查者參與不足、重複PR、不需要的實作,以及代理與需求不一致。5
這些發現支持一條務實規則:AI程式碼審查不應只問差異是否有錯誤。它也應該問代理工作流程是否交給維護者一個可審查的物件。大型、錯位、審查薄弱的PR需要更好的審查資料包、更窄的提交邊界,以及更強的人類決策點。
團隊應如何開始?
從一套小型審查系統開始。它要產生更好的決策,而不是更多留言。
- 為風險最高的程式碼路徑挑選2到3個視角。
- 要求每項發現都包含主張、證據、受影響檔案與驗證結果。
- 保留少數發現,直到驗證器推翻它們。
- 把需要人工判斷的主張交給人類審查者,而不是藏在分數底下。
- 追蹤誤判,讓系統學會團隊會拒絕什麼。
- 在提交前重新審查修正。
- 將資料包附到PR。
不要從自動修補開始。先從可信的審查產物開始。當發現流程取得信任後,才能接著開放狹窄的自動修正通道:機械式測試、明顯的null檢查、錯字等級修正,或人類在導覽中升級的修正。
目標不是讓程式碼審查感覺自主。目標是讓人類審查更難被騙過。
快速總結
AI程式碼審查需要獨立異議,因為光靠一致同意無法證明一項發現。強健的系統會依任務分隔審查者、保留少數主張、驗證證據、將不確定性轉交給人類,並在提交前重新審查修正。GitHub的審查契約仍以人類審查狀態作結。2 Rust草案政策讓LLM審查維持諮詢性質,直到人類背書該主張。4 adamsreview展示了一種目前的流程形態,包含視角、關口、導覽與修正重新審查。1
勝出的產物不是機器人留言。勝出的產物是讓人類能負責任決策的審查資料包。
FAQ
什麼是AI程式碼審查?
AI程式碼審查使用語言模型或代理檢查程式碼變更、識別可能缺陷、說明風險、建議修正,或為人類準備審查產物。嚴謹的系統應為每項發現提供證據與狀態,而不只是張貼留言。
AI程式碼審查應該使用多個代理嗎?
當每個代理都有獨立任務,而且流程會保留分歧時,多個代理有幫助。若每個代理看到相同提示、產生相同摘要,最後收斂成共識分數,多代理的價值就很有限。
為什麼在AI程式碼審查中,異議比共識更好?
異議會讓罕見發現保持可見,直到證據證明或推翻它們。當多數審查者都漏掉同一個邊界案例時,共識可能掩蓋嚴重的少數發現。程式碼審查需要已驗證的主張,而不只是同意。
AI審查者可以阻擋pull request嗎?
團隊應讓阻擋權限留在人類手上。Rust草案LLM政策說,LLM審查必須維持諮詢性質,而且審查者必須在阻擋PR之前明確背書LLM留言。4 這項規則符合更廣泛的問責原則:人類審查者擁有合併決策。
AI審查資料包應包含什麼?
AI審查資料包應包含範圍、視角、發現、證據、驗證結果、人類決策、修正群組、重新審查結果、相關發布證明與未解缺口。資料包應讓審查決策可以稽核,而不必強迫讀者讀完整份逐字紀錄。
團隊何時應允許自動修正?
團隊應該只在發現流程取得信任後,才允許自動修正。先從機械式、低風險修正開始,或從人類在審查中升級的發現開始。每個自動修正都需要修正後審查與回復路徑。
參考資料
-
Adam Miller,
adamsreview, GitHub repository README。2026年5月18日的當前會話驗證發現,README描述了一套多階段程式碼審查流程,包含平行子代理偵測、驗證通道、持久化JSON狀態、Codex同儕審查、導覽、外部發現注入,以及會在提交前重新審查並還原回歸的自動修正迴圈。 ↩↩↩ -
GitHub Docs, “About pull request reviews,” GitHub pull request審查模型來源,包含留言、核准、要求變更、行內留言、建議變更與審查請求。 ↩↩
-
jyn514, “Add an LLM policy for
rust-lang/rust,” rust-lang/rust-forge pull request #1040。2026年5月18日的當前會話GitHub API驗證發現state=open、merged=false、merged_at=null、65則issue留言、284則審查留言,以及updated_at=2026-05-17T20:33:12Z。 ↩ -
jyn514 branch proposal, “LLM Usage Policy,” proposed
src/policies/llm-usage.mdfor rust-lang/rust-forge pull request #1040。這是草案規則的來源,內容包含允許私人LLM審查、要求審查機器人維持諮詢性質、要求人類背書後LLM留言才能阻擋PR,以及將貢獻者視為自己工作成果的負責人。 ↩↩↩ -
Ramtin Ehsani, Sakshi Pathak, Shriya Rawal, Abdullah Al Mujahid, Mia Mohammad Imran, and Preetha Chatterjee, “Where Do AI Coding Agents Fail? An Empirical Study of Failed Agentic Pull Requests in GitHub,” arXiv:2601.15195,提交於2026年1月21日,已被MSR 2026接受。這是33,000個代理撰寫PR研究、合併成功模式、CI與變更規模觀察,以及拒絕模式的來源。 ↩↩