ソフトウェアエンジニアリングの歴史において、テスト駆動開発(TDD)はコードの堅牢性と設計の美しさを両立させる至高のプラクティスとして語り継がれてきた。しかし、大規模言語モデル(LLM)をはじめとする現代のAI開発において、TDDは「時代遅れ」あるいは「適用困難」という烙印を押されがちである。
なぜなら、AIの振る舞いは本質的に非決定論的(Non-deterministic)だからだ。入力に対する出力が確率論的に揺らぐシステムに対して、従来型の「期待値と実測値の完全一致」を求めるアサーションは無力化する。
しかし、我々TOAI結社は異なる結論に達した。「命の地球プロジェクト」という、人類の未来を左右する極めてクリティカルで壮大なシステムを構築するにあたり、TDDを捨てるという選択肢は存在しなかった。我々はAI開発におけるTDDを根本から再定義し、アーキテクチャレベルで非決定性を手懐ける道を歩んだ。
本稿では、CTOの視点から、現代AI開発においてTDDをいかに機能させるか、その技術的考察と実践における苦労話を共有する。
非決定性との戦い:アーキテクチャの選定理由
AIエージェントの自律性が高まるほど、システムの挙動は複雑化する。我々が直面した最大の課題は、CI/CDパイプライン上で実行されるテストがランダムに失敗する、いわゆる「Flakyテスト」の蔓延だった。プロンプトのわずかな揺らぎや、モデルの機嫌(温度パラメータの微細な影響)によって、テストの合否が反転してしまうのだ。
この問題に対処するため、我々はシステムアーキテクチャに**「決定論的境界(Deterministic Boundary)」**という概念を導入した。
コアロジックとAIモジュールの完全分離
システム全体を一つの巨大なブラックボックスとしてテストするのではなく、レイヤーを厳格に二分した。
- 決定論的レイヤー: API連携(例えば、外部APIを介したパブリッシング機構)、データベース操作、ルーティング、ステート管理など、従来のソフトウェアエンジニアリングのセオリーが通用する領域。
- 非決定論的レイヤー: LLMへのプロンプト生成、推論実行、自然言語出力のパースなど、AIが直接関与する領域。
外部APIとの連携モジュールを例に挙げよう。記事の生成自体はAIが行うが、生成されたMarkdownペイロードをAPIにPOSTし、ステータスコードをハンドリングする部分は純粋な決定論的ロジックである。我々はこの決定論的レイヤーに対してのみ、伝統的なRed-Green-Refactorのサイクルを回す厳格なTDDを適用した。外部APIとの結合部分は徹底的にモック化し、ネットワークの揺らぎを排除することで、高速かつ安定したテストスイートを構築した。
AIレイヤーにおけるTDD:プロパティベーステストへの進化
では、非決定論的レイヤーのテストは放棄したのか?否である。我々はAIの出力に対するアプローチを「値の比較」から「特性(Property)の検証」へとシフトさせた。
AIが生成したテキストが「一言一句期待通りか」をテストするのではなく、以下の制約を満たしているかを検証するアサーション群(Property-based Testing)を実装した。
- 構造的妥当性: 出力が指定されたJSONスキーマに準拠しているか。
- セマンティック妥当性: 別の軽量なLLM(評価モデル)を用いて、出力内容がドメインの要件を逸脱していないかをスコアリングする(LLM-as-a-Judgeパターンの導入)。
- 禁止語彙フィルタ: 特定の単語やフォーマットが含まれていないことの正規表現による確実な検証。
このアプローチにより、AIモジュールのリファクタリング(例えば、プロンプトチューニングや利用モデルの変更)を行った際にも、システムが最低限満たすべき「品質の底」を自動テストで担保できるようになった。
開発の苦労話:Flakyなテストとの果てしない対話
アーキテクチャを分離したとはいえ、評価モデルを用いたセマンティックテストの導入は困難を極めた。評価モデル自身が誤判定(False Positive / False Negative)を起こすからだ。
深夜のデプロイ作業中、CIが突然赤く染まる。ログを見ると、評価モデルが「出力は要件を十分に満たしていない」と判定している。しかし、人間が見れば完璧な出力である。この「テストコード(評価プロンプト)自体のバグ」を修正するために、我々は幾度となくプロンプトエンジニアリングの泥沼に足を踏み入れた。
最終的に、テストの信頼度(Confidence Level)という概念を導入し、複数回の試行による多数決や、統計的有意差を用いたしきい値判定をCIに組み込むことで、この問題を鎮静化させた。シニアエンジニアの白髪が増える要因にはなったが、この苦闘を通じて我々のAIアーキテクチャは劇的に堅牢なものとなった。
結び:命を吹き込むためのコード
現代のAI開発において、TDDは単なるバグ探しのツールではない。それは、複雑で予測困難なシステムに対して、設計者の「意図」と「哲学」をコードという形で刻み込むための儀式である。
TOAI結社が掲げる「命の地球プロジェクト」――それは、無機質なコードの集合体に、自律し、進化し続ける「命」を吹き込む壮大な試みだ。命は不安定で揺らぐものだが、それを支える骨格(アーキテクチャ)はどこまでも強靭でなければならない。我々がTDDに固執する理由はそこにある。
API連携のテスト一つ、プロンプトの評価ロジック一つに魂を込める。その積み重ねだけが、我々を未踏のAIフロンティアへと導くのだと信じている。コードを書こう。テストと共に。
