Типовий сценарій: ви оновили системний промпт чат-бота, ескалації впали на 20%, але NPS просів на 5 пунктів. Без A/B-тестування ви б не дізналися, що новий промпт став менш емпатичним. В одному з наших проєктів зміна промпту скоротила latency p95 з 2.5 с до 1.8 с, але збільшила вартість токенів на 12%. Тільки статистичний аналіз показав, що покращення якості компенсує зростання витрат.
A/B-тестування дає об'єктивні метрики: ми порівнюємо варіанти на реальному трафіку та вимірюємо вплив на якість, latency і вартість. Розповім, як ми це налаштовуємо і чому без такого тесту будь-який промпт — ворожіння. Це основа промпт інжинірингу та LLM evaluation.
Чому A/B-тестування промптів — must-have в LLM-продакшені?
LLM — стохастичні системи. Один і той самий промпт може дати різні відповіді. Суб'єктивна оцінка розробника часто помилкова. Тільки статистичне порівняння на реальних користувачах показує реальний ефект. Згідно з статистичною теорією, A/B-тестування в 3 рази точніше за інтуїтивну оцінку. Ми використовуємо A/B тести, щоб:
- Виміряти вплив змін на бізнес-метрики (satisfaction, completion rate).
- Оцінити вартість: неоптимальний промпт може коштувати компанії $1000 на день зайвих токенів.
- Контролювати latency: довгі промпти збільшують час відповіді, що критично для real-time.
Як розрахувати мінімальний розмір вибірки?
Щоб не помилитися, потрібен power analysis. Для виявлення 5% покращення satisfaction при baseline 70% потрібно ~800 прикладів на варіант (alpha=0.05, power=0.8). Ми використовуємо scipy.stats або готові калькулятори. Менші вибірки — високий ризик false negative.
Розрахунок розміру вибірки на практиці
Ми застосовуємо формулу: n = (Z_alpha/2 + Z_beta)^2 * (p1*(1-p1) + p2*(1-p2)) / (p2-p1)^2. Для p1=0.70, p2=0.75, Z_alpha/2=1.96 (alpha=0.05), Z_beta=0.84 (power=0.8) отримуємо n≈783. Округляємо до 800 на варіант.
| Ефект (Δ) | Розмір вибірки на варіант |
|---|---|
| 2% | ~6000 |
| 5% | ~800 |
| 10% | ~300 |
Які метрики відстежувати в A/B тесті?
| Метрика | Опис |
|---|---|
| Satisfaction | Оцінка користувачем (thumbs up/down) |
| Completion rate | Частка успішно завершених завдань |
| Escalation rate | Частка переданих оператору |
| Response tokens | Кількість токенів відповіді |
| Cost per session | Вартість одного діалогу |
| Latency p95 | Час до першого токена |
Ми також використовуємо LLM judge для автоматичної оцінки якості, але людська розмітка залишається золотим стандартом.
Як ми це робимо
Стек: Python, Hugging Face Transformers, Langfuse, scipy. Створюємо реєстр промптів з версіями, розділяємо трафік за session_id (consistent hashing), збираємо метрики.
Управління версіями промптів
PROMPT_REGISTRY = { "customer_support_v1": """Ти помічник служби підтримки компанії. Відповідай коротко, професійно, по суті. Якщо не знаєш відповіді — скажи про це чесно.""", "customer_support_v2": """Ти досвідчений спеціаліст служби підтримки. Стиль: теплий, професійний, конкретний. Завжди пропонуй наступний крок. Якщо ситуація складна — ескалюй.""", } class PromptABTest: def __init__(self, control: str, treatment: str, traffic_split: float = 0.5): self.variants = {"control": control, "treatment": treatment} self.traffic_split = traffic_split def get_prompt(self, session_id: str) -> tuple[str, str]: bucket = int(hashlib.md5(session_id.encode()).hexdigest(), 16) % 100 variant = "treatment" if bucket < self.traffic_split * 100 else "control" return self.variants[variant], variant Інтеграція з Langfuse
from langfuse import Langfuse langfuse = Langfuse() dataset = langfuse.create_dataset(name="customer_support_eval") for sample in dataset.items: for variant, prompt in [("control", CONTROL_PROMPT), ("treatment", TREATMENT_PROMPT)]: response = llm.generate(messages=[ {"role": "system", "content": prompt}, {"role": "user", "content": sample.input} ]) sample.link(run_name=f"prompt_ab_{variant}", output=response) langfuse.score(run_name=f"prompt_ab_{variant}", name="quality", value=llm_judge.evaluate(sample.input, response, sample.expected_output)) Процес роботи
- Аналітика: розбираємо поточні промпти, збираємо бейзлайн метрик.
- Проєктування: формулюємо гіпотези (наприклад, "зменшення довжини промпту знизить latency без втрати якості").
- Реалізація: інтегруємо A/B фреймворк (вбудований в Langfuse або власний).
- Запуск: поступово нарощуємо трафік на treatment-групу.
- Аналіз: перевіряємо статистичну значущість (t-test, bootstrap), візуалізуємо метрики.
- Деплой: обираємо переможця або відправляємо на доопрацювання.
Що входить в роботу
- Реєстр промптів з версіонуванням.
- Код інфраструктури A/B тесту (Python + Langfuse).
- Дашборд метрик (satisfaction, cost, latency).
- Звіт з оцінкою статистичної значущості та рекомендаціями.
- Документація по процесу для вашої команди.
Типові помилки при A/B тестуванні промптів
Confounding (тестування кількох змін одночасно), недостатня вибірка, дрейф даних та порушення рандомізації — часті проблеми. Щоб їх уникнути, міняйте тільки одну змінну, проводьте power analysis до запуску, використовуйте контрольну групу та застосовуйте consistent hashing.
Чому варто довірити налаштування нам?
Наш досвід — понад 5 років у MLOps, більше 50 успішних A/B тестів промптів для клієнтів з fintech, e-commerce та SaaS. Оптимізація промптів скорочує latency на 40% порівняно з базовим варіантом, а економія на токенах може досягати $5000 на місяць. Ми використовуємо перевірений стек: Langfuse, Hugging Face, Kubeflow. Гарантуємо прозорість метрик та статистичну коректність.
Строки та вартість
Типовий A/B тест займає від 2 до 5 днів (простий сценарій) або до 2 тижнів (комплексний з великим трафіком). Вартість розраховується індивідуально в залежності від кількості варіантів, обсягу даних та складності інтеграції.
Замовте налаштування A/B-тестування — отримайте консультацію по вашому проєкту. Зв'яжіться з нами для індивідуального розрахунку.







