Promptfoo: как тестировать LLM и AI-агентов, сравнивать модели и запускать red teaming
После нескольких изменений prompt становится трудно ответить на простой вопрос: новая версия действительно лучше или просто кажется лучше? Promptfoo превращает LLM-разработку в тестируемый процесс: запускает одинаковые кейсы на разных моделях и prompts, проверяет assertions, измеряет качество, стоимость и latency, а отдельный red-team режим ищет уязвимости в чат-ботах, RAG и agent workflows.
Promptfoo проверяет не «умна ли модель вообще», а проходит ли ваша AI-система конкретные тесты
В основе Promptfoo — матрица: prompts × providers × test cases × assertions. Один и тот же набор реальных задач запускается на нескольких моделях или версиях prompt, после чего результат можно сравнить автоматически и вручную в Web UI.
Один dataset можно гонять после каждой смены prompt/model.
Одинаковые кейсы показывают разницу между providers, а не ощущения от пары ручных чатов.
Regex, JSON schema, custom code, similarity и model-graded assertions.
Red-team режим генерирует adversarial cases для вашего приложения.
LLM недетерминирована, а значит «проверил один раз» — слабая гарантия
- кейсы выбираются случайно;
- результаты трудно повторить;
- сложно сравнить старую и новую версию;
- ошибка может появиться только на редком input;
- регрессия обнаруживается пользователем.
- фиксированные test cases;
- одинаковые assertions;
- несколько providers;
- thresholds и metrics;
- CI не пропускает известную регрессию.
Каждый обнаруженный production failure полезно превращать в новый test case, чтобы эта же ошибка не вернулась после следующего изменения.
Установка Promptfoo 0.123.1
Для npm/npx current Promptfoo требует Node.js 22.22.0 или новее. Документация рекомендует Node.js 24 LTS.
node --version
npm install -g promptfoo@0.123.1
promptfoo --version
Без global install:
npx promptfoo@0.123.1 init --example getting-started
cd getting-started
npx promptfoo@0.123.1 eval
npx promptfoo@0.123.1 view
Есть также Homebrew и Python wrapper, но сам основной engine/CLI проекта остаётся Node.js-приложением.
npx promptfoo@latest удобен для знакомства,
но reproducible eval лучше выполнять на одной pinned версии.
Два prompts × одна модель × два теста
prompts:
- "Ответь кратко: {{question}}"
- "Ответь точно и не выдумывай факты: {{question}}"
providers:
- ollama:chat:qwen3
tests:
- vars:
question: "Столица Франции?"
assert:
- type: icontains
value: "Париж"
- vars:
question: "Верни JSON с полями ok и reason"
assert:
- type: is-json
promptfoo eval
promptfoo view
Promptfoo выполнит обе версии prompt на каждом test case, применит assertions и покажет matrix результатов в локальном viewer.
Не каждый тест LLM должен оценивать другая LLM
equals / containsДетерминированные проверкиДля обязательных строк и exact values.
is-jsonФорматПроверить, что output вообще валидный JSON.
regexСтруктура текстаID, формат ответа, обязательный pattern.
javascript / pythonBusiness ruleСвоя функция проверки.
similarSemantic similarityEmbedding-based оценка похожести.
llm-rubricModel-graded qualityКогда критерий нельзя выразить простой функцией.
assert:
- type: is-json
- type: javascript
value: |
const x = JSON.parse(output);
return x.ok === true && x.reason.length > 5;
- type: llm-rubric
value: >
Ответ должен быть конкретным, не содержать
неподтверждённых технических утверждений.
threshold: 0.8
Проверить JSON, enum или наличие обязательного URL обычным кодом дешевле и воспроизводимее, чем просить вторую модель оценивать всё подряд.
Promptfoo имеет отдельный provider для Ollama
providers:
- ollama:chat:qwen3
- ollama:chat:qwen3.5
- ollama:chat:gpt-oss
Current docs различают completion endpoint и chat endpoint.
Для chat-formatted models используется форма
ollama:chat:<model>.
Release 0.123.1 отдельно обновил поддержку возможностей Ollama 0.34 и вывод thinking/finish reason.
Свой Ollama host
providers:
- id: ollama:chat:qwen3
config:
apiBaseUrl: http://192.168.1.20:11434
Один dataset показывает, где дорогая модель действительно лучше дешёвой
providers:
- id: ollama:chat:qwen3
label: "Local Qwen"
- id: openai:gpt-5-mini
label: "GPT"
- id: anthropic:messages:claude-sonnet-4-6
label: "Claude"
На одной matrix можно сравнивать pass rate, scores, latency, token usage и provider cost там, где provider возвращает эти данные.
Сколько реальных кейсов прошло заданные критерии.
Важное отличие для interactive agent.
Нужна для выбора модели по экономике.
Можно искать нестабильность, а не только среднее качество.
Результат справедлив только для конкретного dataset, prompts, параметров и критериев вашего приложения.
llm-rubric проверяет критерии, которые трудно выразить regex или кодом
assert:
- type: llm-rubric
value: >
Ответ должен объяснять причину,
явно отделять подтверждённые факты от предположений
и не придумывать источники.
threshold: 0.8
provider:
id: openai:gpt-5-mini
config:
temperature: 0
Grader возвращает score и reason. Threshold превращает score в автоматический quality gate.
Хороший eval комбинирует deterministic assertions, human spot-check и model-based grading. Не используйте одну rubric-модель как единственный арбитр критической системы.
Promptfoo умеет тестировать HTTP API, Python/JS flows, tools, RAG и agents
Target необязательно должен быть прямым model API. Можно тестировать собственное приложение через HTTP, Python/JavaScript provider или executable.
providers:
- id: https
config:
url: http://localhost:8080/chat
method: POST
headers:
Content-Type: application/json
body:
message: "{{prompt}}"
transformResponse: json.answer
Это позволяет проверять всю цепочку: retrieval → rerank → agent → tools → final answer, а не только isolated LLM call.
Tool calling
Promptfoo понимает tools и умеет преобразовывать tool format между OpenAI, Anthropic, Bedrock и Google в HTTP provider. Поэтому можно тестировать не только текстовый ответ, но и выбор tool/function arguments.
Red team проверяет, как приложение ведёт себя под намеренно плохими inputs
promptfoo redteam init
promptfoo redteam run
promptfoo redteam report
Red-team configuration разделяет: target — что тестируем, plugins — какие классы риска, strategies — как формируются adversarial inputs, и purpose — предназначение приложения.
targets:
- ollama:chat:qwen3
redteam:
purpose: >
Локальный технический помощник,
который отвечает по документации.
plugins:
- prompt-injection
- pii
- hallucination
strategies:
- jailbreak-templates
Особенно важно для RAG/browser systems.
Проверка privacy boundary.
Критично для agents с tools.
Полезно для knowledge/RAG application.
Если нет подходящего OpenAI key или Codex/ChatGPT login,
Promptfoo может использовать hosted inference для generation/grading.
Для local-only режима задайте собственный local provider
и PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION=true.
# PowerShell
$env:PROMPTFOO_DISABLE_REDTEAM_REMOTE_GENERATION = "true"
# Например, локальный attacker/grader
# redteam:
# provider: ollama:chat:llama3.3
Eval можно запускать на каждом pull request
name: LLM eval
on:
pull_request:
paths:
- "prompts/**"
- "promptfooconfig.yaml"
jobs:
eval:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: "24"
- run: npm install -g promptfoo@0.123.1
- run: promptfoo eval --no-share
Есть и официальный Promptfoo GitHub Action, который умеет делать before/after comparison изменений prompts. Current docs требуют Node.js ≥22.22.0 на runner.
Сначала определите минимальный pass rate/critical cases, которые должны блокировать merge.
Свежая линия Promptfoo умеет работать с external traces
Release 0.122.1 добавил улучшения tracing и загрузку external traces из Grafana Tempo, Braintrust и Langfuse. Это полезно для agent tests: final answer может быть плохим из-за retrieval, неправильного tool call или промежуточного model step.
Основной PASS/FAIL.
Model spans, tools, retrieval и timings.
Promptfoo имеет собственный MCP server
npx promptfoo@0.123.1 mcp --transport stdio
MCP server позволяет совместимому agent работать с Promptfoo evaluations через tools. Он наследует обычные environment variables CLI, включая provider API keys и config path.
Если Promptfoo MCP запускается из coding-agent, он наследует environment процесса. Давайте ему только те provider keys, которые реально нужны для eval.
Нужно различать local runner, model provider, sharing и hosted red-team features
Viewer работает с локальной eval database/artifacts.
OpenAI/Anthropic/etc получают request, потому что именно они выполняют inference.
Может включать prompts, vars, outputs, traces, metadata и provider config fields.
Зависит от keys/login/configuration и remote-generation settings.
Отключить telemetry
# PowerShell
$env:PROMPTFOO_DISABLE_TELEMETRY = "1"
$env:PROMPTFOO_DISABLE_SHARING = "true"
Официальная telemetry documentation сообщает, что telemetry по умолчанию включает тип команды/assertion, package version и CI flag, но не prompts, outputs, tests, provider API keys или полный config.
promptfoo share — это реальная выгрузка eval snapshot.
Перед sharing убедитесь, что prompts, vars, outputs, traces и metadata не содержат secrets или клиентские данные.
Чужой promptfooconfig нужно воспринимать примерно как чужой скрипт
Security policy Promptfoo прямо говорит: OSS runner работает с правами текущего пользователя и не является sandbox. Некоторые функции специально исполняют пользовательский code.
Могут выполнять локальный code.
exec: запускает executable/command.
Тоже должны считаться доверенным code.
Проверяйте, что config не подгружает неожиданный content.
Передавать через env, а не hard-code в YAML.
Container/VM и минимальные credentials уменьшают последствия.
Если вы скачали чужой repository с custom provider/assertion
и запустили promptfoo eval,
исполняемый код может иметь те же права, что ваш пользователь.
На момент проверки GitHub Security page основного repository не показывает опубликованных security advisories. Это не означает отсутствие bugs; security policy определяет модель доверия и канал private disclosure.
DSPy оптимизирует, Langfuse наблюдает, Promptfoo проверяет
Эти слои хорошо комбинируются: Promptfoo хранит regression dataset, DSPy может оптимизировать prompt/program, Promptfoo снова проверяет результат, а Langfuse показывает поведение после deployment.
Плохой dataset невозможно исправить красивым eval framework
Нереалистичные test cases дают ложную уверенность.
LLM grader может предпочитать определённый стиль/model family.
Матрица models × prompts × tests быстро умножает requests.
Он находит часть проблем, а не сертифицирует отсутствие всех уязвимостей.
Один pass не гарантирует стабильность недетерминированной модели.
Слишком низкие ничего не ловят, слишком высокие блокируют нормальные изменения.
Небольшой dataset из настоящих production failures обычно полезнее огромного набора вопросов, которые пользователи никогда не задают.
Где Promptfoo особенно полезен
Сравнить новый provider со старым на реальных задачах.
Проверить, не сломали ли новый system prompt уже работающие кейсы.
Qwen/Gemma/другие Ollama models на одном dataset.
Проверить factuality, context relevance и grounded answers.
Prompt injection, authorization и dangerous tool behavior.
Не выпускать версию, которая проваливает критические AI-тесты.
Promptfoo 0.123.1: evals, Ollama, red team, privacy и security model
Latest stable release — 0.123.1 от 18 сентября.
Current npm/npx runtime requirement — Node.js >=22.22.0;
Node.js 24 LTS рекомендован документацией.
Promptfoo превращает prompt/model changes из субъективного эксперимента в regression testing
Самая полезная часть Promptfoo — не red-team dashboard и не количество providers, а привычка хранить реальные AI-failures как test cases. После этого смена prompt, модели, RAG или agent logic перестаёт быть слепым экспериментом.
Для локального AI особенно удобна поддержка Ollama: несколько моделей можно прогнать через один dataset, сравнить качество/скорость и только потом выбирать production default.
Частые вопросы про Promptfoo
Что такое Promptfoo простыми словами?
Open-source CLI/library для автоматического тестирования prompts, моделей, RAG и AI-агентов. Один dataset можно прогонять на разных providers и проверять assertions.
Можно ли тестировать локальные Ollama-модели?
Да. Есть native Ollama provider, включая chat/completion, thinking output и актуальные возможности Ollama 0.34.
Можно ли сравнить GPT, Claude и локальную LLM?
Да. Добавьте несколько providers в один config — Promptfoo выполнит одинаковые test cases для каждого.
Что такое llm-rubric?
Assertion, где отдельная модель оценивает output по текстовому критерию и возвращает score/pass/reason.
Можно ли тестировать собственный agent, а не прямой LLM API?
Да. Target может быть HTTP endpoint, Python/JavaScript provider, shell executable, RAG/agent flow или поддерживаемый agent provider.
Red team полностью локален?
Не обязательно. Target evaluation выполняется локальным runner, но generation/grading в некоторых конфигурациях может использовать Promptfoo hosted inference. Это можно отключить и указать local provider.
Promptfoo отправляет мои обычные eval results в облако?
По умолчанию результаты сохраняются локально. Выгрузка происходит при Cloud-backed features или явном sharing/sync. Requests к cloud LLM, конечно, уходят выбранному model provider.
Можно ли использовать в GitHub Actions?
Да. Есть обычный CLI workflow и официальный promptfoo GitHub Action для before/after prompt evaluation.
Безопасно ли запускать чужой promptfooconfig.yaml?
Не следует считать его безопасным. Custom assertions/providers/hooks/scripts могут исполнять code с правами текущего пользователя; Promptfoo OSS не является sandbox.
Какая версия актуальна?
На 21 сентября 2026 года latest stable release — Promptfoo 0.123.1.
Поменяли модель или prompt — и хотите понять, действительно ли система стала лучше?
Соберите небольшой dataset из реальных запросов, добавьте deterministic assertions и quality rubric, затем прогоните старую и новую версию одинаковыми тестами.