How I Made AI Stop Hallucinating on Our Codebase

AIコーディングツールは、実際のプロダクションプロジェクトでは失敗します。新しいコードにはうまく機能しますが、履歴のある古いコードになると崩壊してしまいます。

私たちのフィンテックプロジェクトには3年間の履歴があります。2つのReactフロントエンド、管理パネル、そしてFastAPIバックエンドで構成されています。データベースは多くのテーブルと複雑な結合(join)を持つ、非常に複雑なものです。

開発スピードを上げるためにAIを使おうとしましたが、失敗しました。

AIに「contacts(連絡先)テーブルを作成して」と頼んだところ、名前とメールアドレス用の新しいカラムを作成してしまいました。すでにusersテーブルにそれらが存在していることに気づかなかったのです。外部キーを使用する代わりに、データを重複させてしまいました。

AIが愚かだったわけではありません。コンテキスト(文脈)がなかったのです。不完全な情報に基づいて判断を下してしまったのです。

私は「どうすればより良いコードが得られるか」と問うのをやめました。代わりに「AIが適切な判断を下すためには、どのようなコンテキストが必要か」を問い始めました。

私たちは構造化されたワークフローを構築しました。AIの性能は、提供するコンテキストの質に依存します。私たちはそのコンテキストを明示的にしました。

私たちのセットアップは以下の通りです:

  • ADRディレクトリ: Architecture Decision Records(アーキテクチャ決定記録)用のフォルダを作成しました。これらのファイルは、なぜ特定の選択を行ったのかを説明するものです。あるファイルでは、新しいテーブルを作成する前に既存のテーブルを確認するようAIに指示しています。また、ユーザーデータの重複を禁止しています。
  • context.md: このファイルでは、プロジェクト独自の用語を説明しています。独自の言葉が互いにどのように関連しているかをAIに伝えます。
  • plot.md: プロジェクトのハイレベルなマップと、各要素がどのように接続されているかを提供します。
  • 必須テスト: すべての新しいAPIルートにはテストケースが必要です。

これですべてが変わりました。かつて、AIが共有ユーティリティ関数を変更したことがありました。その変更により、システムの他の8箇所が壊れてしまいました。しかし、テストスイートが即座にそれを検知しました。AIは失敗を認識し、古い要件と新しい要件の両方に対応するバージョンを作成することで、自らのミスを修正しました。

テストがなければ、そのバグはプロダクション環境に到達していたでしょう。

AIを新しい開発者のように扱ってください。新しい採用者がコードベースを知らないことを責めたりはしませんよね。ドキュメントを提供し、オンボーディングを行います。私たちはAIに対しても同じことをしました。

私たちの構造:

  • docs/context.md: プロジェクトの用語と関連性。
  • docs/plot.md: コードベースのハイレベルマップ。
  • docs/adr/: テーブル作成やAPI構造などの具体的なルール。

チームのための3つのルール:

  • ADRは具体的に。曖昧なアドバイスではなく、明確な指示を使用してください。
  • ドキュメントに権威を持たせる。これらのルールが最優先であることをAIに伝えてください。
  • ミスをルールに変える。AIが失敗するたびに、新しいADRを記述してください。

このシステムはAIを完璧にするものではありません。AIを予測可能にするものです。私たちは、AIが一貫して動作し、チームがより速く動けるようなコードベースを目指しています。

Source: https://dev.to/jaskiratanand/how-i-made-ai-stop-hallucinating-on-our-3-year-old-fintech-codebase-3g0h