3年経過したフィンテックのコードベースで、AIのハルシネーションを止めさせた方法
AIコーディングツールは、実際のプロダクションプロジェクトでは失敗します。新しいコードには対応できても、履歴のある古いコードベースでは機能しなくなるのです。
私は自社のフィンテックプロジェクトを通じて、身をもってこれを学びました。私たちのプロジェクトには、2つのReactフロントエンド、管理パネル、そしてFastAPIバックエンドがあります。データベースは複雑で、機密性の高い財務データやユーザーデータを保持しています。
開発スピードを上げるためにAIを使ってみましたが、すぐに失敗しました。
AIに「contacts(連絡先)テーブルを作成して」と頼んだところ、名前とメールアドレス用の新しいカラムを作成してしまったのです。しかし、これらのカラムはすでにusersテーブルに存在していました。AIは外部キーを使用する代わりにデータを重複させてしまいました。AIは、私たちのusersテーブルが存在することすら知らなかったのです。
私は「どうすればAIに優れたコードを書かせられるか」と問うのをやめました。代わりに、「AIが正しい判断を下すために、何を知っておく必要があるか」を問い始めたのです。
AIの性能は、与えられたコンテキスト(文脈)次第です。私たちは、コンテキストを明示的かつ権威あるものにしました。私たちが構築したシステムは以下の通りです。
• ADRファイル: docs/adrs/ フォルダを作成しました。これらのファイルには、アーキテクチャ上の決定を下した理由を記録します。あるファイル(ADR-001)では、AIに対して「まず既存のテーブルを確認すること。外部キーを使用すること。ユーザーデータを決して重複させないこと」と指示しています。
• context.md: このファイルでは、独自の用語を説明します。システム内の異なる概念が互いにどのように関連しているかをAIに伝えます。
• plot.md: これはハイレベルなマップです。プロジェクトのさまざまな要素がどのように接続されているかを示します。
• 厳格なルール: docs ディレクトリが最終的な決定権を持つことをAIに伝えました。AIはこれらのルールを順番に従わなければなりません。
• テストの義務化: すべての新しいAPIルートにはテストケースが必要です。
このシステムにより、AIの挙動が予測可能になりました。
かつて、AIが共有関数を変更したことで、アプリの他の8箇所が壊れてしまったことがありました。しかし、テストがあったおかげで、AIは失敗を検知できました。そして、古い要件と新しい要件の両方に対応する新しいバージョンの関数を作成することで、自らのミスを修正したのです。テストがなければ、そのバグはそのままプロダクション環境に到達していたでしょう。
コードベースを知らないことをAIのせいにするのはやめましょう。AIを「新入社員」として扱うのです。新入社員が会社のルールを知らないことを責めたりはしませんよね。ドキュメントを与え、オンボーディングを行うはずです。
私たちの構造は以下のようになっています。
docs/
- context.md (用語と関連性)
- plot.md (ハイレベルなマップ)
- adr/ (テーブル作成やAPI構造などの具体的なルール)
ワークフローのための3つのヒント:
- ADRは具体的に書く: 曖昧なアドバイスではなく、明確な指示を用いる。
- ドキュメントに権威を持たせる: これらのルールが最優先であることをAIに伝える。
- ミスをルールに変える: AIが失敗するたびに、それを防ぐための新しいADRを作成する。
これでAIが完璧になるわけではありません。しかし、一貫性を持たせることはできます。
Optional learning community: https://t.me/GyaanSetuAi
