TL;DR
Promptfooは、AIアプリケーションの体系的なLLMテストとレッドチーム評価を自動化できるオープンソースツールです。90以上のモデルプロバイダーと67以上のセキュリティ攻撃プラグインを備え、100%ローカルで動作。npm install -g promptfoo と promptfoo init --example getting-started ですぐに始められます。
はじめに
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: 別のモデルで出力を評価
- マルチモデル比較: 複数モデルで同一プロンプトをテスト
- セキュリティプラグイン: 脆弱性自動チェック
このツールはローカル動作が基本。プライバシー重視の開発にも最適です。
Promptfooが解決する主な課題
- リグレッション自動検知: モデル更新で既存機能が壊れても検出可能
- テストカバレッジ拡大: エッジケースや敵対的入力も自動で網羅
- 客観的メトリクス: 合格率・コスト・レイテンシを数値化
テストケースを定義すれば、モデル変更時にも一括自動判定が可能です。
利用シーン
- 顧客サポートチャットボット等、高精度な応答が必須なシステム
- ブランド一貫性が求められるコンテンツ生成
- コンプライアンス要件の厳しいヘルスケア/フィンテック
- セキュリティクリティカルなアプリケーション
2026年3月以降もオープンソース(MIT)で開発継続中です。
開始:最初の評価をインストール&実行
Promptfooの導入は数手順で完了します。
インストール
# グローバルインストール(推奨)
npm install -g promptfoo
# またはインストールせずに実行
npx promptfoo@latest
# macOS: Homebrew
brew install promptfoo
# Python
pip install promptfoo
必要なAPIキーを環境変数でセットします。
export OPENAI_API_KEY=sk-abc123
export ANTHROPIC_API_KEY=sk-ant-xxx
サンプル評価プロジェクトの初期化
promptfoo init --example getting-started
cd getting-started
これで promptfooconfig.yaml(サンプルプロンプト・プロバイダー・テストケース)を自動生成。
評価の実行
promptfoo eval
Web UIで結果確認:
promptfoo view
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
- 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
LLMによる評価
assert:
- type: llm-rubric
value: "Response should be helpful, harmless, and honest"
グレーダーLLMで主観的評価も自動化可能。
2. レッドチームテスト・セキュリティテスト
Promptfooは67種類以上の攻撃シナリオを自動実行できます。
攻撃カテゴリ例
| カテゴリ | テスト内容 |
|---|---|
| プロンプトインジェクション | 直接・間接・コンテキストインジェクション |
| ジェイルブレイク | DAN/ロールプレイ等バイパス |
| データ流出 | SSRF/プロンプト抽出/漏洩 |
| 有害コンテンツ | ヘイト/危険行為/自傷要求 |
| コンプライアンス | PII/HIPAA違反/金融データ |
| オーディオ/ビジュアル | 音声/画像攻撃 |
レッドチームスキャン実行
promptfoo redteam init
promptfoo redteam run
promptfoo redteam report [directory]
- 攻撃プローブ自動生成
- 脆弱性スコアリング
出力例:
脆弱性の概要:
- 致命的: 2 (PII漏洩、プロンプト抽出)
- 高: 5 (ジェイルブレイク、インジェクション攻撃)
...
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 }}
4. モデル比較
複数モデルの出力をWeb UI上で並列比較し、コスト・合格率・レイテンシを一目で把握できます。
promptfoo eval
promptfoo view
サポートプロバイダー: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
}
}
JavaScript例:
// customProvider.js
export default class CustomProvider {
async callApi(prompt) {
return {
output: await myApi.generate(prompt),
tokenUsage: { total: 50, prompt: 20, completion: 30 }
};
}
}
設定ファイルに登録:
providers:
- id: file://custom_provider.py
config:
api_key: ${MY_API_KEY}
コマンドラインインターフェース:必須コマンド
# 評価を実行
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>
よく使うフラグ
--no-cache # キャッシュ無効化
--max-concurrency <n> # 並列API呼び出し制限
--output <file> # 結果をJSON出力
--verbose # デバッグ有効
--env-file <path> # 環境変数読込
--filter <pattern> # テストケース絞り込み
カスタム設定例:
promptfoo eval \
-c promptfooconfig.yaml \
--no-cache \
--max-concurrency 3 \
--output results.json \
--env-file .env
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 }}
品質ゲート
commandLineOptions:
threshold: 0.8 # 80%合格必須
CIキャッシュ活用
- uses: actions/cache@v4
with:
path: ~/.cache/promptfoo
key: ${{ runner.os }}-promptfoo-${{ hashFiles('promptfooconfig.yaml') }}
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
- キャッシュ活用: 繰返し実行の高速化
-
並列数調整:
--max-concurrencyで速度とレート制限のバランス -
テスト絞り込み:
--filterで部分実行 -
サンプリング実行:
--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'
};
}
設定で利用:
assert:
- type: file://assertions/customCheck.js
MCPサーバー
AIアシスタントとの連携用プロトコルサーバーも同梱。
promptfoo mcp
- チャットから評価実行
- レッドチーム機能呼出
- 結果クエリ
- 新規テストケース生成
実際の使用例
カスタマーサポートチャットボット
- 500ケース超のFAQテスト
- GPT-4/Claudeで品質比較
- レッドチームスキャンでPII漏洩/Jailbreak検知
- CI連携で失敗時デプロイブロック
- 効果: 顧客報告問題90%削減
コンテンツ生成パイプライン
- トーン/スタイルをLLMアサーションで検証
- レイテンシ/コスト監視
- モデル比較でコスト最適化
- 効果: ブランド一貫性維持&APIコスト40%削減
ヘルスケアアプリケーション
- HIPAA違反レッドチームスキャン
- 医療正確性カスタムアサーション
- 評価はローカルのみ
- 監査証跡生成
- 効果: SOC 2監査合格
結論
Promptfooを使えば、LLMアプリの手動テストを自動化し、リグレッション/セキュリティ/品質問題をデプロイ前に発見できます。
-
npm install -g promptfooとpromptfoo initですぐ導入 - アサーションで柔軟な判定
- レッドチームスキャンで脆弱性検知
- CI/CD統合でリグレッションブロック
- モデル比較・カスタム拡張も柔軟
AI開発はデータ駆動が必須です。Promptfooで大規模LLMアプリの品質・安全性を最速で担保しましょう。
APIレイヤーのテストも必要な場合は、PromptfooとApidogを併用し、API設計~LLM評価まで一括自動化しましょう。
よくある質問
promptfooは何に使われますか?
LLMアプリケーションの自動テスト、モデル出力比較、セキュリティレッドチーム評価に利用します。
promptfooは無料ですか?
オープンソース(MIT)で基本機能は無料。クラウドやエンタープライズは有償オプション。
インストール方法は?
npm install -g promptfoo でグローバル導入。npx promptfoo@latest や brew install promptfoo、pip 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 eval、promptfoo view でWeb UI比較できます。


Top comments (0)