Налаштування A/B-тестування AI-промптів

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Налаштування A/B-тестування AI-промптів
Простий
від 1 дня до 3 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1285
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1121
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    858

Налаштування A/B тестування промптів

Prompt A/B тестування - порівняння двох варіантів системного промпту на реальному трафіку для вимірювання впливу змін на якість, latency та вартість відповідей.

Управління версіями промптів

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]:
        # Consistent assignment по session_id
        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

Метрики для оцінки промптів

Для кожного варіанта відстежуємо: user satisfaction (thumbs up/down, рейтинг), task completion rate, escalation rate, response length, latency, вартість.

def evaluate_prompt_variant(variant_responses: list[PromptResponse]) -> VariantMetrics:
    return VariantMetrics(
        n=len(variant_responses),
        avg_satisfaction=np.mean([r.satisfaction_score for r in variant_responses if r.satisfaction_score]),
        completion_rate=np.mean([r.task_completed for r in variant_responses]),
        escalation_rate=np.mean([r.escalated for r in variant_responses]),
        avg_response_tokens=np.mean([r.completion_tokens for r in variant_responses]),
        avg_cost_usd=np.mean([r.cost_usd for r in variant_responses]),
    )

Інтеграція з 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))

Статистична значимість

Мінімальний розмір вибірки залежить від очікуваного ефекту. Для виявлення 5% поліпшення satisfaction при baseline 70% - потрібно ~800 прикладів варіант (alpha=0.05, power=0.8). Використовуємо scipy.stats.power_analysis чи спеціалізовані A/B калькулятори.