AIツール比較

AIエージェント テスト自動化:pytest/Deepeval比較2026

AIエージェント テスト自動化:pytest/Deepeval比較2026

この記事の結論

AIエージェントの品質を継続的に担保するテストフレームワーク(pytest+LLM-as-Judge/Deepeval/Braintrust)をスペック表と実コードで比較。開発規模別の選び方を解説します。

AIエージェントを本番にデプロイしたら、プロンプト変更のたびに回帰テストを手で実行していませんか?」

先日、あるプロダクト開発チームでこんな相談を受けました。LangChainで構築したRAGエージェントに新しいツールを追加したところ、既存のユースケースで回答品質が静かに劣化していたのに、2週間後のデモまで誰も気づかなかったというのです。通常のソフトウェアならユニットテストやE2Eテストがデグレを即座に検知するはずですが、LLMの出力は確率的で「正解」が一意に定まらない。そのため、従来のテスト戦略がそのまま使えないという根本的な問題があります。

この記事では、AIエージェントのテスト設計・ツール選定に悩む開発者・QAエンジニア・PM向けに、2026年時点で有力な3つのアプローチ——pytest + LLM-as-Judge組み込みDeepevalBraintrust——を実コードつきで比較します。「CI/CDに組み込む回帰検知の運用方法」についてはAIエージェントの継続的評価とCI/CD回帰検知 運用ガイド2026で別途解説しているので、本記事ではテスト設計とツール選定に絞って深掘りします。

結論ファースト:用途別おすすめ早見表

用途・状況 おすすめツール 理由 月額目安
個人・小規模チーム、既存pytest資産を活用したい pytest + LLM-as-Judge 追加依存ゼロ。既存CIにそのまま組み込める ¥0(LLM APIコスト除く)
RAG/エージェント特化の50種以上のメトリクスが欲しい Deepeval(OSS) pytest互換のまま豊富なメトリクスを即利用できる ¥0(Confident AI有料プランは別途)
チーム規模が大きく、ダッシュボード・実験管理が必要 Braintrust プロダクション品質のSaaS。PR毎の自動評価とブロックゲートが標準搭載 無料(Starter)〜約36,000円/月(Pro: $249)
まず試してみたい・PoC段階 Deepeval(OSS) インストール1コマンド、pytestをそのまま使える ¥0

料金情報の最終確認: 2026-06-11

1. テストフレームワーク選定前に理解すべきAIエージェントのテスト構造

AIエージェントのテストは「テストピラミッド」で考えると整理しやすくなります。2026年時点で業界が収束しつつある3層構造は以下の通りです。

レイヤー 内容 ツール例 頻度
決定論的テスト(底辺・最多) JSON Schema検証、出力フォーマットチェック、ツール呼び出し回数、レイテンシ閾値 pytest(標準アサーション) 全PR毎
ルーベースドテスト(中層) LLM-as-Judge、人間によるルーブリック評価、RAG忠実度チェック Deepeval / Braintrust 週次〜PR毎
レッドチーム・カナリア(頂点・最少) プロンプトインジェクション、境界値、ユーザービヘイビア模擬 専用フレームワーク / 手動 月次〜リリース前

重要なポイントは、LLM-as-Judgeをピラミッドの底辺に置くのはアンチパターンだということです。LLMで全テストを評価すると、LLM APIコストがCIのボトルネックになり、フィードバックループが遅くなります。決定論的なチェックを底辺に多く置き、LLM評価は中層・頂点に絞るのが2026年のベストプラクティスです。

2. 各ツールの概要と実装例

アプローチA:pytest + LLM-as-Judge自作

概要: 標準のpytestにLLM呼び出しを追加して評価ロジックを自作するアプローチです。外部依存を最小化したい場合や、既存のpytest CIインフラをそのまま使いたい場合に最適です。

強み: 依存関係がシンプル、既存CI/CDにそのまま組み込める、評価ロジックをフルコントロールできる
弱み: メトリクスを自前で実装する必要がある、ゴールデンデータセット管理が手動になる

# 動作環境: Python 3.10+, openai>=1.0, pytest>=7.0
# pip install openai pytest python-dotenv

import os
import pytest
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

def llm_judge(question: str, answer: str, criteria: str) -> dict:
    """LLM-as-Judgeで回答を評価する"""
    prompt = f"""以下の基準で回答を0〜10点で評価してください。

基準: {criteria}

質問: {question}
回答: {answer}

以下のJSON形式で回答してください:
{{"score": , "reason": ""}}"""

    resp = client.chat.completions.create(
        model="gpt-4o-mini",  # コスト削減のためmini推奨
        messages=[{"role": "user", "content": prompt}],
        response_format={"type": "json_object"},
        temperature=0,  # 評価の安定性のためtemperature=0
    )
    import json
    return json.loads(resp.choices[0].message.content)

# テストケース定義
@pytest.mark.parametrize("question,expected_contains", [
    ("Pythonのリスト内包表記の書き方は?", ["for", "in", "["]),
    ("AIエージェントとは何ですか?", ["自律", "タスク"]),
])
def test_agent_response_format(agent_under_test, question, expected_contains):
    """決定論的テスト: 出力に必須キーワードが含まれるか"""
    response = agent_under_test.run(question)
    for keyword in expected_contains:
        assert keyword in response, f"必須キーワード '{keyword}' が出力に含まれていない"

def test_agent_answer_quality():
    """LLM-as-Judgeテスト: 回答品質のスコアリング"""
    question = "Pythonでファイルを安全に読み書きする方法は?"
    # 実際の環境ではagent_under_test.run(question)を使う
    answer = "with open('file.txt', 'r', encoding='utf-8') as f: content = f.read()"

    result = llm_judge(
        question=question,
        answer=answer,
        criteria="コードが正確で、エラーハンドリングの観点が含まれているか"
    )

    assert result["score"] >= 7, (
        f"回答品質スコアが閾値(7)を下回っています: {result['score']}/10n"
        f"理由: {result['reason']}"
    )

# 本番環境での実行前にテスト環境で動作確認してください

最終確認日: 2026-06-11

アプローチB:Deepeval(OSS)

概要: Confident AIが開発するOSSのLLM評価フレームワーク。「pytestのLLM版」と表現されることが多く、50種以上のメトリクスがすぐに使えます。Apache-2.0ライセンスで完全無料。2026年時点でエージェント固有のメトリクス(タスク完了度、ツール呼び出し正確性、計画品質)にも対応しています。

強み: pytest互換でそのまま使える、RAG/エージェント特化メトリクスが豊富、無料
弱み: チームダッシュボードにはConfident AI有料プランが必要、大規模チームには管理機能が物足りない

# 動作環境: Python 3.10+
# pip install deepeval openai

from deepeval import assert_test
from deepeval.test_case import LLMTestCase, LLMTestCaseParams
from deepeval.metrics import (
    AnswerRelevancyMetric,
    FaithfulnessMetric,
    ContextualRecallMetric,
)
import pytest

# RAGエージェントのテストケース
@pytest.mark.parametrize("test_case", [
    LLMTestCase(
        input="Pythonでデコレータを使う理由は?",
        actual_output="デコレータはコードの再利用性を高め、関数の前後処理を宣言的に記述できます。",
        expected_output="デコレータは関数やクラスを修飾し、ロギング・認証・キャッシュなどの横断的関心事を分離できます。",
        retrieval_context=[
            "Pythonのデコレータは@記法で関数に付加機能を追加する仕組みです。",
            "デコレータパターンはコードの再利用性と分離を促進します。",
        ],
    )
])
def test_rag_answer_quality(test_case):
    """RAG回答の関連性・忠実度・再現率を一括チェック"""
    assert_test(test_case, [
        AnswerRelevancyMetric(threshold=0.7, model="gpt-4o-mini"),
        FaithfulnessMetric(threshold=0.8, model="gpt-4o-mini"),
        ContextualRecallMetric(threshold=0.7, model="gpt-4o-mini"),
    ])

# エージェントのツール呼び出しテスト
from deepeval.metrics import ToolCorrectnessMetric
from deepeval.test_case import ToolCall

def test_agent_tool_usage():
    """エージェントが正しいツールを正しい順番で呼び出すかテスト"""
    test_case = LLMTestCase(
        input="東京の今日の天気を調べてPDFにまとめてください",
        actual_output="東京の天気は晴れです。PDF作成完了。",
        tools_called=[
            ToolCall(name="weather_api", input={"city": "Tokyo"}),
            ToolCall(name="pdf_generator", input={"content": "東京の天気情報..."}),
        ],
        expected_tools=[
            ToolCall(name="weather_api"),
            ToolCall(name="pdf_generator"),
        ],
    )
    assert_test(test_case, [
        ToolCorrectnessMetric(threshold=1.0)  # ツール呼び出しは100%正確であるべき
    ])

# 本番環境での実行前にテスト環境で動作確認してください

最終確認日: 2026-06-11

アプローチC:Braintrust

概要: Notion、Replit、Cloudflare、Rampなどのプロダクションチームが採用するAI評価・オブザーバビリティプラットフォームです。実験追跡、データセット管理、LLMスコアリング、プロダクションロギングを統合管理できます。GitHub ActionsネイティブのPRコメントとブロックゲートが特徴です。

強み: PR毎の自動評価+スコアサマリー、チームダッシュボード、SOC 2準拠、トレース全体の評価対応
弱み: Proプランは$249/月(約36,000円/月)のコストが発生、小規模チームにはオーバースペックになりうる

# 動作環境: Python 3.10+
# pip install braintrust autoevals openai

import braintrust
from autoevals import LLMClassifier, Factuality
import os

# Braintrustプロジェクトの初期化
project = braintrust.init_project("my-ai-agent")

# カスタム評価メトリクスの定義
answer_quality = LLMClassifier(
    name="AnswerQuality",
    prompt_template="""以下の質問と回答を評価してください。

質問: {{input}}
回答: {{output}}
期待する回答: {{expected}}

評価基準:
- Excellent: 期待回答の内容を正確にカバーしており、追加の価値ある情報も含む
- Good: 期待回答の主要な内容をカバーしている
- Poor: 期待回答の内容を大きく外れているか不正確

評価: """,
    choice_scores={"Excellent": 1.0, "Good": 0.7, "Poor": 0.0},
    model="gpt-4o-mini",
)

# 評価の実行
def run_evaluation():
    # テストデータセット(本番ではBraintrustのDataset機能に保存)
    test_data = [
        {
            "input": "LangChainのAgentExecutorとは何ですか?",
            "expected": "LangChainのAgentExecutorはエージェントとツールを結びつけ、ループ実行を管理するランタイムです。",
        },
        {
            "input": "RAGでチャンクサイズを最適化する方法は?",
            "expected": "チャンクサイズはコンテンツの性質に応じて調整し、オーバーラップを設けることで文脈の断絶を防ぎます。",
        },
    ]

    # 実際のエージェントを呼び出す関数(環境に応じて実装)
    def agent_task(input_data):
        # ここに実際のエージェント呼び出しを記述
        return {"output": f"エージェントの回答: {input_data['input']}"}

    results = braintrust.Eval(
        name="agent-quality-eval",
        data=test_data,
        task=agent_task,
        scores=[answer_quality, Factuality],
        experiment_name="pr-123-feature-branch",
    )

    print(f"評価完了: {results.summary}")
    return results

# 本番環境での実行前にテスト環境で動作確認してください

if __name__ == "__main__":
    run_evaluation()

最終確認日: 2026-06-11

3. 機能・料金の詳細比較

機能 pytest + LLM-as-Judge Deepeval(OSS) Braintrust
ライセンス MIT(pytest) Apache-2.0(完全無料) SaaS(無料〜)
pytestとの互換性 ◎ ネイティブ ◎ pytest上に構築 △ 独自のEval APIを使用
RAG評価メトリクス 自作が必要 ◎ 10種以上(忠実度・関連性・再現率等) ◎ 組み込み(Faithfulness等)
エージェント評価メトリクス 自作が必要 ◎ ツール呼び出し・タスク完了・計画品質 ◎ トレース全体のスコアリング
CI/CDインテグレーション ◎ 標準pytestとして動く ◎ 標準pytestとして動く ◎ GitHub Action標準搭載
PRブロックゲート △ pytest –exitcodeで自作可 ◎ threshold設定でauto fail ◎ 自動PR コメント+ブロック
チームダッシュボード △ Confident AI(有料) ◎(全プランに含む)
実験・バージョン管理 △ Confident AI(有料)
対応LLMモデル 任意(APIコール次第) 50種類以上のモデル(LiteLLM経由) 全モデル(AIプロキシ内蔵)
無料枠 完全無料 完全無料(OSS) 1GB処理/10,000スコア/月
有料プラン なし Confident AI: 約2,900円〜/月 Pro: 約36,000円/月($249)
SOC 2準拠 N/A(自己管理) N/A(OSS)

料金情報の最終確認: 2026-06-11。為替レートにより実際の円換算額は変動します。

4. 用途別おすすめ構成とコード例

ケース1:個人・スタートアップ(コスト優先)→ pytest + Deepeval OSS

小規模チームや個人開発者には、pytestとDeepevalのOSSを組み合わせるのが最もコスト効率が高いです。既存のpytestワークフローをほぼ変えずに、RAGメトリクスやエージェント評価を追加できます。

# セットアップ(1コマンド)
pip install deepeval

# テストの実行
deepeval test run test_my_agent.py

# GitHub Actionsへの組み込み例(.github/workflows/eval.yml)
# on: [pull_request]
# jobs:
#   eval:
#     steps:
#       - uses: actions/checkout@v4
#       - run: pip install deepeval
#       - run: deepeval test run tests/eval/
#         env:
#           OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

ケース2:中規模チーム(品質管理+チームコラボ)→ Braintrust Starter → Pro

チームが5人以上になり、プロンプトの変更履歴管理やスコアのトレンド分析が必要になった段階でBraintrustを検討します。StarterプランはデータGB単位で無料枠があるため、まず試してからProへの移行を判断できます。

# GitHub Actionsでのブランチ保護設定例
# braintrust.yaml をリポジトリに追加するだけで自動的に
# PR毎の評価実行 + スコアサマリーをPRコメントに投稿 +
# 閾値以下でマージブロック、が有効になります

# braintrust.yaml(プロジェクトルートに配置)
# version: 1
# project: my-ai-agent
# evals:
#   - name: quality-gate
#     path: evals/quality.py
#     threshold: 0.75  # この閾値を下回るとPRをブロック

ケース3:エンタープライズ(セキュリティ・コンプライアンス重視)→ Braintrust Pro + Enterprise

金融・医療・法務など規制の厳しい業界では、SOC 2準拠と監査ログの保持が必須になります。BraintrustのEnterpriseプランは専用インフラとカスタムデータ保持期間に対応しています。

5. 軌跡評価(Trajectory Evaluation):エージェントテストの最前線

2026年のAIエージェント評価で注目されているのが「軌跡評価(Trajectory Evaluation)」です。従来の評価が最終回答のみを評価していたのに対し、軌跡評価はエージェントが結果に至るまでのステップ全体を採点します。

具体的には以下の問題を検知できます:

  • 同じツールを重複して呼び出している(無駄な処理)
  • タスクと無関係なツールを呼び出している(計画ミス)
  • 中間ステップで危険な操作を実行している(安全性の問題)
# Deepevalでの軌跡評価の例
from deepeval.metrics import TaskCompletionMetric
from deepeval.test_case import LLMTestCase, ToolCall

def test_agent_trajectory():
    """エージェントが最適な経路でタスクを完了するかテスト"""
    test_case = LLMTestCase(
        input="GitHubのissue一覧を取得して、バグ報告だけをSlackに通知してください",
        actual_output="バグ報告3件をSlackチャンネル#bugsに通知しました",
        tools_called=[
            ToolCall(
                name="github_list_issues",
                input={"repo": "myorg/myrepo", "state": "open"},
                output=[{"title": "ログインバグ", "labels": ["bug"]}, ...]
            ),
            ToolCall(
                name="slack_post_message",
                input={"channel": "#bugs", "text": "バグ報告3件..."},
                output={"ok": True}
            ),
        ],
        # 期待ツール:重複呼び出しや無関係なツール呼び出しがないこと
        expected_tools=[
            ToolCall(name="github_list_issues"),
            ToolCall(name="slack_post_message"),
        ],
    )

    from deepeval import assert_test
    from deepeval.metrics import ToolCorrectnessMetric
    assert_test(test_case, [
        ToolCorrectnessMetric(threshold=1.0),
        TaskCompletionMetric(threshold=0.8, model="gpt-4o-mini"),
    ])

# 本番環境での実行前にテスト環境で動作確認してください

6. よくある失敗パターンと回避策

失敗1:LLM評価をすべてのテストに適用する

❌ 全テストにLLM-as-Judgeを使い、CI実行に10分以上かかるようになった
⭕ スキーマ・フォーマットチェックは決定論的テストで底辺を厚くし、LLM評価は品質・安全性チェックにだけ使う

なぜ重要か: LLM評価は1回あたり数秒かかるため、全テストに適用するとCIが遅くなりすぎてフィードバックループが壊れます。

失敗2:閾値を固定値にする

❌ threshold=0.8と決め打ちし、プロダクトの発展に合わせて更新しなかった
⭕ 初期は threshold=0.6から始め、テストデータの充実に合わせて段階的に引き上げる

なぜ重要か: 高すぎる閾値はすべてのPRが失敗し、低すぎると品質劣化を見逃します。ゴールデンデータセットと閾値は定期的に見直しが必要です。

失敗3:ゴールデンデータセットを手動管理する

❌ test_cases.jsonを手動で編集し、レビューなしで変更を反映していた
⭕ ゴールデンデータセットをGitで管理し、追加・変更はPRレビューを必須にする

なぜ重要か: テストデータが汚染されると評価の信頼性が失われます。データのバージョン管理はコードのバージョン管理と同等に扱うべきです。

失敗4:temperature=0を使わない

❌ LLM評価モデルをデフォルト設定(temperature=0.7)で使い、同じテストケースで評価が毎回変わった
⭕ 評価用LLMには必ずtemperature=0を設定し、評価の再現性を担保する

参考・出典

まとめ:今日から始める3つのアクション

  1. 今日やること: 既存エージェントにpip install deepevalして最も重要なテストケース3つを追加する
  2. 今週中: GitHubActionsにDeepeval(またはpytest + LLM-as-Judge)を組み込み、PRごとに評価が自動実行される状態を作る
  3. 今月中: チームのダッシュボードニーズを確認し、必要であればBraintrustのStarterプランでPoC評価を開始する

あわせて読みたい:


著者: 佐藤傑(さとう・すぐる)
株式会社Uravation代表取締役。X(@SuguruKun_ai)フォロワー10万人以上。
100社以上の企業向けAI研修・導入支援。著書累計3万部突破。
SoftBank IT連載7回執筆(NewsPicks最大1,125ピックス)。

ご質問・ご相談はお問い合わせフォームからお気軽にどうぞ。

この記事を読んで導入イメージが固まってきた方へ

UravationではAIエージェント導入の研修・コンサルを行っています。

Need help moving from reading to rollout?

この記事を読んで導入イメージが固まってきた方へ

Uravationでは、AIエージェントの要件整理、PoC設計、社内導入、研修まで一気通貫で支援しています。

この記事をシェア

X Facebook LINE

※ 本記事の情報は2026年6月時点のものです。サービスの料金・仕様は変更される可能性があります。最新情報は各サービスの公式サイトをご確認ください。

関連記事