Каскад Jev → LLM: маршрутизация по уверенности, чтобы платить за LLM только в сложных случаях
Большинство решений в продукте простые, и платить за каждое по тарифу LLM незачем. Каскад отдаёт основной поток дешёвой и быстрой Jev, а дорогую модель зовёт только там, где Jev сомневается. Разбираем схемы каскада, выбор порогов, экономику и код.
Как работает каскад
У ответа Jev две оси. Сам ответ говорит, что делать, а уверенность — стоит ли действовать. Каскад использует вторую ось как переключатель: первую ступень занимает дешёвая и быстрая Jev, вторую — дорогой ресурс, который включается только для сомнительных случаев. В руководстве TypeSafe так и сказано: неуверенные случаи отдавайте человеку или более дорогой рассуждающей модели.
Каскад окупается, если уверенность действительно отделяет лёгкие случаи от трудных. TypeSafe проверила это в кукбуке о классификации годовых отчётов компаний (форма 10-K) по 75 отраслевым группам, модель jev-1.12:
| Документы | Верных ответов |
|---|---|
| Уверенность 0,9 и выше, 30 шт. | 27 из 30 |
| Уверенность ниже 0,9, 30 шт. | 12 из 30 |
Выборка маленькая, но картина показательная: где модель уверена, она ошибается редко, а большинство ошибок собрано в низкой зоне. Туда и стоит направить дорогую модель.
Три схемы каскада
| Схема | Первая ступень | Роль Jev | Вторая ступень |
|---|---|---|---|
| Jev решает, LLM страхует | Jev | Принимает решение | LLM или человек |
| LLM генерирует, Jev проверяет | Дешёвая LLM | Проверяет результат | Сильная рассуждающая модель |
| Jev выбирает модель | Jev | Маршрутизатор | LLM нужного уровня |
Jev решает, LLM страхует. Подходит для классификации, маршрутизации и модерации — везде, где ответ выбирается из конечного списка. Jev обрабатывает поток, LLM получает только то, что ниже порога. Вторая ступень не обязана быть дорогой: в том же кукбуке неуверенный ответ возвращали на уровень выше — не отраслевую группу, а раздел классификатора. Доля полезных ответов в неуверенной половине выросла с 40 до 70%, и без единого дополнительного вызова.
LLM генерирует, Jev проверяет. Подходит для текста и извлечения данных — того, чего Jev сама не делает. В кукбуке SDE cascade дешёвая gpt-5.4-mini извлекает поля, а Jev отвечает на узкие Noul-вопросы по каждому полю — например, «значение отсутствует в исходном тексте?». Если хоть один сигнал выше 0,7, запись переделывает gpt-5.5 с высоким уровнем рассуждений. В разобранном примере мини-модель выдумала поле, которое прошло проверку JSON-схемы, а Jev оценила вероятность ошибки в нём в 0,95.
Jev выбирает модель. В карте сценариев TypeSafe описан собственный роутер: Jev оценивает тему, сложность и риск запроса и решает, какая LLM его получит. Подробнее — в статье о маршрутизации моделей.
Как выбрать пороги
Базовую процедуру — разметить выборку и посчитать точность по диапазонам уверенности — мы разобрали в статье об уверенности Jev. Для каскада важны ещё четыре правила.
Порог зависит от цены ошибки. В примере TypeSafe с голосовым банком общий минимум — 0,6: ниже него любой запрос уходит оператору. Баланс показывается уже при 0,6, потому что худший исход — пользователь услышит сумму, о которой не спрашивал. Перевод подтверждается автоматически только выше 0,85, а в промежутке система переспрашивает клиента.
У средней зоны своё действие. Три зоны работают лучше двух: уверенно — действуем, средне — переспрашиваем пользователя или просим LLM подтвердить, низко — отдаём человеку или LLM целиком.
Для Noul нужны два порога. У Noul нет отдельного confidence: само число — вероятность «да». В документации пример с границами 0,8 и 0,2, всё между ними уходит на проверку. Порог, подобранный для Noul, нельзя переносить на Choice — TypeSafe прямо предупреждает, что это разные величины.
Сигналы проверки объединяйте через максимум. В схеме с проверкой TypeSafe формулирует каждый вопрос так, чтобы «да» означало «что-то не так», и эскалирует, если сработал любой сигнал. Среднее по полям размывает одну уверенную ошибку до незаметной величины.
Экономика каскада
Стоимость одного решения считается так:
цена = цена_Jev + p × цена_LLM
где p — доля запросов, ушедших на вторую ступень. Jev стоит $0,042 за миллион входных токенов, выходные бесплатны. Запрос на 1000 токенов плюс около 280 служебных (по данным Polza.AI) обходится примерно в $0,000054. По сравнению с любой LLM это почти ноль, поэтому экономию определяет доля p.
Условный пример, цифры для иллюстрации: 100 000 запросов в месяц, один вызов LLM стоит $0,01.
| Схема | Вызовов LLM | Расход в месяц |
|---|---|---|
| Только LLM | 100 000 | $1000 |
| Каскад, p = 40% | 40 000 | ≈ $405 |
| Каскад, p = 20% | 20 000 | ≈ $205 |
| Каскад, p = 10% | 10 000 | ≈ $105 |
Jev в каждой строке каскада добавляет около $5. Отсюда несколько выводов:
- расход почти линейно зависит от
p: вдвое меньше эскалаций — почти вдвое меньше счёт, но снижатьpможно, только пока в автоматической зоне не растёт доля ошибок; - по задержке каскад тоже выигрывает: ответ Jev приходит за 70–500 мс, и большинство запросов не ждёт генерации LLM вовсе;
- эскалированным запросам Jev добавляет свою задержку, но в демо умного дома TypeSafe называет её пренебрежимо малой на фоне ответа LLM.
По внутренним данным TypeSafe для схемы с проверкой (100 заданий на извлечение данных), каскад при разных порогах давал лучшее сочетание цены и качества, чем любая модель по отдельности. Компания описывает это как большую часть качества топовой модели за долю её стоимости; оговорка — это исторический срез, и стоимость на графике не пересчитана по текущей цене Jev. Свои цифры подставьте в калькулятор стоимости.
Код: минимальный каскад
Классификация обращений: Jev выбирает отдел, при средней уверенности LLM выбирает из двух лидеров, при низкой — разбирает обращение целиком или отдаёт человеку.
from typesafe_sdk import Choice, TypeSafeClient
JEV_MODEL = "jev-1.13.0" # версия, под которую подбирали пороги
AUTO, FLOOR = 0.8, 0.5 # подберите на своих данных
DEPARTMENT = Choice(
instructions="Какой отдел должен ответить на обращение?",
criteria={
"billing": "Оплата, возвраты, счета",
"tech": "Ошибки, сбои, настройка",
"sales": "Тарифы, покупка, скидки",
"other": None,
},
)
client = TypeSafeClient(model=JEV_MODEL)
def route(ticket: str) -> str:
r = client.system_one(state=ticket, questions={"department": DEPARTMENT})
ans = r.choices["department"]
log_decision(ticket, r.model, ans.choice, ans.confidence, ans.probabilities)
if ans.confidence >= AUTO:
return ans.choice # ступень 1: решила Jev
if ans.confidence >= FLOOR:
top2 = sorted(ans.probabilities, key=ans.probabilities.get, reverse=True)[:2]
return llm_pick(ticket, options=top2) # ступень 2: LLM выбирает из двух
return llm_or_human(ticket) # ступень 3: полный разбор
Два приёма из этого кода стоит взять себе. Первый — передавать LLM не весь список, а двух лидеров из probabilities: задача дорогой модели становится уже, а промпт короче. Второй — логировать версию модели, ответ, уверенность и итоговое решение. Из этих логов потом пересчитывают пороги.
Что отслеживать после запуска
- Долю эскалаций. Она напрямую задаёт счёт за LLM. Резкий рост — сигнал, что изменился входной поток.
- Точность в автоматической зоне. Регулярно проверяйте выборку решений, которые Jev приняла сама.
- Согласие LLM с лидером Jev. Если в средней зоне LLM почти всегда выбирает тот же вариант, что и Jev, порог
AUTOможно осторожно снизить. - Версию модели. Поле
modelв ответе показывает, какая версия ответила. Алиасjev-latestпереезжает на новые релизы, поэтому TypeSafe советует для откалиброванных порогов указывать конкретную версию. - Язык. По данным TypeSafe, лучше всего Jev работает с английским, на других языках точность может быть ниже. Для русскоязычного потока подбирайте пороги на русских данных.
Типичные ошибки
- один порог на все действия, независимо от цены ошибки;
- чтение
confidenceкак вероятности правильного ответа; - каскад без логов — пороги потом не на чем пересчитать;
- вторая ступень получает задачу с нуля, хотя Jev уже сузила выбор.
Если каскад начинается с определения намерения пользователя, совместите его с маршрутизацией по намерениям, а если вопросов несколько — с паттерном fan-out.
Частые вопросы
Кому отдавать случаи с низкой уверенностью Jev — LLM или человеку?
Зависит от цены ошибки. TypeSafe предлагает отдавать неуверенные случаи человеку или более дорогой рассуждающей модели. Для необратимых действий надёжнее человек или подтверждение пользователя.
Какую долю запросов каскад отправит в LLM?
Универсальной цифры нет, она зависит от данных и порогов. В одном из кукбуков TypeSafe порог 0,9 разделил 60 документов ровно пополам. Долю эскалаций нужно измерить на своём потоке.
Зачем фиксировать версию Jev в каскаде?
Алиас jev-latest переезжает на новые релизы, и ответы за ним могут измениться. TypeSafe советует указывать версию, под которую подбирались пороги, и переходить на новую по своему графику.
Источники
- TypeSafe Docs — Confidence-gated routing
- TypeSafe Docs — Confidence
- TypeSafe Cookbook — SDE cascade
- TypeSafe Cookbook — Classification using confidence
- TypeSafe Docs — How to build with TypeSafe
- TypeSafe Docs — Example use cases
- TypeSafe Docs — Noul
- TypeSafe Docs — Jev 1.13 jaggedness
- TypeSafe Docs — Models
- TypeSafe Docs — Smart home assistant demo