Почему одной классификации мало?
В первой части мы настроили классификатор, который определяет тип обращения: бага это, вопрос или задача. Но если вы просто передадите сырой ответ LLM в единый обработчик — ждите беды. LLM смешает всё в кашу: попытается починить сервер, создать тикет и дать консультацию одновременно. Итог — галлюцинации, дубликаты в Jira и злые пользователи.
Проблема в том, что инцидент требует скорости (эскалация за секунды), задача — структуры (приоритет, дедлайн, исполнитель), а консультация — знаний (поиск по базе). Это три разных мира, и их нельзя мешать в одном пайплайне. Решение — расщепить поток после классификатора на три независимые ветки внутри одного n8n workflow.
Три лика техподдержки: инциденты, задачи, консультации
Давайте определимся с терминами, чтобы не путаться:
- Инцидент — что-то сломалось прямо сейчас. Пример: «Не работает авторизация!». Критично. Нужно будить дежурного.
- Задача — плановое изменение или запрос. Пример: «Добавьте меня в группу админов». Через Jira.
- Консультация — вопрос по функционалу или инструкции. Пример: «Как сменить пароль?». Ответ даётся из базы знаний.
После классификации мы вешаем на каждое направление свой суб-воркфлоу (Sub-workflow). В n8n 2026 года это делается через Switch node, которая направляет запрос в нужную ветку.
💡 Совет: не используйте один LLM для всех трёх веток. Каждая ветка требует своего системного промпта и контекста. Лучше запустить отдельные AI-агенты с узкой специализацией — так меньше ошибок.
Ветка 1: Инциденты — огонь!
Когда классификатор вернул 'incident', workflow немедленно:
- Формирует сообщение в Mattermost (или Telegram) в канал дежурных.
- Создаёт инцидент в мониторинговой системе — например, через PagerDuty API.
- Блокирует повторные обращения по той же теме (используя Redis cache).
Вот как выглядит системный промпт для этой ветки. Обратите внимание: никаких «пожалуйста» — только факты и срочность.
Ты — AI-оператор инцидентов. Твоя задача: извлечь из сообщения пользователя краткое описание проблемы, сервис (если указан) и срочность (1-5). Ответ верни в JSON: { "summary": "...", "service": "...", "severity": 3 }. Если сервис не указан — поставь 'unknown'. Если срочность явно не указана — ставь 2 (высокая).
После парсинга ответа — вызов Sub-workflow, который отправляет POST-запрос в Mattermost Webhook. Пример конфигурации:
{
"channel": "incidents",
"text": "🚨 Инцидент от {{ $json.user }}: {{ $json.summary }}",
"attachments": [{
"color": "#ff0000",
"fields": [
{"title": "Сервис", "value": "{{ $json.service }}", "short": true},
{"title": "Срочность", "value": "{{ $json.severity }}", "short": true}
]
}]
}
Подробнее про интеграцию с Mattermost читайте в нашей статье Как за 54 дня собрать ИИ-хаб в мессенджере MAX на n8n — там детально описан процесс настройки вебхуков.
Ветка 2: Задачи — плановая рутина
Если тип обращения — 'task', мы не паникуем. Задача идёт в Jira. Но тут кроется подвох: AI должен правильно сформировать JSON для Jira API. Малейшая ошибка в полях — и тикет не создастся.
⚠️ Ошибка новичков: передавать сырой ответ LLM в Jira node. LLM может придумать несуществующие поля или забыть обязательные (project, issuetype). Всегда валидируйте ответ через Code node перед отправкой.
Вот промпт для ветки задач:
Ты — AI-помощник по Jira. Из запроса пользователя извлеки: заголовок (title), описание (description), приоритет (low/medium/high/critical), исполнителя (assignee). Ответ дай строго в JSON: { "fields": { "project": "SUP", "issuetype": "Task", "summary": "...", "description": "...", "priority": { "name": "Medium" }, "assignee": { "name": "..." } } }. Если assignee не указан — ставь null.
После получения JSON — используем Jira node (с credentials). Убедитесь, что в настройках проекта разрешено создание задач через API. В n8n 1.80+ есть встроенная поддержка Jira Data Center, так что проблем быть не должно.
Не забывайте про коллбэк: если Jira вернул ошибку, не тихо проглатывайте её, а отправляйте менеджеру уведомление. Иначе пользователь подумает, что его задачу приняли, а тикета нет.
Ветка 3: Консультации — библиотекарь с AI
Самая сложная ветка, потому что требует доступа к базе знаний. Тут на помощь приходит RAG (Retrieval-Augmented Generation). Если вы ещё не развернули векторную БД — советую прочитать Архитектура on-prem AI стека: Frigate + n8n + локальные LLM + MCP серверы.
Логика простая:
- LLM выделяет ключевые слова и переформулирует запрос в поисковый.
- Поиск по векторной БД (например, Qdrant или Pinecone).
- Отобранные чанки + промпт подаются в LLM для генерации ответа.
- Готовый ответ отправляется пользователю в тот же тред (Mattermost/Telegram).
Промпт для консультанта:
Ты — консультант техподдержки. Отвечай на вопрос пользователя, используя ТОЛЬКО информацию из приложенного контекста. Если в контексте нет ответа — скажи: «К сожалению, я не нашёл ответа. Перенаправляю запрос специалисту». Не выдумывай! После ответа добавь кнопку «Было полезно? (да/нет)».
Важный момент: кнопки обратной связи. В n8n вы можете сделать это через Mattermost interactive messages или через отдельный webhook. Собирайте статистику — это поможет дообучить классификатор и улучшить базу знаний.
Собираем всё вместе: Switch и Sub-workflow
В главном workflow у вас есть:
- Webhook (входное сообщение).
- LLM классификатор (первый вызов).
- Switch node, где по полю
typeвыбирается ветка. - Три Sub-workflow (каждый — отдельный workflow, вызванный через Execute Workflow node).
Зачем выносить в Sub-workflow? Два плюса:
- Модульность: каждую ветку можно тестировать и дебажить отдельно.
- Повторное использование: инцидентная ветка может вызываться не только из чата, но и из мониторинга (Prometheus alert).
💡 Передавайте в Sub-workflow контекст — id сообщения, пользователя, историю диалога. Это пригодится для ответов в треде. Как настроить суб-воркфлоу с контекстом — описано в статье AI-агент 3-го уровня на n8n и OpenRouter.
Как НЕ надо: типичные ошибки
За время экспериментов с такими системами я наступил на все грабли. Вот список самых болезненных:
- Один промпт для всех веток — LLM путается, начинает в ответе на «как сменить пароль?» создавать Jira-тикет. Каждая ветка — свой промпт.
- Игнорирование rate limits — Jira и Mattermost имеют лимиты API. При спаме пользователей workflow может упасть. Вставьте Throttle node.
- Отсутствие логирования — когда что-то идёт не так, вы должны видеть в Execution истории: какой был ответ классификатора, какой JSON ушёл в Jira. Используйте Execute Workflow с log-воркфлоу.
- Незакрытые потоки — пользователь задал вопрос, AI ответил, но тред остался в статусе «ожидания». Через сутки менеджеры сходят с ума. Добавьте автоматическое закрытие треда через 24 часа с пометкой «решение не найдено».
- Отсутствие обратной связи — без сбора кликов «полезно/бесполезно» вы никогда не улучшите качество. Это как работать с выключенным монитором.
Промпты, которые работают
Помимо уже приведённых промптов хочу дать общий шаблон для любой ветки. Если вы только начинаете, используйте такой формат:
Ты — {роль}. {Инструкция по задаче}. {Формат ответа}. {Ограничения}. {Пример вход -> выход}.
Пример для консультанта:
Ты — AI-консультант техподдержки. Извлеки из сообщения пользователя вопрос. Найди ответ в приложенном контексте. Если контекст пуст — ответь: «Извините, информации нет». Ответь кратко, не более 3 предложений. Пример:
Вход: "Как мне сбросить пароль?"
Контекст: "Для сброса пароля перейдите в настройки профиля, раздел Безопасность."
Выход: "Для сброса пароля откройте Настройки профиля > Безопасность. Следуйте инструкции на экране. Если возникнут вопросы — напишите в чат.
Кстати, если хотите научиться писать такие промпты профессионально и создавать целые AI-системы, советую глянуть курс AI-креатор: создаём контент с помощью нейросетей на Skillbox. Там как раз разбирают такие кейсы.
От хаоса к системе
У вас может возникнуть соблазн запихнуть всю логику в один гигантский workflow — не делайте этого. Три ветки, три суб-воркфлоу, чёткое разделение ответственности. Это не просто упрощает отладку — это спасает, когда в 3 часа ночи прод падает, и вы с телефона смотрите Execution, чтобы понять, в какой ветке проблема.
Следующий шаг после внедрения — добавлять самообучение: если пользователь ставит «не полезно», ветка консультаций должна автоматически отправлять запрос менеджеру на добавление в базу знаний. И это уже тема для третьей части.
Не откладывайте — начните с одной ветки (например, с инцидентов) и постепенно достраивайте остальные. Через неделю вы удивитесь, как раньше жили без этого.