На демо новая модель написала лучший ответ, и команда решила мигрировать. На русских договорах она действительно была сильнее. В production выяснилось, что p95 latency вырос вдвое, structured output иногда не проходил схему, а нужный регион обработки данных отсутствовал.
Выбор начинается с workload
Соберите репрезентативный набор запросов, включая длинные, грязные и опасные случаи. До теста задайте gates: качество по классам риска, schema validity, p95 latency, цена успешного результата, rate limits, регион, retention, SLA и условия использования данных.
use_case: invoice_extraction
hard_gates:
schema_validity: 0.995
critical_field_accuracy: 0.99
p95_latency_ms: 8000
data_region: eu
score_weights:
quality: 0.55
cost_per_success: 0.25
latency: 0.20def eligible(run, gates):
return all(run.metrics[name] >= value for name, value in gates.minimums.items()) \
and run.p95_ms <= gates.p95_msТест запускают несколько раз: вариативность тоже свойство модели. Цена считается с retries и routing. Затем проводят shadow или canary на реальном распределении. Провайдерская переносимость означает не общий знаменатель всех API, а собственный контракт use case и адаптеры, которые сохраняют различия.
Failure modes
Публичный benchmark не совпадает с задачей. Средняя accuracy скрывает провал редкого дорогого класса. Бесплатный тариф меняет рейтинг. Судья-модель предпочитает ответы своего семейства. Миграция меняет tokenizer и разрушает бюджет контекста. Поэтому исходные ответы сохраняют и часть выборки оценивают вслепую люди.
Правило: выбирайте минимальную модель и провайдера, которые проходят заранее записанные gates на вашем workload. Победитель меняется без переписывания веры команды.
Практикум 56.1
Сравните две модели на 100 примерах одного use case. До запуска зафиксируйте gates и веса. Сделайте минимум три прогона, посчитайте разброс, p95 и цену валидного результата. Проведите слепое сравнение двадцати пар и оформите decision record с датой следующего пересмотра.