DeepEval は、LLM アプリケーションを pytest と同じ感覚で評価できる OSS の Python フレームワークです。Confident AI チームが開発し、G-Eval や RAG メトリクスから hallucination、bias、toxicity の検出まで、幅広い判定を数行のコードで CI/CD に組み込めます。本記事では、DeepEval が刺さるケース、最小動作例、Promptfoo との棲み分け、ハマりポイント、商用版 Confident AI との関係までを整理します。
開発元とライセンス
DeepEval は Confident AI の創業チームが開発し、Apache 2.0 で公開されています。GitHub の confident-ai/deepeval で開発が進んでおり、2024 年以降は RAG、エージェント、マルチモーダルといった領域にもメトリクスが拡張されています。
Python 3.9 以上で pip install -U deepeval を実行すれば導入でき、本体は OSS として自由に商用利用も可能です。企業導入でよくあるライセンス審査もパスしやすい設計になっています。
なぜ pytest スタイルが刺さるか
LLM の評価は、ふつうのユニットテストほど結果が確定しません。入力が同じでも出力が揺れますし、「正しい答え」が一本に決まらない問題もあります。それでも「このコミットでスコアが下がっていないか」をリリース前に機械的に確かめたい—— ここに pytest 流の記法がよく合います。
DeepEval は test_ で始まる関数を deepeval test run で収集し、各メトリクスが閾値を下回ったら失敗にします。既存の CI パイプラインの中で普通の pytest と並べて実行できる点が、Python を使っている現場では扱いやすいところです。
主な機能とメトリクス
DeepEval が提供するメトリクスはかなり広い範囲をカバーしています。代表的なものを分類すると次のようになります。
- 汎用判定:
GEval(LLM-as-a-Judge の実装)、DAG(決定的なグラフベース判定)、JevEval(分散低減版) - RAG 向け:
AnswerRelevancyMetric、FaithfulnessMetric、ContextualPrecisionMetric、ContextualRecallMetric、ContextualRelevancyMetric - 安全性:
HallucinationMetric、BiasMetric、ToxicityMetric、PII 漏洩、misuse 検出 - エージェント:
TaskCompletionMetric、ToolCorrectnessMetric、GoalAccuracyMetric、StepEfficiencyMetric - 会話:
KnowledgeRetentionMetric、ConversationCompletenessMetric、TurnRelevancyMetric
スコアは 0〜1 で返り、閾値 (threshold) を超えないテストケースは失敗扱いになります。合成データ生成や LLM ベンチマークまで、評価の周辺作業もひと通り揃っています。
最小動作例
G-Eval と Answer Relevancy を組み合わせた最小の pytest テストを示します。
# test_qa.py
from deepeval import assert_test
from deepeval.test_case import LLMTestCase, LLMTestCaseParams
from deepeval.metrics import GEval, AnswerRelevancyMetric
def test_qa():
correctness = GEval(
name="Correctness",
criteria="actual_output が expected_output と事実関係で一致しているか",
evaluation_params=[
LLMTestCaseParams.ACTUAL_OUTPUT,
LLMTestCaseParams.EXPECTED_OUTPUT,
],
threshold=0.7,
)
relevancy = AnswerRelevancyMetric(threshold=0.7)
case = LLMTestCase(
input="日本の首都はどこですか?",
actual_output="日本の首都は東京です。",
expected_output="東京です。",
)
assert_test(case, [correctness, relevancy])
実行コマンドは次のとおりです。
export OPENAI_API_KEY=sk-...
deepeval test run test_qa.py
結果はターミナルに表形式で出力され、各メトリクスのスコアと判定理由(LLM 自身が述べる reasoning)を確認できます。pytest 互換なので -k、-x、--tb といったおなじみのオプションもそのまま使えます。
向くケース・向かないケース
向くのは次のような場面です。
- RAG パイプラインの品質を回帰テストしたい Python プロジェクト
- CI で LLM アプリの劣化を機械的に止めたいケース
- 「正解との完全一致」ではなく「文脈との整合」や「安全性」といった、ルールベースでは判定しづらい観点を見たい場合
- マルチターン会話やエージェント軌跡まで評価したい場合
一方で、以下のような現場には向きません。
- Python を触らないチーム(YAML だけで完結させたいなら Promptfoo のほうが向きます)
- 判定 LLM の API コストが受け入れられない大規模スイート
- 判定が完全に確定的でないと困るクリティカル領域(この場合は DAG メトリクスや決定論的なルールで補う必要があります)
他ツールとの違い(Promptfoo との棲み分け)
同じ領域で名前が挙がる Promptfoo は、YAML でプロンプトとテストを定義する CLI 中心のツールです。言語非依存で、プロンプトを A/B 比較する用途に向きます。
一方 DeepEval は Python のテストコードとして評価を書くので、既存の pytest 資産やフィクスチャ、CI 設定をそのまま拡張できます。アプリ内部の retrieval チェーンや tool 呼び出し軌跡まで同じテストから覗ける点も強みで、「プロダクトコードと評価を一緒に動かす」用途では DeepEval が自然です。
おおまかには、プロンプトの比較が主目的なら Promptfoo、アプリの振る舞い全体を Python でテストしたいなら DeepEval、と覚えておくと迷いません。
ハマりポイント
- 判定 LLM の API キーが必要:
GEvalなどは内部で OpenAI などを呼ぶため、OPENAI_API_KEYを設定しないと動きません。モデルを差し替える場合はmodel引数かset_global_modelで明示します。 - ゆらぎのある判定: LLM-as-a-Judge の性質上、同じ入力でもスコアが揺れます。閾値を甘めに設定したり、複数回の中央値で評価する運用が現実的です。
- コストと速度: テスト 1 件につき判定 LLM が複数回呼ばれるケースも多く、スイートが大きくなると料金と時間がじわじわ効いてきます。ネットワーク障害や rate limit への備えも必要です。
- バージョン差分: 2024 年以降、メトリクスのパラメータ名が整理されつつあり、
LLMTestCaseParamsとSingleTurnParamsが併存しています。参照しているドキュメントとインストール版が一致しているか確認しましょう。 - メトリクスごとの必須フィールド:
inputとactual_outputだけではFaithfulnessMetricは動かず、retrieval_contextを与える必要があります。メトリクスごとに必須フィールドが違う点に注意してください。
Confident AI 商用版との関係
DeepEval 自体は OSS ですが、同じ会社が運営する Confident AI というホスト型プラットフォームがあります。deepeval login のあとテストを走らせると、結果が Web UI に蓄積され、以下が可能になります。
- データセット管理と共有
- 本番トラフィックのオンライン評価
- リグレッションの追跡とスコアの経時変化
- レッドチーミング、ガバナンス、権限管理
OSS だけで完結する運用もできますし、「結果をチームで見たい」「本番監視と繋げたい」というタイミングで有償プランへ移行できる、ゆるやかな階段構造になっています。小さく始めて必要になったら乗せ替える、という道筋が描きやすい点はありがたいところです。
まとめ
DeepEval は、「Python で LLM を書いているなら、評価もコードで書こう」という思想を素直に実装したツールです。pytest 互換のインターフェース、幅広いメトリクス、Confident AI へのスムーズな接続まで揃っており、個人の実験から CI 導入までを一つの流儀で貫けます。
まずは pip install deepeval と deepeval test run の往復から始め、G-Eval で手触りを掴み、必要に応じて RAG メトリクスや安全性メトリクスへ広げていくのが素直な学習経路です。
chaff grade との連携 — 決定論的採点を混ぜる
DeepEval のメトリクスは多くが LLM-judge で、同じ入力でも結果がブレます。chaffjs の grade は決定論的な採点を担い、「引用の一致」「数値の整合」「文体規則の違反率」など機械で決まる側を受け持ちます。
DeepEval から chaff grade を呼ぶには、BaseMetric を継承したカスタムメトリクスを書き、CLI を subprocess で呼び出す形が素直です:
from deepeval.metrics import BaseMetric
class ChaffGradeMetric(BaseMetric):
def measure(self, test_case):
# chaff grade CLI を呼び、score と reason を取得
...
実装例: isamu/lab: examples/evals/deepeval(chaff_metric.py 参照)
関連記事
Singularity Society はテクノロジー集団として MulmoClaude / MulmoTerminal / MulmoCast を開発しています。エンジニア・起業家向けの実践プログラム BootCamp も運営しています。
