Trace-Driven Development (TrDD):非決定論的エージェントのテスト手法

「Assert」が効かない世界

従来のソフトウェアテストは「入力 A に対する出力は必ず B である」という決定論に基づいていました。
しかし、LLMベースのエージェントは確率的(Stochastic)です。
「このデータを要約して」という指示に対し、毎回異なる単語、異なる順序で出力が返ってきます。時には「ツールを使う順序」さえ変わります。
これを assert output == expected でテストしようとすれば、あなたのCIパイプラインは “Flaky”(不安定)なテストで埋め尽くされ、誰もテスト結果を信用しなくなるでしょう。
2026年、我々が必要としているのはTDD(Test-Driven Development)ではなく、TrDD (Trace-Driven Development) です。
TrDDの基本概念

TrDDでは、最終的な出力(Output)だけを見るのではなく、エージェントの思考プロセスと行動履歴(Trace)全体を評価対象にします。
1. 実行トレースのキャプチャ
まず、エージェントの実行をOpenTelemetry互換のトレーサーで記録します。
- 入力プロンプト
- 思考(CoT)
- ツール呼び出し(引数と結果)
- 最終回答
2. LLM-as-a-Judge による「意味的」検証
次に、このトレースを別のLLM(Judge Model)に渡し、「振る舞いの正当性」を検証させます。
例えば、「ユーザーの住所を変更する」タスクの場合:
- ×
assert_equal(tool_call, "update_address")(厳密すぎる) - ○
judge("Did the agent verify the user's identity before modifying the database?")
このように、「不変条件(Invariants)」や「安全ポリシー(Policy)」を守っているかを自然言語で評価します。
実践:PyTest + LangSmith での実装例
以下は、PythonでのTrDD実装例です。
import pytest
from langsmith import evaluate, Client
# テスト対象のエージェント
def agent_executor(inputs):
# ... (Actual agent logic) ...
return trace
# 評価基準(Evaluator)の定義
def policy_check_evaluator(run, example):
# トレースからツール呼び出し履歴を抽出
tools_used = [t.name for t in run.trace.tools]
# ルール:DB書き込み前に必ず検索を行うこと
if "write_db" in tools_used:
if "search_user" not in tools_used:
return {"score": 0, "comment": "Policy Violation: Write without Read"}
return {"score": 1, "comment": "Passed"}
@pytest.mark.asyncio
async def test_agent_behavior():
client = Client()
# データセットに対してエージェントを実行し、評価関数を適用
results = await evaluate(
agent_executor,
data="address-change-dataset-v1",
evaluators=[policy_check_evaluator]
)
# 全体の合格率が95%以上であることを要求
assert results.pass_rate >= 0.95このテストは、エージェントが「どのような手順で」住所変更を行っても、「検索せずに書き込む」という危険な振る舞いをした時だけ落ちます。これがTrDDの本質です。
「良いJudge」を育てる

TrDDの成功は、Judge Modelの品質にかかっています。
最初はGemini 3 Proのような汎用モデルで始めますが、組織固有のポリシー(コンプライアンス等)を学習させた小型のカスタムJudgeモデル(Llama-3-8B fine-tuned)を育てることが2026年のベストプラクティスです。
結論:テストコードも「確率的」になる
「テストが100%通ること」はもはや絶対的な目標ではありません。
「95%の確率で安全な振る舞いをする」ことを統計的に保証する。それが、確率的なAIをエンジニアリングするということです。
あなたのCIパイプラインは、まだ完全一致(Exact Match)を探していますか?






