AI-классификатор писем в n8n: категории, приоритет, confidence и безопасная маршрутизация ¶
Обновлено: 2026-05-29
Короткий ответ ¶
AI-классификатор писем в n8n нужен, чтобы присвоить входящему письму категорию, приоритет и дополнительные теги для маршрутизации. В отличие от полного email triage, classifier не обязан извлекать все сущности и писать ответ: он должен точно решить, куда направить письмо и насколько уверен в решении. Надёжная схема: очистка письма → taxonomy → Text Classifier или LLM JSON → confidence threshold → fallback для сомнительных писем → routing → human correction log. Главный риск — слишком много категорий и отсутствие тестового dataset.
Когда classifier лучше полного triage ¶
Classifier подходит, если вам нужно быстро разложить письма по очередям: support, sales, billing, vendor, spam, internal, legal, partnership. Это проще, дешевле и стабильнее, чем строить полноценный triage с extraction, scoring и reply generation. Если ваша боль — “письма попадают не тем людям”, начните с classifier.
Полный triage нужен позже, когда вы хотите не только направить письмо, но и извлечь order_id, создать тикет, рассчитать SLA, подготовить ответ и обновить CRM. Classifier — первый слой. Он должен быть узким и проверяемым.
Как спроектировать taxonomy ¶
Taxonomy — это список классов. Самая частая ошибка — взять все возможные темы компании и сделать 40 категорий. Модель начнёт путать близкие классы, оператор не поймёт разницу, а тестирование станет дорогим. Начните с рабочих очередей, а не с красивой онтологии.
Хорошая первая taxonomy:
| Category | Когда использовать | Кому отправлять |
|---|---|---|
sales_inquiry |
новый запрос на покупку, консультацию, демо | sales |
support_issue |
проблема с продуктом, ошибка, не работает | support |
billing_payment |
счёт, чек, оплата, возврат | finance/support |
existing_customer_request |
вопрос текущего клиента без аварии | account/support |
complaint_escalation |
жалоба, негатив, угроза оттока | senior support |
partnership |
партнёрство, интеграция, совместный проект | partnerships |
vendor_offer |
подрядчик предлагает услуги | procurement/general |
spam_or_noise |
спам, рассылка, нерелевантное | archive |
internal_forward |
внутреннее письмо/пересылка | internal |
unknown_review |
модель не уверена | manual review |
Не делайте отдельные категории “срочно”, “VIP”, “счёт с проблемой”. Это лучше теги или priority, а не primary category.
Primary category и tags ¶
Разделяйте основную категорию и теги. Primary category выбирает очередь. Tags добавляют контекст.
{
"primary_category": "support_issue",
"tags": ["urgent", "webhook", "existing_customer"],
"priority": "high",
"confidence": 0.86,
"reason": "Письмо от текущего клиента сообщает, что заявки перестали попадать в CRM после изменения webhook."
}
Если сделать multi-label без primary category, workflow не поймёт, куда отправлять письмо. Например, письмо может быть одновременно billing, complaint и existing_customer. Primary category решает действие, tags помогают внутри очереди.
Как собрать workflow ¶
- Email Trigger — получает письмо.
- Clean text — удаляет HTML, цитаты, подписи, tracking.
- Pre-rules — ловит очевидный spam, auto-replies, bounce, unsubscribe.
- Classifier — Text Classifier или LLM с JSON Schema.
- Confidence gate — проверяет уверенность.
- Priority rules — добавляет urgent/high/normal/low.
- Router — отправляет в нужную очередь.
- Label/writeback — ставит Gmail label, создаёт тикет или CRM task.
- Human correction — оператор может изменить category.
- Dataset update — сохраняет ошибку для оценки.
Pre-rules важны. Не тратьте LLM на автоответы “out of office”, bounce notifications и очевидный spam, если их можно поймать регулярками.
Prompt и JSON output ¶
Даже если вы используете Text Classifier node, полезно иметь строгий контракт результата. Если используете LLM напрямую, обязательно требуйте JSON.
{
"primary_category": "sales_inquiry | support_issue | billing_payment | existing_customer_request | complaint_escalation | partnership | vendor_offer | spam_or_noise | internal_forward | unknown_review",
"tags": ["urgent", "vip", "refund", "technical", "crm", "webhook"],
"priority": "urgent | high | normal | low",
"confidence": 0.0,
"reason": "короткое объяснение на русском"
}
В prompt укажите правила разграничения. Например: если письмо содержит жалобу и вопрос оплаты, но эмоционально негативное и требует эскалации, primary category = complaint_escalation, tag = billing_payment. Если письмо от подрядчика предлагает SEO, это vendor_offer, не sales_inquiry.
Confidence threshold ¶
Confidence нужен не для красоты, а для маршрутизации риска. Пример:
| Confidence | Действие |
|---|---|
| ≥ 0.85 | автоматическая маршрутизация |
| 0.70–0.84 | маршрутизация + пометка review optional |
| 0.55–0.69 | general inbox/manual review |
| < 0.55 | unknown_review, не выполнять действия |
Не используйте confidence как абсолютную истину. Модели могут быть уверены и ошибаться. Но threshold помогает не делать опасные автоматические действия на сомнительных письмах.
Как делать priority отдельно от category ¶
Priority должен учитывать бизнес-правила:
- текущий клиент > новый vendor;
- enterprise/VIP > free;
- production down > общий вопрос;
- payment/refund > информационный запрос;
- negative sentiment + churn words > escalation;
- дедлайн сегодня > обычный запрос.
Пример Code node:
let priority = 'normal';
const tags = new Set($json.tags || []);
if (tags.has('urgent') || tags.has('vip')) priority = 'high';
if ($json.primary_category === 'complaint_escalation') priority = 'high';
if (/не работает|лежит|потеряли|суд|претензия/i.test($json.clean_email_text || '')) priority = 'urgent';
return [{ json: { ...$json, priority } }];
Категория “support_issue” может быть normal или urgent. Не смешивайте эти измерения.
Как тестировать classifier ¶
Соберите dataset из реальных писем. Для каждого письма human label должен включать primary category, tags и priority. Удалите персональные данные или замените их токенами. Разделите набор: development cases и evaluation cases. Не тестируйте только на примерах, по которым писали prompt.
Метрики:
- overall accuracy;
- per-category precision/recall;
- confusion matrix;
- urgent recall;
- false escalation rate;
- unknown_review rate;
- manual correction rate;
- cost per 1000 emails;
- latency per email.
Особенно смотрите confusion matrix. Если sales_inquiry часто путается с partnership, возможно, categories плохо описаны. Если billing_payment путается с support_issue, добавьте правила priority/tags.
Как улучшать качество ¶
Не переписывайте prompt после каждой ошибки. Сначала классифицируйте ошибку:
| Ошибка | Исправление |
|---|---|
| Плохая очистка письма | улучшить clean text |
| Категории пересекаются | уточнить taxonomy |
| Мало примеров класса | добавить dataset |
| Модель не видит контекст клиента | добавить CRM lookup |
| Письмо реально двусмысленное | отправлять в review |
| Ошибка в priority | вынести priority в правила |
Хороший classifier улучшается через dataset и taxonomy, а не через бесконечные “будь внимательнее”.
Что логировать ¶
Сохраняйте:
- email id/thread id;
- clean text hash;
- model/prompt/schema version;
- category/tags/priority/confidence;
- route;
- human corrected category;
- time to route;
- downstream outcome;
- source mailbox.
Если оператор поменял категорию, сохраняйте both predicted and final. Это главный источник улучшений.
Типовые ошибки ¶
- Слишком много категорий. Качество падает, а поддерживать сложно.
- Нет unknown_review. Модель вынуждена выбирать неверный класс.
- Нет разделения primary category и tags. Маршрутизация становится хаотичной.
- Priority внутри prompt без правил. Модель переоценивает эмоциональные слова.
- Нет dataset. Нельзя понять, стало лучше или хуже.
- Classifier создаёт внешние ответы. Это уже triage/assistant, нужен другой контроль.