DeepEval: pytest 感覚で LLM を評価する OSS

DeepEval: pytest 感覚で LLM を評価する OSS

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 が提供するメトリクスはかなり広い範囲をカバーしています。代表的なものを分類すると次のようになります。

スコアは 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 といったおなじみのオプションもそのまま使えます。

向くケース・向かないケース

向くのは次のような場面です。

一方で、以下のような現場には向きません。

他ツールとの違い(Promptfoo との棲み分け)

同じ領域で名前が挙がる Promptfoo は、YAML でプロンプトとテストを定義する CLI 中心のツールです。言語非依存で、プロンプトを A/B 比較する用途に向きます。

一方 DeepEval は Python のテストコードとして評価を書くので、既存の pytest 資産やフィクスチャ、CI 設定をそのまま拡張できます。アプリ内部の retrieval チェーンや tool 呼び出し軌跡まで同じテストから覗ける点も強みで、「プロダクトコードと評価を一緒に動かす」用途では DeepEval が自然です。

おおまかには、プロンプトの比較が主目的なら Promptfoo、アプリの振る舞い全体を Python でテストしたいなら DeepEval、と覚えておくと迷いません。

ハマりポイント

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 も運営しています。

この記事をシェア

関連記事

記事一覧に戻る