Promptfoo — open-source инструмент для A/B тестирования и оценки качества промптов. В poreklame.tech используется для сравнения качества ответов LLM на разных версиях промптов (EN vs RU, 11 шагов пайплайна «Продуктовый подход»).
Ключевые возможности:
| Параметр | Значение |
|---|---|
| URL | https://ab.poreklame.tech |
| Сервер | Server 2 (83.136.232.5) |
| Контейнер | promptfoo (Docker, image: ghcr.io/promptfoo/promptfoo:latest) |
| Порт | 15500 (хост) → 3000 (контейнер) |
| Nginx | /etc/nginx/sites-enabled/ab.poreklame.tech — reverse proxy с basic auth |
| Данные | /home/promptfoo/.promptfoo/ (volume mount) |
| БД | SQLite (promptfoo.db) |
# Запуск с конфигом в директории eval
ssh server2
docker exec -e DEEPSEEK_API_KEY=$DEEPSEEK_KEY \
-w /home/promptfoo/.promptfoo/eval \
promptfoo promptfoo eval
# Запуск конкретного конфига
docker exec -e DEEPSEEK_API_KEY=$DEEPSEEK_KEY \
-w /home/promptfoo/.promptfoo/eval \
promptfoo promptfoo eval -c promptfooconfig.yaml
# Просмотр результатов в вебе
# (веб-интерфейс уже запущен на порту 3000 контейнера)
# API promptfoo доступен через reverse proxy
# GET список eval'ов
curl -u user:pass https://ab.poreklame.tech/api/results
# GET конкретный результат
curl -u user:pass https://ab.poreklame.tech/api/results/<eval_id>
Basic auth настроен через nginx (/etc/nginx/auth/ab.htpasswd):
| Пользователь | Роль |
|---|---|
| roman | DevOps Lead |
| yuri | CPO |
| egor | Prompt Engineer |
| alexander | CTO |
| mila | CMO |
Для добавления нового пользователя:
htpasswd /etc/nginx/auth/ab.htpasswd <username>
nginx -t && systemctl reload nginx
promptfooconfig.yaml)description: "Описание теста"
# Промпты для тестирования
prompts:
- id: test-prompt-1
label: 'My Prompt v1'
raw: file://prompts_data/my_prompt.md
# Провайдеры (LLM)
providers:
- id: openai:chat:deepseek-chat
config:
apiBaseUrl: https://api.deepseek.com/v1
apiKeyEnvar: DEEPSEEK_API_KEY
temperature: 0.0
max_tokens: 4096
# Тесты и assertion'ы
defaultTest:
assert:
- type: contains
value: "ожидаемая строка"
- type: llm-rubric
value: |
Критерии оценки...
Return JSON: {"pass": true/false, "score": 0-N, "reason": "..."}
# Выходной файл
outputPath: ./results/my-results.json
Assertion'ы добавляются в секцию defaultTest.assert:
type: contains) — проверка наличия секцийtype: javascript, value: file://scripts/...) — программная проверкаВсе assertion-ы лежат в /home/promptfoo/.promptfoo/eval/ внутри контейнера.
| Ресурс | Путь (в контейнере) |
|---|---|
| Основной конфиг | /home/promptfoo/.promptfoo/eval/promptfooconfig.yaml |
| Промпты (EN/RU) | /home/promptfoo/.promptfoo/eval/prompts_data/ |
| Assertion-скрипты | /home/promptfoo/.promptfoo/eval/scripts/ |
| Рубрики (LLM-rubric) | /home/promptfoo/.promptfoo/eval/rubrics/ |
| Результаты | /home/promptfoo/.promptfoo/eval/results/ |
| База данных | /home/promptfoo/.promptfoo/promptfoo.db |
| Кэш | /home/promptfoo/.promptfoo/cache/ |