Model routing в n8n: как отправлять каждую AI-задачу в правильную модель ¶
Обновлено: 2026-05-29
Короткий ответ ¶
Model routing в n8n — это слой принятия решения перед вызовом LLM: какую модель выбрать для конкретной задачи, с каким промптом, бюджетом, context window, timeout и fallback. Простые классификации и извлечения не должны идти в самую дорогую модель, а рискованные ответы клиенту не должны идти в дешёвую модель без проверки. Хороший router учитывает тип задачи, язык, чувствительность данных, требуемый JSON, наличие RAG, SLA по latency, бюджет и историю качества. Без routing AI workflow либо переплачивает, либо нестабильно отвечает там, где нужна точность.
Зачем routing, если можно выбрать одну модель ¶
Одна модель для всего кажется проще, но быстро создаёт проблемы. Дорогая модель на каждой email-классификации увеличивает расходы. Дешёвая модель на юридически чувствительных ответах даёт риск. Быстрая модель может не выдержать длинный RAG-контекст. Модель, которая хорошо пишет текст, может плохо держать строгий JSON. Поэтому production AI workflow должен сначала понять задачу, а уже потом выбирать model profile.
Model routing особенно полезен для:
- поддержки с разными уровнями сложности;
- AI Agent с read/write tools;
- RAG-ботов с разными типами вопросов;
- классификации лидов и писем;
- JSON extraction;
- генерации черновиков ответов;
- multilingual workflows;
- batch-задач с большим объёмом;
- платных сценариев, где нужен cost cap.
Route profile, а не просто название модели ¶
Маршрут должен выбирать не только модель, а профиль выполнения:
{
"route": "support_rag_high_confidence",
"model": "quality_long_context",
"temperature": 0.2,
"max_output_tokens": 700,
"timeout_ms": 12000,
"requires_sources": true,
"requires_json": true,
"fallback_route": "support_human_review",
"cost_budget_usd": 0.05,
"human_review_threshold": 0.72
}
Такой профиль легко тестировать, логировать и менять без переписывания всего workflow.
Сигналы для выбора модели ¶
Router может принимать решение по явным и вычисляемым сигналам.
| Сигнал | Пример | Как влияет на route |
|---|---|---|
task_type |
classify, extract, answer, draft, agent_action | основной выбор модели |
risk_level |
low, medium, high | high-risk требует quality/review |
requires_json |
true/false | нужна модель с хорошим structured output |
language |
ru, en, mixed | выбрать модель с сильным языком |
context_size |
2k, 20k, 80k tokens | длинный контекст требует long-context model |
pii_state |
raw, redacted | raw PII может требовать локальной/approved модели |
latency_sla_ms |
3000, 10000, async | быстрый маршрут или очередь |
budget_usd |
0.005, 0.05 | ограничивает дорогие модели |
retrieval_score |
0.42, 0.86 | низкий score — review/clarification |
user_plan |
free, paid, internal | влияет на бюджет и SLA |
Пример routing matrix ¶
| Задача | Модель/профиль | Почему |
|---|---|---|
| Intent classification | fast-small-json | короткий вход, простой JSON, дешево |
| PII redaction | deterministic/rules + small model fallback | безопасность важнее красивого текста |
| RAG answer с источниками | quality-rag | нужна точность, source grounding |
| Draft email оператору | balanced-writing | качество текста, но human review |
| Tool call с записью в CRM | quality-agent + approval | side effect требует контроля |
| Batch summarization | cheap-summarizer | объём важнее идеального стиля |
| High-risk legal/finance answer | no direct answer + review | route в человека, не в модель |
| JSON extraction из грязного текста | structured-json-profile | schema adherence важнее креатива |
Как собрать router в n8n ¶
Базовый pattern:
- Input trigger принимает запрос.
- Pre-classifier определяет тип задачи. Для простых случаев достаточно правил в Code node; для сложных — дешёвая модель-классификатор.
- Risk scorer оценивает PII, деньги, юридические формулировки, запись во внешние системы.
- Context estimator оценивает длину текста и RAG-потребность.
- Route decision возвращает route profile.
- Switch node отправляет execution в нужную ветку.
- Model call выполняется по выбранному профилю.
- Validation/evaluation проверяет результат.
- Fallback router выбирает запасной маршрут при ошибке.
- Route log сохраняет decision для анализа.
Простой Code node для route decision:
const task = $json.task_type;
const risk = $json.risk_level || 'low';
const requiresJson = Boolean($json.requires_json);
const contextTokens = Number($json.estimated_context_tokens || 0);
const latencySla = Number($json.latency_sla_ms || 10000);
const retrievalScore = Number($json.retrieval_score || 1);
let route = 'balanced_default';
if (risk === 'high') route = 'human_review_first';
else if (task === 'classify' && requiresJson) route = 'fast_small_json';
else if (task === 'extract' && requiresJson) route = 'structured_json';
else if (task === 'rag_answer' && retrievalScore < 0.65) route = 'clarify_or_review';
else if (task === 'rag_answer' && contextTokens > 12000) route = 'quality_long_context';
else if (task === 'draft_reply') route = 'balanced_writer';
else if (latencySla < 4000) route = 'fast_low_latency';
return [{ json: { ...$json, model_route: route } }];
Router должен уметь сказать «не вызывать AI» ¶
Хороший routing иногда выбирает не модель, а безопасную ветку:
- вернуть canned response;
- спросить уточнение;
- отправить на оператора;
- выполнить обычный API-запрос;
- остановить workflow из-за PII;
- вернуть ошибку валидации;
- взять ответ из cache.
Это особенно важно для запросов, где модель не добавляет ценности: проверка статуса заказа, поиск по ID, расчёт суммы, CRUD-операция, простая маршрутизация по фиксированным правилам.
Cost guardrails ¶
Route decision должен учитывать бюджет до вызова модели. Минимальный набор:
estimated_input_tokens;max_output_tokens;route_cost_estimate;daily_budget_remaining;user_planилиtenant_budget;fallback_cost_limit.
Если прогнозируемая стоимость выше лимита, router может:
- уменьшить context;
- сначала сделать summarization;
- выбрать cheaper model;
- перейти в async mode;
- попросить пользователя сузить запрос;
- отправить на review.
Latency routing ¶
Не все запросы должны отвечать синхронно. Для чата latency критична: 2–8 секунд. Для ночного batch-отчёта можно ждать минуты. Поэтому route profile должен различать:
sync_fast: быстрый ответ пользователю;sync_quality: ответ с допустимой задержкой;async_batch: очередь, уведомление после обработки;human_review: workflow останавливается до решения человека;degraded: короткий safe response.
Если route требует RAG по сотням документов, tool calls и JSON validation, не притворяйтесь, что это чат за 2 секунды. Лучше честно перевести в async.
Routing для RAG ¶
RAG-routing выбирает не только модель, но и стратегию retrieval:
| Условие | Route |
|---|---|
| Вопрос точный, есть product/page ID | metadata filter + small answer model |
| Вопрос широкий | broader retrieval + summarization |
| Низкий retrieval score | clarification или human review |
| Документы свежие и короткие | standard RAG |
| Документы длинные и конфликтуют | multi-step retrieval + source comparison |
| Пользователь просит действие | RAG answer не должен сам выполнять tool call |
Для RAG важно логировать не только модель, но и top_k, filters, retrieved IDs, score, index version и final cited sources.
Routing для JSON output ¶
Если downstream nodes ждут JSON, выбирайте профиль, оптимизированный под schema adherence. Route должен включать:
- JSON Schema;
- required fields;
- enum values;
- пример валидного output;
- max repair attempts;
- fallback при parser error.
Нельзя отправлять raw текст в CRM, таблицу или payment workflow без schema validation. Даже если модель «почти всегда» возвращает правильный JSON, production сломается именно на исключении.
Observability: как понять, что router работает ¶
Логируйте каждое решение:
{
"route_id": "support_rag_high_confidence",
"route_reason": ["task=rag_answer", "risk=medium", "retrieval_score=0.82"],
"model": "quality_long_context",
"fallback_route": "support_human_review",
"estimated_cost_usd": 0.024,
"actual_cost_usd": 0.021,
"latency_ms": 5320,
"validation_status": "passed",
"user_feedback": "thumbs_up"
}
Раз в неделю смотрите:
- какие routes самые дорогие;
- где чаще fallback;
- где низкие оценки пользователей;
- где high-risk ушёл не в review;
- где cheap route даёт parser errors;
- где long-context route используется без необходимости.
Тесты маршрутизации ¶
Для каждого route создайте 5–10 контрольных примеров:
- простой пример, который должен попасть в дешёвую модель;
- сложный пример, который должен попасть в quality model;
- пример с PII;
- пример с high-risk действием;
- пример с длинным контекстом;
- пример с плохим RAG score;
- пример, где AI не нужен;
- пример, где нужен human review.
Тест считается пройденным, если route decision совпал, стоимость в лимите, latency в SLA, output валиден и fallback не сработал без причины.
FAQ ¶
Router должен быть rule-based или AI-based? ¶
Начинайте с rule-based. Он дешевле, прозрачнее и проще отлаживается. AI-classifier добавляйте только там, где правила не справляются с неоднозначными запросами. Даже AI-router должен возвращать объяснимые поля, а не просто название модели.
Можно ли routing делать в одном Code node? ¶
Да, на старте. Но когда routes становятся бизнес-критичными, лучше вынести правила в таблицу, JSON-конфиг или отдельный sub-workflow, чтобы менять их без риска сломать всю логику.
Как не переплачивать за RAG? ¶
Не отправляйте весь контекст в дорогую модель. Сначала оцените вопрос, сделайте retrieval с metadata filters, ограничьте top-k, сожмите документы и только потом вызывайте quality model.
Что делать, если дешёвая модель часто ошибается? ¶
Не увеличивайте модель вслепую. Посмотрите, в чём ошибка: route misclassification, плохая schema, длинный вход, низкий язык, недостающие примеры. Иногда дешевле улучшить prompt/schema, чем всегда переходить на дорогую модель.
Нужно ли учитывать язык пользователя? ¶
Да. Для русского, английского и смешанных запросов могут быть разные модели, промпты и тестовые наборы. Язык должен быть частью route decision и логов.
Как routing связан с fallback? ¶
Routing выбирает первый путь до вызова модели. Fallback выбирает запасной путь после ошибки или плохой валидации. Но оба должны использовать общие route profiles и logging.
Можно ли route-ить по пользователю или тарифу? ¶
Да, если это честно отражено в продукте. Например, free-пользователь получает async cheap route, а paid-пользователь — faster quality route. Но high-risk безопасность не должна зависеть от тарифа.
Как понять, что routing ухудшает качество? ¶
Сравните качество route-групп: feedback, validation errors, fallback rate, human override rate, cost per success. Если cheap route экономит 30%, но вдвое чаще требует ручной правки, экономия может быть ложной.