AI classification pipeline в n8n: как распределять заявки, письма и события без хаоса ¶
Обновлено: 2026-05-29
Короткий ответ ¶
AI classification pipeline нужен, когда входящий текст нужно отнести к одной или нескольким категориям: тип обращения, причина отказа, приоритет тикета, стадия лида, тема письма, риск платежа или направление маршрутизации. Надёжная классификация строится не на просьбе “определи категорию”, а на закрытом списке категорий, описаниях, примерах, negative examples, confidence, fallback и регулярных evals. Если классификатор ошибается, downstream workflow отправит тикет не той команде, поставит неправильный SLA или запустит не тот бизнес-процесс.
Где classification приносит пользу ¶
Классификация хорошо работает в операционной рутине: распределение обращений поддержки, сортировка писем, приоритизация лидов, определение intent в чат-боте, фильтрация отзывов, triage инцидентов, анализ причин churn, обработка заявок поставщиков. Главное отличие от extraction: classifier выбирает категорию, а не извлекает конкретные поля.
Примеры:
- письмо “Не могу войти, код не приходит” →
account_access; - тикет “после оплаты не пришёл чек” →
billing_receipt; - сообщение “интеграция упала после обновления” →
technical_incident; - лид “хотим автоматизировать отдел продаж” →
sales_automation; - отзыв “дорого, но удобно” → sentiment
mixed+ topicpricing.
Когда правила лучше AI ¶
Не используйте AI там, где есть точный признак. Если email отправителя billing@partner.ru, категория может быть задана правилом. Если сумма больше лимита, это rule-based priority. Если JSON event содержит event_type, не нужно классифицировать его моделью.
AI нужен, когда пользователь пишет свободно, неполно и разными словами. Часто лучший production-вариант — гибрид: сначала дешёвые правила, потом AI только для неоднозначных случаев.
| Ситуация | Подход |
|---|---|
| Есть точный event_type | Rule |
| Есть email/domain отправителя | Rule + lookup |
| Свободный текст клиента | AI classification |
| Нужно определить urgency по смыслу | AI + rules по VIP/SLA |
| Категория влияет на деньги | AI + human review |
| Категорий больше 30 | Иерархическая классификация |
Дизайн категорий ¶
Плохие категории — главная причина плохой классификации. Категории должны быть взаимно различимыми и полезными для маршрутизации. Не создавайте категории ради красоты. Если две категории ведут в один и тот же workflow, возможно, их не нужно разделять на первом этапе.
Плохой список:
- problem;
- issue;
- technical;
- other;
- user question;
- urgent.
Хороший список для поддержки:
account_access— вход, пароль, 2FA, права;billing_payment— оплата, списание, чек, возврат;integration_error— API, webhook, OAuth, credentials;how_to— вопрос по настройке без явной поломки;feature_request— пожелание функциональности;incident— массовая проблема, недоступность сервиса;spam_or_irrelevant— нерелевантные обращения;unknown— недостаточно данных.
Категория unknown обязательна. Без неё модель будет принудительно выбирать неподходящую категорию.
Описания и examples ¶
Для каждой категории нужны positive и negative examples. Особенно важны negative examples для похожих классов.
Пример спецификации:
{
"category": "billing_payment",
"description": "Оплаты, чеки, возвраты, списания, счета, тарифы и документы по платежам.",
"positive_examples": [
"Не пришел чек после оплаты",
"Списали два раза",
"Как вернуть деньги за заказ?"
],
"negative_examples": [
"Не могу войти в аккаунт после оплаты — это account_access, если проблема во входе",
"Webhook оплаты не доходит — это integration_error, если проблема техническая"
],
"default_sla": "business_hours_4h"
}
Negative examples уменьшают путаницу между billing и integration. Пользователь может писать про оплату, но реальная проблема — webhook integration.
Схема workflow в n8n ¶
Production classification workflow:
- Trigger: Email, Webhook, Chat, CRM, Telegram, Slack.
- Normalize input: clean text, language, channel, user status, attachments.
- Rule prefilter: spam, known senders, exact event_type, VIP, keywords критичных событий.
- AI classification: Text Classifier или LLM со строгим JSON output.
- Confidence scoring: модельный confidence + rule signals.
- Tie-breaker: если две категории близки, применить priority rules.
- Routing: команда, SLA, workflow, queue, tag.
- Fallback: unknown, human review, уточняющий вопрос.
- Audit log: input hash, category, confidence, model, prompt version, route.
- Feedback loop: оператор исправляет категорию, dataset обновляется.
Не отправляйте весь HTML email в classifier. Он должен видеть чистый текст, тему письма, канал и ключевые признаки.
Пример output schema ¶
{
"type": "object",
"required": ["primary_category", "confidence", "reason", "routing_key"],
"properties": {
"primary_category": {
"type": "string",
"enum": [
"account_access",
"billing_payment",
"integration_error",
"how_to",
"feature_request",
"incident",
"spam_or_irrelevant",
"unknown"
]
},
"secondary_categories": {
"type": "array",
"items": { "type": "string" }
},
"confidence": { "type": "number", "minimum": 0, "maximum": 1 },
"urgency": { "type": "string", "enum": ["low", "normal", "high", "critical"] },
"reason": { "type": "string" },
"routing_key": { "type": "string" }
}
}
reason нужен не для пользователя, а для оператора и debug. Он должен объяснять, какие признаки повлияли на классификацию.
Confidence и fallback ¶
Не все категории одинаково рискованные. Для spam_or_irrelevant можно принять lower confidence, если есть дополнительные сигналы. Для incident или billing_payment threshold должен быть выше.
Пример правил:
| Условие | Действие |
|---|---|
| confidence ≥ 0.85 | автоматический routing |
| 0.65–0.84 | routing + пометка “AI uncertain” |
| < 0.65 | human review или уточняющий вопрос |
| category = incident и confidence < 0.9 | дублировать в on-call queue |
| category = unknown | не запускать бизнес-действия |
Confidence не должен быть единственным критерием. Если пользователь VIP или сообщение содержит “данные клиентов утекли”, лучше эскалировать даже при средней уверенности.
Иерархическая классификация ¶
Если категорий много, разделите процесс на два шага. Сначала крупная группа, потом подкатегория. Например:
support,sales,billing,security,spam,unknown.- Если
support, выбратьaccount_access,integration_error,how_to,bug_report.
Так модель меньше путается, а routing становится прозрачнее. Для каждого уровня можно использовать разные thresholds и разные prompts.
Multi-label classification ¶
Иногда сообщение относится к нескольким категориям. Например: “после оплаты не сработал webhook и сделка не создалась”. Primary category может быть integration_error, secondary — billing_payment. Downstream workflow должен знать, какая категория главная.
Правило:
- primary — команда, которая должна решить проблему;
- secondary — теги, контекст и дополнительные уведомления;
- urgency — отдельное поле, не категория.
Не смешивайте urgency и category. “Срочно” может относиться к любой теме.
Ошибки classification pipeline ¶
| Ошибка | Что происходит | Как исправить |
|---|---|---|
| Нет категории unknown | модель выбирает случайный класс | добавить unknown и правила fallback |
| Категории пересекаются | billing путается с integration | negative examples и tie-breaker |
| Слишком много классов | качество падает | иерархия категорий |
| Нет feedback loop | ошибки повторяются | сохранять human corrections |
| Категория = SLA | SLA считается неверно | urgency отдельно от topic |
| Нет evals | правка prompt ломает routing | golden dataset и confusion matrix |
Evaluation: как измерять качество ¶
Для classifier недостаточно смотреть “вроде работает”. Нужны метрики:
- accuracy overall;
- precision/recall по каждой категории;
- confusion matrix;
- unknown rate;
- human override rate;
- false negative для critical/incident;
- средняя стоимость на item;
- latency per item;
- routing error rate.
Confusion matrix особенно полезна. Если billing_payment часто путается с integration_error, нужно не “добавить ещё один пример”, а пересмотреть определения категорий.
Пример eval case:
{
"case_id": "payment_webhook_failed",
"text": "Клиент оплатил, но сделка в CRM не создалась. В ЮKassa платеж успешен.",
"expected_primary_category": "integration_error",
"allowed_secondary": ["billing_payment"],
"must_not_route_to": "billing_documents"
}
Логирование ¶
Логируйте:
message_id;input_hash;clean_text_length;category_schema_version;model;prompt_version;primary_category;secondary_categories;confidence;routing_key;human_override;final_category.
Так вы сможете понять, изменилось ли качество после обновления prompt или модели.
Production checklist ¶
- [ ] Категории ведут к реальным actions.
- [ ] Есть unknown.
- [ ] Для каждой категории есть positive/negative examples.
- [ ] Urgency отделён от topic.
- [ ] Low confidence не маршрутизируется опасно.
- [ ] Есть human review для критичных классов.
- [ ] Есть eval dataset и confusion matrix.
- [ ] Есть feedback loop из правок операторов.
- [ ] Логируется final_category, а не только AI category.
- [ ] Есть versioning category schema.