私がリリースしたAIエージェントは23個のユニットテストに合格していましたが、本番稼働から1時間もしないうちに、存在しない製品機能を捏造し、実勢価格の3分の1という価格を提示してしまいました。ユーザーがそれを指摘すると、ボットはさらに主張を強め、会話は決裂し、私はクライアントを失いました。この失敗は、決定論的なユニットテストのセットだけでは、エージェントの信頼性を保証できないことを証明しました。

なぜAIエージェントにおいてユニットテストでは不十分なのか

従来のコードにおいてユニットテストが機能するのは、同じ入力に対して常に同じ出力が得られるからです。「2 + 2 = 4」は、単純な等価チェックで検証できる保証です。しかし、LLM駆動のエージェントは、プロンプト、周囲のコンテキスト、および呼び出す外部ツールの状態によって出力が変化します。文字列の完全一致を確認するだけのテストでは、ハルシネーション(幻覚)、トーンの変化、あるいはガードレールの違反を見逃してしまいます。クライアントを失うことになったこの「サイレントな失敗」は、単一の関数だけでなく、インタラクション全体を評価しなければならないことを示しています。

機能コードを書く前に評価ハーネスを構築する

私は開発の順序を逆にしました。まず4層の評価ハーネスを設計し、その後にエージェントを記述するのです。このハーネスは、1回の実行で131個のテストを行い、コストは1回あたり約3セント、所要時間は約11分です。各テストには、それを処理できる最小のモデルを割り当て、より大規模で高価なモデルは、真に価値が加わる場面のために取っておきます。

レイヤー1 – ツールの機能性

第一の防衛線は、エージェントがツールを正しく呼び出せるかを確認することです。テストには、検索の成功、意図的に不正な形式のクエリ、およびシミュレートされたAPIの失敗が含まれます。ツールの使用は、リクエストが正しく構成されるか、APIがエラーを返すかのどちらかであり、大部分が決定論的であるため、単純なPythonのassertion(アサーション)で十分です。ここで不正なリクエストをキャッチすることで、後続の混乱を防ぐことができます。

レイヤー2 – 指示への追従

次に、ハーネスはエージェントがガードレールを遵守しているかを検証します。小規模なLLMが評価者として機能し、エージェントの回答が、キャラクターの維持、禁止トピックの回避、および必要なJSONスキーマの出力といったコンプライアンスを満たしているかをスキャンします。このレイヤーでは、意図しないペルソナへの変容や内部プロンプトの漏洩など、ユニットテストでは見逃してしまう意味的なドリフト(semantic drift)をキャッチします。

レイヤー3 – 目標指向の行動

第3のレイヤーは最も重要です。エージェントが実際にその目的を達成しているかを問います。リード獲得ボットの場合、それは適切な見極め質問を行い、必要に応じて人間にエスカレーションすることを確認することを意味します。ここでは、コストを膨らませることなく全体のフローを評価できる、推論特化型のモデルを使用しています。ボットが最初の2つのレイヤーを通過していても、目標を達成できない場合は、再設計の対象としてフラグが立てられます。

レイヤー4 – パフォーマンス

最後に、ハーネスはレイテンシとトークン生成速度を記録します。特にリアルタイムチャットでは、レスポンスの遅れはユーザー体験を損ないます。機能的な正確性と並行してこれらのメトリクスを追跡することで、エージェントの正確性と応答性の両方を確保しています。

コスト削減の選択

1回あたり0.03ドルという数字は宣伝文句ではなく、テストの複雑さにモデルのサイズを合わせることで実現しています。決定論的なツールチェックは最も安価なランタイムで実行し、指示への準拠には軽量モデルを使用し、目標指向の評価においてのみ、高価ではあるがより高性能なモデルを呼び出します。この階層的なアプローチにより、コードを変更するたびにフルスイートを実行できるほど、総費用を低く抑えることができます。

トレードオフ:スピード vs 安全性

ハーネスの導入により、初期段階での摩擦が生じました。開発サイクルは長期化し、リリーススケジュールは遅れました。

今後の注目点

  • モデル駆動型の評価者: LLMの向上に伴い、レイヤー2の評価者はよりきめ細かくなり、微細なポリシー違反を検出しつつ、誤検知(false positives)を減らすことができるようになります。

まとめ

本番環境向けのAIエージェントを構築する場合、階層的な評価ハーネスはオプションではなく、不可欠な基盤です。包括的なテストのコスト(1回あたり0.03ドル、1スイートあたり11分)を前倒しで投入することで、ユニットテストでは到底検知できないサイレントな失敗から身を守ることができるのです。