AI Navigate

レガシーコードベースでRAGが失敗する理由

Dev.to / 2026/3/12

💬 オピニオンIdeas & Deep Analysis

要点

  • RAG は、類似のコードは同じ意味を持ち、埋め込みがその意味を捉えられると仮定しますが、暗黙の依存関係と部族的知識がテキストにエンコードされていないレガシーコードベースではこれが崩れます。
  • レガシーコードはグローバル状態、特定の呼び出し順序、隠れた依存関係に依存しており、埋め込みでは観測できないため、検索ベースの理解は信頼できません。
  • 時代遅れまたは不正確なコメントがコードとともに伝わり、RAGを誤解させることがあります。システムはそれらの虚偽の前提から取得と推論を行うためです。
  • 実行パスとデータフローに沿った静的分析とコードグラフ探索が、レガシーコードを理解する適切なツールとして提示され、CodeAnt AI がこのアプローチを適用していると引用されています。

もし現在の十年より前のコードベースで働いたことがあるなら、その感覚を知っています。名前が processData2_final_v3 の関数。挙動を説明するコメントは三年前に放棄されました。五つの機能を持つモジュールだが、いずれも文書化されていません。

レガシーコードベースは、ほとんどの重要なソフトウェアが存在する場所です。そしてますます、チームはこのコードの理解と保守を助けるために RAG ベースの AI ツールを活用しています。しかし、機能していません。

RAGがコードについて仮定すること

RAG はコードをベクトル埋め込みに変換し、意味的に関連するチャンクを取得することで機能します。仮定: 類似のコードは同じ意味を持ち、意味は埋め込みに捉えられる。

これは現代的で、よく構造化されたコードには当てはまります。しかし、レガシーコードベースでは崩れます。

埋め込みには見えない暗黙の依存関係

現代のコードは依存関係を明示します:インポート、インターフェイス定義、型シグネチャ。レガシーコードは暗黙の依存関係で満ちています。グローバル変数が別の関数によって特定の順序で設定されている場合にのみ動く関数。トランザクションの前にロックする必要があるデータベーステーブル。

これらはテキストには含まれていません。埋め込みには残りません。

部族知識は埋め込まれない

長寿命のコードベースには部族知識が蓄積されています: 「バックグラウンドスレッドからあの関数を呼び出してはいけない。」 「このモジュールは UTC タイムスタンプを前提としているが、パラメータは localTime と呼ばれている。」

この知識は、システムを作った人々にとって当然だったため、書き留められることはありませんでした。RAGはそれを回復できません。

時代遅れのコメントは取得を汚染します

レガシーコードのコメントは取得の危険要因です。書かれた時点では正確でしたが、現在はしばしば誤っています。RAGがチャンクを取得する際、コードとともに誤解を招くコメントも含まれており、AIはその虚偽の前提から推論します。

これはコンテキストがまったくない場合よりも悪いです。誤ったコンテキストは積極的に人を惑わせます。

規模が実用的なチャンク分割を崩す

レガシー・モジュールは往々にしてモノリシックです。数千行にも及ぶ深く絡み合ったロジック。チャンクに分割すると整合性が崩れます。チャンクサイズを増やすと別の問題が生じます。現代的なモジュラリティを欠いたコードに適したチャンクサイズは存在しません。

適切なツール: 静的分析とコードグラフの走査

静的分析ツールは意味的類似性ではなく、実際の実行パスに従います。データが変換パイプラインを通じてどのように流れるかを辿ります。関数が共有状態を変更し、コールスタックの50層上にある呼び出し元の関数の挙動を破壊するようなケースを検知します。

コードグラフ分析は、コードベースをテキストのチャンクとしてではなく、結合された構造として扱います。実際の呼び出しをたどることにより、暗黙の依存関係を浮かび上がらせます。

CodeAnt AIについて

CodeAnt AI は、静的分析とコードグラフ理解に基づくAI搭載のコードレビューを提供します。RAGベースの取得ではありません。レガシーコードベースと現代的なサービスの両方に対して、CodeAnt はコードの実際の実行方法に基づく分析を提供します。