Promptfoo: как тестировать LLM и AI-агентов, сравнивать модели и запускать red teaming
Promptfoo · LLM evals · red teaming · Ollama · CI/CD

Promptfoo: как тестировать LLM и AI-агентов, сравнивать модели и запускать red teaming

После нескольких изменений prompt становится трудно ответить на простой вопрос: новая версия действительно лучше или просто кажется лучше? Promptfoo превращает LLM-разработку в тестируемый процесс: запускает одинаковые кейсы на разных моделях и prompts, проверяет assertions, измеряет качество, стоимость и latency, а отдельный red-team режим ищет уязвимости в чат-ботах, RAG и agent workflows.

0.123.1 latest stable release от 18 сентября 2026 года
Node.js ≥22.22.0 Node.js 24 LTS рекомендован current docs
MIT open-source CLI/library; проект теперь входит в OpenAI
LLM evaluation framework

Promptfoo проверяет не «умна ли модель вообще», а проходит ли ваша AI-система конкретные тесты

В основе Promptfoo — матрица: prompts × providers × test cases × assertions. Один и тот же набор реальных задач запускается на нескольких моделях или версиях prompt, после чего результат можно сравнить автоматически и вручную в Web UI.

Promptsv1 · v2 · experiment
×
ProvidersOpenAI · Claude · Ollama · HTTP
×
Testsреальные inputs
→
Assertions + metricsPASS/FAIL · score · cost · latency
01Повторяемость

Один dataset можно гонять после каждой смены prompt/model.

02Сравнение

Одинаковые кейсы показывают разницу между providers, а не ощущения от пары ручных чатов.

03Автоматический PASS/FAIL

Regex, JSON schema, custom code, similarity и model-graded assertions.

04Security testing

Red-team режим генерирует adversarial cases для вашего приложения.

Почему ручной чат быстро перестаёт работать как тест

LLM недетерминирована, а значит «проверил один раз» — слабая гарантия

Ручная проверка 10 сообщений в Web UI
  • кейсы выбираются случайно;
  • результаты трудно повторить;
  • сложно сравнить старую и новую версию;
  • ошибка может появиться только на редком input;
  • регрессия обнаруживается пользователем.
Promptfoo Versioned eval dataset
  • фиксированные test cases;
  • одинаковые assertions;
  • несколько providers;
  • thresholds и metrics;
  • CI не пропускает известную регрессию.
Eval dataset становится частью продукта.

Каждый обнаруженный production failure полезно превращать в новый test case, чтобы эта же ошибка не вернулась после следующего изменения.

Current runtime requirement

Установка 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-приложением.

Для production/CI фиксируйте version.

npx promptfoo@latest удобен для знакомства, но reproducible eval лучше выполнять на одной pinned версии.

Минимальный promptfooconfig.yaml

Два 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.

Assertions

Не каждый тест LLM должен оценивать другая LLM

equals / containsДетерминированные проверки

Для обязательных строк и exact values.

is-jsonФормат

Проверить, что output вообще валидный JSON.

regexСтруктура текста

ID, формат ответа, обязательный pattern.

javascript / pythonBusiness rule

Своя функция проверки.

similarSemantic similarity

Embedding-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
Сначала используйте deterministic assertions, потом LLM judge.

Проверить 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
Model bake-off

Один 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 возвращает эти данные.

QualityPass rate / score

Сколько реальных кейсов прошло заданные критерии.

LatencyВремя ответа

Важное отличие для interactive agent.

CostСтоимость eval/production request

Нужна для выбора модели по экономике.

ReliabilityПовторные runs

Можно искать нестабильность, а не только среднее качество.

Не превращайте один общий score в «абсолютный рейтинг моделей».

Результат справедлив только для конкретного dataset, prompts, параметров и критериев вашего приложения.

LLM-as-a-judge

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.

LLM judge тоже является моделью и может ошибаться.

Хороший eval комбинирует deterministic assertions, human spot-check и model-based grading. Не используйте одну rubric-модель как единственный арбитр критической системы.

Не только prompt → completion

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.

Adversarial testing

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
Prompt injectionСледует ли agent вредной инструкции из внешнего текста

Особенно важно для RAG/browser systems.

PIIРаскрывает ли чувствительные данные

Проверка privacy boundary.

AuthorizationМожно ли вызвать действие без нужного права

Критично для agents с tools.

HallucinationПридумывает ли system факты

Полезно для knowledge/RAG application.

Red-team generation по умолчанию не всегда полностью локальна.

Если нет подходящего 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
AI regression tests

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.

Для CI полезнее quality gate, чем красивый dashboard.

Сначала определите минимальный pass rate/critical cases, которые должны блокировать merge.

Почему агент провалил конкретный test

Свежая линия Promptfoo умеет работать с external traces

Release 0.122.1 добавил улучшения tracing и загрузку external traces из Grafana Tempo, Braintrust и Langfuse. Это полезно для agent tests: final answer может быть плохим из-за retrieval, неправильного tool call или промежуточного model step.

Final outputЧто увидел пользователь

Основной PASS/FAIL.

TraceКак system пришла к ответу

Model spans, tools, retrieval и timings.

AI может управлять самими evals

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.

Не отдавайте MCP-процессу лишние credentials.

Если Promptfoo MCP запускается из coding-agent, он наследует environment процесса. Давайте ему только те provider keys, которые реально нужны для eval.

Local by default ≠ всё всегда остаётся на ПК

Нужно различать local runner, model provider, sharing и hosted red-team features

Обычный eval Results хранятся локально по умолчанию

Viewer работает с локальной eval database/artifacts.

Cloud model Prompt уходит выбранному provider

OpenAI/Anthropic/etc получают request, потому что именно они выполняют inference.

Share Snapshot загружается явно

Может включать prompts, vars, outputs, traces, metadata и provider config fields.

Red team Generation/grading может быть hosted

Зависит от 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 или клиентские данные.

Сам runner намеренно permissive

Чужой promptfooconfig нужно воспринимать примерно как чужой скрипт

Security policy Promptfoo прямо говорит: OSS runner работает с правами текущего пользователя и не является sandbox. Некоторые функции специально исполняют пользовательский code.

1Custom JS/Python assertions

Могут выполнять локальный code.

2Script providers

exec: запускает executable/command.

3Hooks/transforms/plugins

Тоже должны считаться доверенным code.

4Remote resources

Проверяйте, что config не подгружает неожиданный content.

5Provider secrets

Передавать через env, а не hard-code в YAML.

6Run untrusted eval in isolation

Container/VM и минимальные credentials уменьшают последствия.

Red teaming цели не делает сам Promptfoo sandbox.

Если вы скачали чужой repository с custom provider/assertion и запустили promptfoo eval, исполняемый код может иметь те же права, что ваш пользователь.

На момент проверки GitHub Security page основного repository не показывает опубликованных security advisories. Это не означает отсутствие bugs; security policy определяет модель доверия и канал private disclosure.

Где Promptfoo находится в нашем AI-стеке

DSPy оптимизирует, Langfuse наблюдает, Promptfoo проверяет

ИнструментГлавная задачаКогда использовать
PromptfooOffline evals, regression и red teamingДо merge/release и при model/prompt comparison
DSPyАвтоматическая optimization LM-programПодбирать instructions/demos по metric
LangfuseProduction observability и evalsСледить за реальными traces/users/cost
Pydantic AIAgent runtimeСтроить сам Python-agent и tools

Эти слои хорошо комбинируются: Promptfoo хранит regression dataset, DSPy может оптимизировать prompt/program, Promptfoo снова проверяет результат, а Langfuse показывает поведение после deployment.

Ограничения

Плохой dataset невозможно исправить красивым eval framework

01Garbage in — garbage out

Нереалистичные test cases дают ложную уверенность.

02Judge bias

LLM grader может предпочитать определённый стиль/model family.

03Cloud eval стоит денег

Матрица models × prompts × tests быстро умножает requests.

04Red team не доказывает безопасность

Он находит часть проблем, а не сертифицирует отсутствие всех уязвимостей.

05Нужны повторные runs

Один pass не гарантирует стабильность недетерминированной модели.

06Thresholds нужно калибровать

Слишком низкие ничего не ловят, слишком высокие блокируют нормальные изменения.

Начните с 20–50 реальных критических кейсов, а не с тысячи синтетических.

Небольшой dataset из настоящих production failures обычно полезнее огромного набора вопросов, которые пользователи никогда не задают.

Практические сценарии

Где Promptfoo особенно полезен

01Смена модели

Сравнить новый provider со старым на реальных задачах.

02Prompt regression

Проверить, не сломали ли новый system prompt уже работающие кейсы.

03Local LLM bake-off

Qwen/Gemma/другие Ollama models на одном dataset.

04RAG quality

Проверить factuality, context relevance и grounded answers.

05Agent security

Prompt injection, authorization и dangerous tool behavior.

06CI quality gate

Не выпускать версию, которая проваливает критические AI-тесты.

Первоисточники

Promptfoo 0.123.1: evals, Ollama, red team, privacy и security model

Материал проверен 21 сентября 2026 года.

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.

FAQ

Частые вопросы про 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.

LLM quality engineering

Поменяли модель или prompt — и хотите понять, действительно ли система стала лучше?

Соберите небольшой dataset из реальных запросов, добавьте deterministic assertions и quality rubric, затем прогоните старую и новую версию одинаковыми тестами.