DEV Community

Cover image for LLMアプリケーション テスト完全ガイド:Promptfoo徹底解説(2026年)
Akira
Akira

Posted on • Originally published at apidog.com

LLMアプリケーション テスト完全ガイド:Promptfoo徹底解説(2026年)

TL;DR

Promptfooは、AIアプリケーションの体系的なLLMテストとレッドチーム評価を自動化できるオープンソースツールです。90以上のモデルプロバイダーと67以上のセキュリティ攻撃プラグインを備え、100%ローカルで動作。npm install -g promptfoopromptfoo init --example getting-started ですぐに始められます。

Apidogを今すぐ試す


はじめに

AIで顧客サポートチャットボットを構築し、開発中は思い通りに動作していても、実際のユーザーがガードレールを回避したり、機密情報が漏れるケースは後を絶ちません。多くのチームが手動テストや直感でLLMアプリを出荷し、本番環境で問題が発覚しています。こうした問題をリリース後に修正するコストは、開発中に見つけるより遥かに高額です。

Promptfooは、LLMアプリへの自動・体系的なテスト導入を可能にします。複数モデルの比較、セキュリティテスト、リグレッション検出も自動化。この記事では、Promptfooの評価設定、セキュリティスキャン、CI/CD連携、よくある落とし穴回避まで手順に沿って解説します。この記事を読めば、LLMアプリケーションのテスト自動化が即実践できます。

💡 APIテストやLLMテストと並行してAPIの動作検証も必要な場合は、ApidogがAPI設計・テスト・ドキュメントの統合プラットフォームを提供します。LLM評価にはPromptfoo、APIレイヤー検証にはApidogの併用がおすすめです。


Promptfooとは何か、なぜ必要か

Promptfoo はLLMアプリケーション向けのCLI/Node.jsライブラリです。従来のテストツールはLLMの非決定論的出力に対応できませんが、Promptfooは以下の仕組みでこの課題を解決します。

  • セマンティックアサーション: 厳密なテキスト一致でなく意味で判定
  • LLM-graded evals: 別のモデルで出力を評価
  • マルチモデル比較: 複数モデルで同一プロンプトをテスト
  • セキュリティプラグイン: 脆弱性自動チェック

このツールはローカル動作が基本。プライバシー重視の開発にも最適です。

LLMを評価するためにPromptfooを使用する


Promptfooが解決する主な課題

  • リグレッション自動検知: モデル更新で既存機能が壊れても検出可能
  • テストカバレッジ拡大: エッジケースや敵対的入力も自動で網羅
  • 客観的メトリクス: 合格率・コスト・レイテンシを数値化

テストケースを定義すれば、モデル変更時にも一括自動判定が可能です。


利用シーン

  • 顧客サポートチャットボット等、高精度な応答が必須なシステム
  • ブランド一貫性が求められるコンテンツ生成
  • コンプライアンス要件の厳しいヘルスケア/フィンテック
  • セキュリティクリティカルなアプリケーション

2026年3月以降もオープンソース(MIT)で開発継続中です。


開始:最初の評価をインストール&実行

Promptfooの導入は数手順で完了します。

インストール

# グローバルインストール(推奨)
npm install -g promptfoo

# またはインストールせずに実行
npx promptfoo@latest

# macOS: Homebrew
brew install promptfoo

# Python
pip install promptfoo
Enter fullscreen mode Exit fullscreen mode

必要なAPIキーを環境変数でセットします。

export OPENAI_API_KEY=sk-abc123
export ANTHROPIC_API_KEY=sk-ant-xxx
Enter fullscreen mode Exit fullscreen mode

サンプル評価プロジェクトの初期化

promptfoo init --example getting-started
cd getting-started
Enter fullscreen mode Exit fullscreen mode

これで promptfooconfig.yaml(サンプルプロンプト・プロバイダー・テストケース)を自動生成。


評価の実行

promptfoo eval
Enter fullscreen mode Exit fullscreen mode

Web UIで結果確認:

promptfoo view
Enter fullscreen mode Exit fullscreen mode

localhost:3000 で各モデルの出力・アサーション結果をサイドバイサイドで視覚的に比較できます。


設定ファイルのポイント

promptfooconfig.yaml で評価スイートを定義します。

description: "My First Eval Suite"

prompts:
  - prompts/greeting.txt
  - prompts/farewell.txt

providers:
  - openai:gpt-4o
  - anthropic:claude-sonnet-4-5

tests:
  - vars:
      input: "Hello"
    assert:
      - type: contains
        value: "Hi"
      - type: latency
        threshold: 3000
Enter fullscreen mode Exit fullscreen mode
  • prompts: テスト対象プロンプト
  • providers: モデル
  • tests: 変数・アサーション

数百ケースまでスケールし、CIで自動実行可能です。


コア機能:Promptfooでできること

1. 自動評価

  • テストケースをYAMLで定義
  • 30種類以上のアサーションが利用可能
アサーション 目的
contains 部分一致
equals 完全一致
regex 正規表現一致
json-schema JSON構造検証
javascript カスタムJS関数
python カスタムPython関数
llm-rubric LLMによる評価
similar 類似度スコア
latency 応答時間
cost コスト

アサーション例

tests:
  - vars:
      question: "What is the capital of France?"
    assert:
      - type: contains
        value: "Paris"
      - type: javascript
        value: output.length < 100
      - type: latency
        threshold: 2000
      - type: cost
        threshold: 0.001
Enter fullscreen mode Exit fullscreen mode

LLMによる評価

assert:
  - type: llm-rubric
    value: "Response should be helpful, harmless, and honest"
Enter fullscreen mode Exit fullscreen mode

グレーダーLLMで主観的評価も自動化可能。


2. レッドチームテスト・セキュリティテスト

Promptfooは67種類以上の攻撃シナリオを自動実行できます。

プロンプトのレッドチームテストにPromptfooを使用する

攻撃カテゴリ例

カテゴリ テスト内容
プロンプトインジェクション 直接・間接・コンテキストインジェクション
ジェイルブレイク DAN/ロールプレイ等バイパス
データ流出 SSRF/プロンプト抽出/漏洩
有害コンテンツ ヘイト/危険行為/自傷要求
コンプライアンス PII/HIPAA違反/金融データ
オーディオ/ビジュアル 音声/画像攻撃

レッドチームスキャン実行

promptfoo redteam init
promptfoo redteam run
promptfoo redteam report [directory]
Enter fullscreen mode Exit fullscreen mode
  • 攻撃プローブ自動生成
  • 脆弱性スコアリング

出力例:

脆弱性の概要:
- 致命的: 2 (PII漏洩、プロンプト抽出)
- 高: 5 (ジェイルブレイク、インジェクション攻撃)
...
Enter fullscreen mode Exit fullscreen mode

3. プルリクエストのコードスキャン

GitHub Actions統合でLLM関連のセキュリティ問題を自動検出可能。

# .github/workflows/promptfoo-scan.yml
name: Promptfoo Code Scan
on: [pull_request]
jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: promptfoo/promptfoo/code-scan-action@main
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
Enter fullscreen mode Exit fullscreen mode

4. モデル比較

複数モデルの出力をWeb UI上で並列比較し、コスト・合格率・レイテンシを一目で把握できます。

promptfoo eval
promptfoo view
Enter fullscreen mode Exit fullscreen mode

サポートプロバイダー:90以上のLLM統合

Promptfooは主要LLMプロバイダーを網羅。
| プロバイダー | モデル例 |
|----------------|------------------------------------------|
| OpenAI | GPT-4, GPT-4o, o1, o3 |
| Anthropic | Claude 3.5/4/4.5/4.6 |
| Google | Gemini, Vertex AI |
| Microsoft | Azure OpenAI, Phi |
| Amazon | Bedrock (Claude, Llama, Titan) |
| Meta | Llama 3系 |
| Ollama | ローカルモデル |


カスタムプロバイダーの追加

Python例:

# custom_provider.py
from typing import Any

class CustomProvider:
    async def call_api(self, prompt: str, options: dict, context: dict) -> dict:
        response = await my_async_api.generate(prompt)
        return {
            "output": response.text,
            "tokenUsage": {
                "total": response.usage.total_tokens,
                "prompt": response.usage.prompt_tokens,
                "completion": response.usage.completion_tokens
            }
        }
Enter fullscreen mode Exit fullscreen mode

JavaScript例:

// customProvider.js
export default class CustomProvider {
  async callApi(prompt) {
    return {
      output: await myApi.generate(prompt),
      tokenUsage: { total: 50, prompt: 20, completion: 30 }
    };
  }
}
Enter fullscreen mode Exit fullscreen mode

設定ファイルに登録:

providers:
  - id: file://custom_provider.py
    config:
      api_key: ${MY_API_KEY}
Enter fullscreen mode Exit fullscreen mode

コマンドラインインターフェース:必須コマンド

# 評価を実行
promptfoo eval -c promptfooconfig.yaml

# Web UIを開く
promptfoo view

# 結果をオンライン共有
promptfoo share

# レッドチーム
promptfoo redteam init
promptfoo redteam run

# 設定関連
promptfoo init
promptfoo validate [config]

# 結果管理
promptfoo list
promptfoo show <id>
promptfoo delete <id>
promptfoo export <id>

# ユーティリティ
promptfoo cache clear
promptfoo retry <id>
Enter fullscreen mode Exit fullscreen mode

よく使うフラグ

--no-cache              # キャッシュ無効化
--max-concurrency <n>   # 並列API呼び出し制限
--output <file>         # 結果をJSON出力
--verbose               # デバッグ有効
--env-file <path>       # 環境変数読込
--filter <pattern>      # テストケース絞り込み
Enter fullscreen mode Exit fullscreen mode

カスタム設定例:

promptfoo eval \
  -c promptfooconfig.yaml \
  --no-cache \
  --max-concurrency 3 \
  --output results.json \
  --env-file .env
Enter fullscreen mode Exit fullscreen mode

CI/CD連携:LLMテストの自動化

GitHub Actions例

name: LLM Tests
on: [push, pull_request]
jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
      - run: npm install -g promptfoo
      - run: promptfoo eval -c promptfooconfig.yaml
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Enter fullscreen mode Exit fullscreen mode

品質ゲート

commandLineOptions:
  threshold: 0.8  # 80%合格必須
Enter fullscreen mode Exit fullscreen mode

CIキャッシュ活用

- uses: actions/cache@v4
  with:
    path: ~/.cache/promptfoo
    key: ${{ runner.os }}-promptfoo-${{ hashFiles('promptfooconfig.yaml') }}
Enter fullscreen mode Exit fullscreen mode

Web UI:結果の可視化と共有

  • サイドバイサイド出力比較
  • フィルタリング・差分ビュー・共有リンク生成
  • リアルタイム更新

デフォルトは localhost:3000 で動作し、CSRF対策も装備。チームで共有する場合は promptfoo share でクラウド共有か、認証付きセルフホスト推奨。


データベースとキャッシュ

キャッシュ

  • macOS/Linux: ~/.cache/promptfoo
  • Windows: %LOCALAPPDATA%\promptfoo

開発中は --no-cache で常に最新実行。

データベース

  • ~/.promptfoo/promptfoo.db (SQLite)

過去の評価履歴を保存。消したくない場合は削除禁止。


セキュリティモデル

信頼された入力(コード実行あり)

  • 設定ファイル
  • カスタムアサーション(JS/Python/Ruby)
  • プロバイダー設定

信頼できない入力(データのみ)

  • プロンプトテキスト
  • テストケース変数
  • モデル出力
  • リモート取得データ

推奨強化策

  • 最小権限コンテナ/VM内で実行
  • 専用APIキー利用
  • シークレットをプロンプト/設定に書かない
  • ネットワーク送信制限
  • ローカルWebサーバー公開不可

パフォーマンス最適化

最適化TIPS

  1. キャッシュ活用: 繰返し実行の高速化
  2. 並列数調整: --max-concurrency で速度とレート制限のバランス
  3. テスト絞り込み: --filter で部分実行
  4. サンプリング実行: --repeat でサブセット検証

大規模評価

  • スケジューラー(src/scheduler/)利用で分散実行
  • Googleスプレッドシート等へのエクスポート対応

拡張性:カスタム機能構築

カスタムアサーション例

// assertions/customCheck.js
export default function customCheck(output, context) {
  const pass = output.includes('expected');
  return {
    pass,
    score: pass ? 1 : 0,
    reason: pass ? 'Output matched' : 'Missing expected content'
  };
}
Enter fullscreen mode Exit fullscreen mode

設定で利用:

assert:
  - type: file://assertions/customCheck.js
Enter fullscreen mode Exit fullscreen mode

MCPサーバー

AIアシスタントとの連携用プロトコルサーバーも同梱。

promptfoo mcp
Enter fullscreen mode Exit fullscreen mode
  • チャットから評価実行
  • レッドチーム機能呼出
  • 結果クエリ
  • 新規テストケース生成

実際の使用例

カスタマーサポートチャットボット

  • 500ケース超のFAQテスト
  • GPT-4/Claudeで品質比較
  • レッドチームスキャンでPII漏洩/Jailbreak検知
  • CI連携で失敗時デプロイブロック
  • 効果: 顧客報告問題90%削減

コンテンツ生成パイプライン

  • トーン/スタイルをLLMアサーションで検証
  • レイテンシ/コスト監視
  • モデル比較でコスト最適化
  • 効果: ブランド一貫性維持&APIコスト40%削減

ヘルスケアアプリケーション

  • HIPAA違反レッドチームスキャン
  • 医療正確性カスタムアサーション
  • 評価はローカルのみ
  • 監査証跡生成
  • 効果: SOC 2監査合格

結論

Promptfooを使えば、LLMアプリの手動テストを自動化し、リグレッション/セキュリティ/品質問題をデプロイ前に発見できます。

  • npm install -g promptfoopromptfoo init ですぐ導入
  • アサーションで柔軟な判定
  • レッドチームスキャンで脆弱性検知
  • CI/CD統合でリグレッションブロック
  • モデル比較・カスタム拡張も柔軟

AI開発はデータ駆動が必須です。Promptfooで大規模LLMアプリの品質・安全性を最速で担保しましょう。

APIレイヤーのテストも必要な場合は、PromptfooとApidogを併用し、API設計~LLM評価まで一括自動化しましょう。


よくある質問

promptfooは何に使われますか?

LLMアプリケーションの自動テスト、モデル出力比較、セキュリティレッドチーム評価に利用します。

promptfooは無料ですか?

オープンソース(MIT)で基本機能は無料。クラウドやエンタープライズは有償オプション。

インストール方法は?

npm install -g promptfoo でグローバル導入。npx promptfoo@latestbrew install promptfoopip install promptfoo も利用可。

サポートモデルは?

OpenAI(GPT-4/4o/o1)、Anthropic(Claude系)、Google(Gemini)、Microsoft、Amazon Bedrock、Ollama等90以上に対応。

レッドチームスキャンの手順は?

promptfoo redteam init で設定、promptfoo redteam run で実行、promptfoo redteam report でレポート確認。

CI/CDで使えますか?

はい。CIにインストールし promptfoo eval を実行、threshold で品質ゲート設定可。

データは外部送信されますか?

いいえ。デフォルトは100%ローカル動作。クラウド機能はオプトイン時のみ。

モデル比較の方法は?

設定ファイルで複数プロバイダーを指定し promptfoo evalpromptfoo view でWeb UI比較できます。

Top comments (0)