Как спроектировать резервные варианты LLM, не нарушая контракты на задержку, стоимость или выходные данные
Практическая архитектура резервной маршрутизации LLM, которая отделяет повторные попытки от резервных, классифицирует ошибки поставщика, защищает контракты структурированного вывода, контролирует затраты и предоставляет командам достаточно телеметрии, чтобы доказать повышение надежности.
Резервный вариант – это не просто список резервных моделей. Для групп разработчиков, использующих нескольких поставщиков LLM, резервная политика — это политика маршрутизации, которая решает, когда запрос может перейти от одного поставщика или модели к другому, что должно оставаться неизменным и как система доказывает, что альтернативный путь делает приложение более надежным.
Проблема читателя обычно проста: уменьшить количество неудачных запросов и уменьшить задержку хвоста без незаметного изменения качества вывода, достоверности схемы, поведения безопасности или стоимости. Решение более конкретное, чем «попробуйте другого провайдера». Надежная запасная стратегия LLM требует классификации ошибок, сроков выполнения запросов, правил совместимости моделей, ограничений затрат, автоматических выключателей и наблюдаемости на уровне поставщика и маршрута.
Начинайте с резервной политики, не повторяйте код
Повторные попытки и резервный вариант решают различные проблемы. При повторной попытке того же поставщика требуется выполнить тот же запрос после временного сбоя. Вместо этого резервный вариант запрашивает другую модель, поставщика, регион или маршрут для завершения работы. Совмещение этих проблем создает системы, о которых трудно рассуждать во время инцидентов.
Факт: Рекомендации по надежности от поставщиков облачной инфраструктуры обычно рекомендуют ограниченную экспоненциальную задержку, джиттер, максимальные пределы повторов, проверки идемпотентности и избежание повторных попыток на нескольких уровнях, поскольку штормы повторных попыток могут усугубить перегрузку. Основные поставщики LLM также документируют временные ошибки, ограничения скорости, реакции на перегрузку, тайм-ауты и поведение SDK повторов.
Рекомендация: реализуйте один уровень повтора для каждого пути запроса. Если шлюз приложений повторяет попытку, нижестоящие службы не должны также повторять попытку независимо, если только право собственности на повторную попытку не указано явно. Каждая повторная попытка должна занимать один и тот же крайний срок вызывающего абонента, а не создавать новый открытый тайм-аут.
Минимальная политика должна отвечать на следующие вопросы до написания любого кода:
- Какие сбои допускают повторную попытку у одного и того же поставщика?
- Какие сбои допускают возврат к другому поставщику или модели?
- Какие сбои никогда не должны вызываться резервный вариант?
- Какой выходной контракт должен оставаться идентичным?
- Каково максимально допустимое увеличение стоимости?
- Какая часть срока запроса может быть потрачена до того, как резервный вариант будет запрещен?
- Какая телеметрия доказывает, помог ли резервный вариант или скрыл дефект?
Классификация ошибок перед обходом Их
Резервный вариант опасен, когда каждый ответ non-200 обрабатывается одинаково. Тайм-аут поставщика — это не то же самое, что неверный запрос. Ограничение скорости — это не то же самое, что отказ по безопасности.Сбой проверки вывода — это не то же самое, что сбой сети.
Практическая классификация должна включать как минимум следующие классы:
- Ошибка повторной передачи: сброс соединения, проблема DNS, временный сбой сети или тайм-аут шлюза.
- Перегрузка поставщика: документированная перегрузка или временный процесс на стороне сервера. сбой.
- Ограничение скорости: запрос, токен, ускорение или ограничение скорости квоты, особенно если указано значение повтора-после.
- Тайм-аут поставщика: поставщик принял запрос, но не завершил его в течение своего окна обслуживания.
- Недействительно запрос: неверная полезная нагрузка, неподдерживаемый параметр, недопустимая схема или несовместимый с моделью параметр.
- Ошибка аутентификации или конфигурации: неверный ключ, отключенная учетная запись, отсутствие прав или исчерпанная квота на уровне учетной записи.
- Отказ или блокировка безопасности: поставщик намеренно отклоняет или блокирует контент по соображениям безопасности policy.
- Ошибка проверки вывода: модель ответила, но ответ не удовлетворяет контракту приложения.
Рекомендация: повторяйте попытки только при временных сбоях в пределах бюджета задержки вызывающей стороны. Разрешите откат только для тех классов ошибок, которые явно одобрены командами продукта и платформы. Не прибегайте к ошибкам аутентификации, неверным запросам, ошибкам детерминированной схемы или отказам безопасности, если продукт не определяет конкретное альтернативное безопасное поведение.
Это различие важно, поскольку в противном случае откат может скрыть ошибки. Если схема недействительна для основного поставщика и игнорируется резервным поставщиком, система может выглядеть более работоспособной, возвращая менее ограниченные выходные данные. Это не надежность; это дрейф контракта.
Используйте сроки, а не только таймауты
Проблемы с задержкой хвоста часто возникают из-за повторных попыток, которые технически ограничены, но практически слишком медленны. Запрос с 15-секундным бюджетом, ориентированным на пользователя, не должен тратить 14 секунд на основной маршрут, а затем запускать полную резервную попытку, которая не может быть завершена вовремя.
Используйте крайний срок запроса, проходящий через весь стек. Каждое решение о маршрутизации должно проверять оставшееся время, прежде чем оно повторит попытку или откажется. Например:
request_deadline_ms = 6000
primary_attempt_timeout_ms = 3500
retry_backoff_budget_ms = 500
minimum_fallback_budget_ms = 1800
if remaining_deadline_ms < minimum_fallback_budget_ms:
return controlled_failure
Точные цифры зависят от рабочей нагрузки. Маршрут завершения чата может зарезервировать достаточно времени для одной альтернативной модели. Задание фонового извлечения может допускать несколько попыток. Путь автозаполнения в реальном времени может предпочесть быстрый сбой поздним запасным ответом.
Рекомендация: определяйте бюджеты задержки по классу маршрута, а не глобально. Маршрут пользовательского интерфейса с малой задержкой, маршрут пакетной классификации и маршрут длительного контекстного анализа не должны использовать один и тот же конверт повтора и резервного варианта.
Определение классов модели по рабочей нагрузке
Имена поставщиков — плохая абстракция для резервного варианта. Приложение заботится о свойствах рабочей нагрузки: длине контекста, глубине рассуждений, поддержке инструментов, поведении структурированного вывода, задержке, ограничениях обработки данных и стоимости.Вокруг этих свойств должны быть организованы резервные маршруты.
Полезные классы модели включают в себя:
- Быстрый черновик: короткие ответы, низкая задержка, умеренный допуск по качеству.
- Структурированное извлечение: строгий вывод JSON, проверка схемы, низкий допуск по формату дрейф.
- Обоснование: многоэтапный анализ, более высокие требования к качеству, более высокая приемлемая задержка.
- Длинный контекст: большие документы, окна с большим количеством токенов, тщательные правила усечения.
- Бюджетная пакетная обработка: оптимизированы асинхронные или несрочные задания. для юнит-экономики.
- Эскалация премиум-класса: дорогие, но функциональные модели, используемые только в том случае, если это разрешено политикой.
Для каждого класса укажите разрешенные основные модели, разрешенные резервные модели и запрещенные пути перехода на более раннюю версию. Запрос с длинным контекстом не должен возвращаться к модели с коротким контекстом, которая автоматически усекает приглашение. Задача структурированного извлечения не должна возвращаться к модели, которая не может удовлетворить ограничения схемы. Задача рассуждения премиум-класса может допускать возврат к другой модели премиум-класса, но не к быстрому черновому варианту модели, если только пользовательский опыт явно не поддерживает ухудшенный ответ.
Для команд, создающих корпоративный LLM API, эти классы должны находиться в данных конфигурации или политики, а не разбросаны по службам приложений. Это позволяет контролировать поведение маршрутизации и упрощает его изменение во время инцидентов с поставщиками.
Защита контрактов структурированного вывода
Откат структурированного вывода — одно из самых простых мест для создания незаметных производственных ошибок. Поставщики различаются по тому, как они поддерживают режим JSON, схему JSON, вызовы инструментов, поля отказа, обратную связь по безопасности, причины завершения и подмножества схем. Схема, которая работает с одной моделью, не гарантирует переносимости на другую.
Факт: В документации некоторых поставщиков описывается строгое соблюдение схемы для поддерживаемых моделей, тогда как в другой документации отмечается поддержка только подмножества схемы JSON. Ответы поставщика также могут включать поля отказа, обратную связь с подсказкой, рейтинги безопасности, причины завершения или отсутствие кандидатов, если подсказка заблокирована или недействительна.
Рекомендация: рассматривайте проверку выходных данных как часть маршрута, а не как необязательную проблему вызывающего абонента. Шлюз должен проверить окончательный ответ, прежде чем вернуть его приложению. Если проверка не удалась, маршрут должен классифицировать ошибку и решить, разрешена ли попытка возврата.
Существует два работоспособных шаблона:
Использовать подмножество переносимой схемы
Сохраняйте схемы на пересечении функций, поддерживаемых утвержденными резервными поставщиками. Это улучшает мобильность и снижает сложность эксплуатации. Компромисс заключается в том, что вы можете потерять более широкие ограничения, специфичные для поставщика.
Используйте адаптеры схемы, специфичные для поставщика
Поддерживайте адаптеры, которые преобразуют контракт приложения в формат схемы, поддерживаемый каждым поставщиком. Это сохраняет возможности, но увеличивает нагрузку на тестирование и обслуживание.Также требуется матрица совместимости, чтобы инженеры знали, какие маршруты можно безопасно откатить.
Базовая запись совместимости может выглядеть так:
{
"route": "invoice_extraction_v3",
"contract": "invoice_json_schema_v3",
"primary": "provider_a.structured_model",
"fallbacks": ["provider_b.extraction_model"],
"disallowed": ["provider_c.fast_model"],
"requires": ["json_schema", "enum", "required_fields"],
"validation": "strict_before_return"
}
Рекомендация: никогда не возвращайте резервные выходные данные только потому, что это правильно сформированный текст. Возвращайте его только после того, как он удовлетворяет тому же контракту уровня приложения, который ожидается от основного маршрута.
Контролируйте стоимость до возникновения инцидентов
Резервный вариант часто переключает трафик на более дорогие модели именно в тот момент, когда трафик увеличивается или производительность провайдера ухудшается. Без контроля затрат механизм надежности может стать причиной расходов.
Установите резервные правила, которые включают в себя:
- Максимальный множитель резервной цены на маршрут.
- Допустимые уровни модели по организации, рабочему пространству или среде.
- Ежедневные или почасовые резервные расходы Budgets.
- Отдельная политика для интерактивных и пакетных рабочих нагрузок.
- Правила, определяющие, может ли резервный вариант пересекать границы поставщика, региона или семейства моделей.
Рекомендация: измеряйте стоимость успешного ответа, а не только необработанную стоимость запроса. Более дорогой резервный вариант может быть оправдан, если он предотвращает видимый пользователем сбой на критическом маршруте. Тот же запасной вариант может быть неприемлем для пакетной работы с низким приоритетом.
Политика затрат также должна быть видна организациям, использующим платформу. Команды могут захотеть разрешить премиум-резервный вариант для рабочих процессов поддержки клиентов в рабочей среде, но заблокировать его для разработки, тестирования или внутреннего экспериментирования. Это решение управления, а не просто решение о маршрутизации.
Добавьте автоматические выключатели для каждого поставщика, модели, региона и класса ошибки
Простой резервный вариант может нанести ущерб устаревшему поставщику. Каждый неудачный основной запрос запускает еще одну основную попытку, затем еще одну резервную попытку, в то время как другие службы делают то же самое. Автоматические выключатели уменьшают повторяющееся давление и делают поведение маршрутизации более предсказуемым.
Автоматический выключатель должен быть достаточно конкретным, чтобы избежать чрезмерной реакции. Не помечайте весь поставщик как неработоспособный, потому что одна модель в одном регионе возвращает ошибки структурированного вывода. Отслеживайте работоспособность по поставщику, модели, региону, маршруту и классу ошибки, где это возможно.
Для многих команд достаточно простого автомата состояния автоматического выключателя:
- Закрыто: на маршрут поступает обычный трафик.
- Открыто: маршрут временно исключается после достижения пороговых значений ошибок. превышено.
- Полуоткрыто: ограниченный пробный трафик тестирует восстановление перед возобновлением полного трафика.
Пороговые значения должны учитывать объем. Десять сбоев в минуту могут быть значимыми для маршрута с небольшим объемом, но несущественными для маршрута, обрабатывающего тысячи запросов в минуту. Используйте минимальные размеры выборки, скользящие окна и фильтры по классам ошибок.
Рекомендация: автоматические выключатели не должны учитывать только HTTP отказов. Они также должны отдельно отслеживать ошибки проверки выходных данных, частоту тайм-аутов, частоту ограничения скорости, а также шаблоны отказов или блокировок. Эти классы подразумевают разные оперативные действия.
Зарегистрируйте решение о маршрутизации, а не только окончательную ошибку
Откат, который улучшает взаимодействие с пользователем, по-прежнему может затруднить диагностику инцидентов.Если в журналах отображается только последний успешный поставщик, инженеры теряют доказательства того, что основной поставщик потерпел неудачу.
Каждый запрос должен записывать:
- Исходный поставщик, модель и маршрут.
- Запасной поставщик, модель и маршрут при использовании.
- Класс ошибки, который инициировал повторную попытку или возврат к резервному варианту.
- Идентификаторы запроса поставщика при использовании доступно.
- Количество повторных попыток и продолжительность отсрочки.
- Срок, истеченный перед каждой попыткой.
- Результат проверки вывода.
- Оценочная стоимость каждой попытки и окончательная стоимость.
- Независимо от того, пришел ли окончательный ответ от основного или резервного источника.
- Организация, рабочее пространство, среда и метаданные приложений, если это разрешено политикой.
Эта телеметрия поддерживает как инженерное, так и коммерческое управление. Он также связывает резервное поведение с контролем затрат AI API, когда разные команды, продукты или клиенты имеют разные политики надежности и бюджета.
Оцените, действительно ли откат помог
Основного показателя успеха недостаточно. Резервная стратегия может увеличить конечные 200 ответов, одновременно увеличивая задержку p99, удваивая стоимость или возвращая менее достоверные структурированные выходные данные.
Измерьте как минимум эти показатели по маршруту:
- Первичный показатель успеха.
- Окончательный показатель успеха после повторной попытки и возврата.
- p50, Задержка p95 и p99 до и после перехода на резервный вариант.
- Частота вызова резервного варианта.
- Цена за успешный ответ.
- Частота ответов, действующая по контракту.
- Коэффициент отказов безопасности или блокировки со стороны поставщика.
- Сигналы регресса качества от конкретного приложения Assessment.
Прогноз: по мере того, как все больше компаний используют инфраструктуру LLM с несколькими поставщиками, резервные политики будут больше похожи на управление трафиком, а не на обработку специальных исключений.Команды будут ожидать, что политики будут контролироваться по рабочей области, среде и классу рабочей нагрузки, а журналы аудита будут объяснять, почему была выбрана модель.
Контрольный список реализации
Используйте этот контрольный список, прежде чем включать резервный вариант на рабочем маршруте:
- Определите бюджет задержки маршрута и крайний срок запроса.
- Классифицируйте ошибки поставщика на повторяемые, допустимые для резервного копирования, и классы терминалов.
- Укажите, какие сбои не должны вызывать резервный вариант.
- Составьте список утвержденных основных и резервных моделей по классу рабочей нагрузки.
- Проверьте длину контекста, поддержку инструментов, поддержку схемы и безопасное поведение для каждого резервного варианта.
- Проверьте каждый окончательный ответ на соответствие контракту приложения.
- Установите максимальное количество повторов, откат, дрожание и обработка повторных попыток.
- Настройте автоматические выключатели по поставщику, модели, региону и классу ошибок.
- Установите множители стоимости и лимиты резервных расходов.
- Зарегистрируйте идентификаторы запросов, классы ошибок, попытки, результаты проверки, задержку и стоимость.
- Просмотр задержек p95 и p99 после развертывание, а не только средняя задержка.
- Отключение поставщика тестов, ограничение скорости, недопустимая схема, отказ безопасности и сценарии сбоя проверки выходных данных.
Практический вывод
Хорошей резервной стратегией LLM является управляемая политика маршрутизации. Он отделяет повторные попытки от резервных, точно классифицирует сбои, сохраняет выходные контракты, соблюдает сроки задержки и делает затраты видимыми до того, как произойдут инциденты.
Ключевым принципом проектирования является инвариантность. Решите, что должно оставаться верным, когда трафик перемещается из основной модели в резервную: достоверность схемы, безопасное поведение, обработка контекста, поддержка инструментов, ограничения затрат и наблюдаемость. Затем разрешите резервный вариант только в том случае, если эти инварианты могут быть сохранены.
Начните с одного ценного маршрута, а не с глобального резервного переключателя. Определите классификацию ошибок, совместимые резервные модели, правила проверки, автоматические выключатели и метрики. Проведите упражнения на отказы по этому маршруту. Если окончательный показатель успеха улучшится без неприемлемой задержки p99, потери действительных по контракту ответов или увеличения затрат, расширьте политику до следующего класса рабочей нагрузки.