

Atsushi Nakatsugawa
June 24, 2026
1 min read
Code context: The evidence behind trustworthy AI code reviewの意訳です。
コードレビューの品質は、レビュー対象となる変更の背後にあるコンテキストの質を超えることはありません。15行の変更差分を承認してほしいとAIレビュアーに頼めば、差分は問題なさそうだと答えるでしょう。それは正しいのですが、もしその15行が、3つ先のサービスにあるAPI契約を気づかないうちに壊しているとすれば、的外れな回答です。役に立つコメントと、自信たっぷりの誤ったコメントを分けるのは、レビュアーが実際に何を見られるかです。
その見える根拠こそがコードコンテキストです。すなわち、変更された行の外側でレビュアーが参照できるコードベース、規約、履歴、そして意思決定のことです。これを欠いたレビュアーは、浅い、あるいは誤ったフィードバックを生み出します。BacchelliとBirdによる2013年のMicrosoftの研究は、この点を端的に述べています。
「コンテキストと変更の理解こそが、あらゆるレビューの鍵である」
AIコードレビューエージェントを評価するなら、それがコード品質を評価するために使う根拠を評価しましょう。
効果的なレビューは、変更差分以外の知識に依存します。変更された行だけに限定されたプロセスは、本番環境を壊す欠陥を見逃します。もちろん、差分以上のものを必要としない変更も数多くあります。タイプミスの修正や、自己完結したヘルパー関数などは、それ単体で読んでも問題ありません。害をもたらす欠陥とは、その影響範囲が変更された行の外側にまで及ぶものです。
2013年のMicrosoftの研究は、レビューの成果が「期待されていたほどエラーを見つけることに寄与していない」こと、そして開発者が残す欠陥関連のコメントは「主に小さな論理的・低レベルの問題を扱っている」ことを明らかにしました。マクロレベルの欠陥がすり抜けてしまうのは、変更差分がそれらを捉えるために必要なAPI契約、下流の利用者、設計上の意思決定をほとんど含んでいないからです。
Cloudflareのエンジニアリングチームは、差分に限定されたレビューの失敗のパターンを列挙しました。アーキテクチャの理解が損なわれるのは、レビュアーが「なぜシステムがある方法で設計されたのか、その全体的なコンテキストを持っていない」からです。システム横断的な影響が見逃されるのは、「API契約への変更が3つの下流の利用者を壊すかもしれない」ときです。並行処理のバグもまた、それが「特定のタイミングや順序に依存し」、「静的な差分から捉えるのが難しい」ためにレビューをすり抜けます。よくある統合の失敗を思い浮かべてみてください。スキーマの変更はローカルの参照を更新できても、差分のみのレビューでは見えない下流の利用者を壊してしまうことがあります。差分のみのレビュアーは個々のパッチファイルしか処理しないため、影響を受ける利用者を一度も調べないかもしれません。
パターンマッチングだけでは、同じ理由で限界に突き当たります。Sadowskiらによる2018年のGoogleの研究は、およそ900万件のレビュー済み変更を対象に、コードレビューを導入する最大の理由は「コードの理解しやすさと保守しやすさを向上させること」だと結論づけました。パターンベースの検出だけに最適化されたレビュアーは、副次的な目標に最適化されているにすぎません。
コードレビューはコード生成とは異なる仕事です。作者はすでに意図を持っていますが、レビュアーはコードから意図を再構築し、それをシステム全体で成り立つべきことと照らし合わせて検証しなければなりません。実装の詳細を見るだけでは、下流のサービスとの取り決めが守られているかは検証できません。
同じモデルによるレビューは、検証としては弱いものです。自分の成果物を採点するモデルは、甘い採点者になりがちだからです。NeurIPS 2025のワークショップで発表されたSelf-Correction Benchは、「自己修正の盲点」を測定しました。モデルは「外部ソースから来た同一のエラーはうまく修正できる一方で、自分自身の出力に含まれるエラーは修正できない」というものです。14個のモデルにわたる盲点の平均発生率は64.5%でした。Self-Correction Illusionの論文によれば、そのメカニズムは「検証ではなく、扱いやすさ(addressability)」にあります。モデルは検証する能力を保持しているものの、自分自身の出力は調べにくいものとして扱われるのです。
プロンプトを大きくするだけでは、関連性やコード構造の問題は解決できません。コンテキストウィンドウを大きくして済ませたいという衝動に駆られますが、ロングコンテキストに関する研究はそれほど楽観的ではありません。コンテキストウィンドウには関連性やコード構造という概念が組み込まれておらず、コードを詰め込みすぎると、そこにあるものについて推論するモデルの能力がかえって低下しかねません。
ロングコンテキストのふるまいは、単純な失敗モードを生みます。関連するコードが存在していても、モデルにとっては使いにくいままになるのです。論文「中間で迷子になる(Lost in the Middle)」では、性能は「長いコンテキストの中間にある関連情報にモデルがアクセスしなければならないとき、明示的にロングコンテキスト対応とされたモデルであっても、著しく低下する」とされています。アテンションのバイアスは、さらに2つの偏りを生みます。因果的アテンションバイアスによって、モデルは冒頭付近のトークンを重視しやすくなります。また、距離が離れるほど注意が弱まる長期的な減衰によって、モデルは近くにあるトークンほど重視しやすくなります。ウィンドウを無造作に埋めれば、価値の低い定型コードがビジネス上重要なロジックと競合してしまいます。
フラットな検索はコードベースには不向きです。コードには構造があるからです。グラフベースのRAG(検索拡張生成)の手法は、コードの構造的な性質を利用して、抽象構文木(AST)、データフローグラフ、依存グラフといった明示的なグラフ表現を構築します。そこでは、エッジが関数呼び出し、継承、import文、データやコントロールフローを表現します。コンテキストエンジニアリングとは、何をウィンドウに詰めるかをどう決めるかということです。
CodeRabbitは、その考え方をレビューに適用しています。PR、IDEでの変更、CLIワークフローをレビューし、計画立案やPRの作成をSlackに取り込みます。そのコンテキストエンジンは、コードベース、リンクされたチケット、過去のPR、チームの意思決定をインデックス化し、それらのデータを使って、チームの既存の成果に根ざしたレビューフィードバックを生成します。
レビュアーには、脆弱性をファイルをまたいで追跡できるだけのコンテキストが必要です。構文レベルのレビューは怪しい行を指摘できますが、データフロー解析は、信頼できない入力が周辺の呼び出しチェーンを通じて機微な操作に到達するかどうかを検査します。AIが生成したコードは、この種の欠陥を高い割合で生み出します。
ファイルごとの解析は、呼び出しの境界で止まってしまいます。OWASPのDevSecOpsガイドラインが述べるように、ほとんどの静的解析ツールは「テストの範囲が1つのコンポーネントに限定されており、異なるコンポーネントをまたいだテストを実行できません」。基本的なLinter(静的解析)はファイル内の構文やスタイルの問題は捉えられますが、SQLインジェクションのような脆弱性を検出するのに必要な手続き間のデータフロー追跡を欠いています。こうした脆弱性は、信頼できないデータを複数のファイルや呼び出しチェーンをまたいで追跡する必要があります。データフロー解析の研究は、データフロー解析がASTベースの構文的なパターンマッチングよりも精密な情報を提供できることを明らかにしています。
テイント解析はソースからシンクへの経路をたどります。信頼できない入力が、アプリケーションに入ってくる場所から、重要な操作に着地する場所までを追い、汚染されたデータが途中で適切なサニタイズのステップを経ずにシンクに到達したときにだけ脆弱性を確定します。手続き間のテイント追跡には、周辺のコンテキスト、ロジック、そしてコードの各部分どうしの依存関係を考慮するセマンティック解析が必要です。

Common Appのエンジニアリングチームは、.NET Core、Node.js、Angular、Pythonが混在するスタックで、100万人を超える学生出願者の重要な個人識別情報(PII)を扱っています。チームはコードレビューの時間を35%削減し、CodeRabbitのAIによるレビューは、チームがそれまで使っていた静的解析ツールSonarQubeが見逃していた競合状態(レースコンディション)を捉えました。
生成AIのコードは、リスクをさらに高めます。VeracodeのGenAI Code Security Reportは、コードサンプルの45%がセキュリティテストに不合格となり、OWASP Top 10の脆弱性を持ち込んだこと、そしてJavaでは不合格率が72%に達したことを明らかにしました。CodeRabbitの470件のPRのレビューでは、AIが共同作成したPRは人間だけのものより1.7倍多くの問題を抱えており、セキュリティ関連の指摘は1.57倍高いことが分かりました。CodeRabbitは、コンテキストエンジンと並行してLinterやSASTツールを実行するため、構文チェックとファイルをまたぐレビューが同時に走ります。
生成がレビューの処理能力を上回った瞬間から、検証のギャップは理論上の話ではなくなりました。2025年のDORAレポート(DevOps Research and Assessment)は、約5,000人の回答者を対象に、90%が仕事でAIを使い、80%超が生産性の向上を報告している一方で、AIの導入が「ソフトウェアのデリバリー安定性と負の関係を持ち続けている」ことを明らかにしました。テスト、コードレビュー、品質保証といった下流の検証作業が、いまや開発の新しいペースを吸収しています。

PRの量が増えると、それはレビュアーのキューに現れます。freeeでは、AIコーディングエージェントを使うエンジニアが、人間のレビュアーが吸収できる以上のPRを生み出していました。CodeRabbitを約30人のユーザーから285リポジトリにわたる570シートへと拡大した後、freeeは6か月で32.8週間分のレビュアーの時間を削減しました。
Stack Overflowの2025年の調査は、49,000人を超える開発者を対象に、84%がAIツールを使っている、または使う予定であること、その一方で出力の正確さへの信頼が1年で40%から29%に低下したことを明らかにしました。最も経験豊富な開発者は「強く信頼する」割合が最も低く2.6%で、これは「説明責任を負う立場の人々にとって、人間による検証が広く必要とされていることを示しています」。
AIコードレビューエージェントを試すときは、深いコンテキストが実際に変化をもたらすかどうかを検証しましょう。役に立つ問いは実践的なものです。エージェントはシグナルを調整するか、依存関係をたどるか、チームの規約を尊重するか、そしてレビュアーがすでに却下したものを覚えているか、です。
次の4つのチェックを使いましょう。
トライアルで測るべきは、レビューのふるまいであって、レビュアーがアラートにどれだけ耐えられるかではありません。CodeRabbit自身の評価フレームワークは、複数のツールを同じPR上で同時に走らせることに反対しています。
「そのとき測っているのは、ツールが実践でどう機能するかではなく、レビュアーがノイズにどう対処するかになってしまいます」
レビューエージェントは、対称的な設定の手間をかけた上で、条件のそろったリポジトリで並行して走らせましょう。
人間のレビュー処理能力、自己修正の限界、ロングコンテキストの劣化、そしてチームの知識の減衰は、いずれも検証に圧力をかけます。それぞれの圧力には答えがあり、信頼できるレビューレイヤーには、その4つすべてが同時に必要です。

実践的なレビューレイヤーには、コードベース全体の検索に加えて、リンクされたチケット、過去のPR、チームの意思決定の記憶が必要です。CodeRabbitは、開発者がリリースする前のレビューで、この組み合わせを活用しています。