Простейший ИИ-ассистент
В мире автоматизации бизнеса я часто сталкиваюсь с одной и той же проблемой. Предпринимателям, менеджерам и обычным пользователям нужны не «комбайны» с сотней настроек, а максимально простые продукты. Продукты, которые не требуют колоссальных технических знаний и с которыми пользователь может справиться самостоятельно, без вечного обращения к разработчику. В этой статье я делюсь практическим опытом создания такого инструмента - умного ассистента-помощника на базе n8n. Его задача проста: отвечать на самые частые вопросы клиентов, разгружая службу поддержки и экономя время.
Что потребуется для реализации:
Здесь я надеюсь у вас есть минимальные знания по части создания ботов и представления о том, как работает n8n. Если потребуется более подробный урок шаг за шагом – пишите.
• Сервер с установленным n8n
• Доступ к Google API — для работы с таблицей базы знаний (Google Sheets) здесь конечно нужно пободаться с Гуглом, но в принципе не сложно.
• Telegram-бот - как интерфейс общения с пользователем
• Доступ к API языковой модели — ChatGPT (OpenAI), DeepSeek API, OpenRouter (оплата зарубежными картами, либо посредников которых огромное количество на просторах рунета), в моем случае AI-RAPI (можно оплатить картой РФ).
Это будет простейший ассистент-консультант для ответов на самые популярные вопросы, с возможностью вызова оператора.
Общая архитектура workflow
Наш ассистент работает по следующей логике:
- Пользователь пишет сообщение в Telegram-бот
- Система определяет намерение пользователя (приветствие, вопрос или оффтоп)
- Если это вопрос — бот ищет ответ в Google Sheets
- Формирует ответ с помощью AI-модели, строго следуя инструкциям
- Отправляет ответ пользователю
Пошаговый разбор нод
Шаг 1. Получение сообщения от пользователя
Нода: Telegram Trigger
Это входная точка. Нода слушает входящие сообщения от Telegram-бота. Когда пользователь пишет, сюда приходят: текст сообщения, ID чата, имя, username.
Дальнейшие ноды будут использовать эти данные.
Шаг 2. Фильтрация сообщений оператора
Нода: Фильтр оператора
У нас есть два типа пользователей: обычные клиенты и оператор (администратор). Оператору бот не отвечает автоматически — он нужен для ручного управления.
Нода проверяет: если сообщение от оператора - отправляем на ветку ручной обработки. Если от обычного пользователя - идем дальше.
Без этой проверки бот начал бы отвечать на наши же служебные сообщения, что быстро сломало бы логику.
Для того, чтобы определить, что сообщение от оператора - нужно фильтровать сообщения по ID. Получаем ID в боте @userinfobot и вставляем в окно отмеченное красным прямоугольником.
Шаг 3. Определение намерения пользователя
Нода: Проверка намерения (AI-Agent)
Прежде чем что-то отвечать, нужно понять, чего хочет пользователь. Эта нода использует языковую модель, которая возвращает только одно из трех значений:
- start — приветствие, начало диалога
- faq — вопрос, запрос информации
- other — благодарности, прощание, флуд
Промт я составил так, чтобы модель строго классифицировала сообщение и не «фантазировала». Это экономит токены и ускоряет обработку.
Связанные ноды:
- AI-RAPI Chat Model — языковая модель (у меня AI-RAPI; альтернативы — ChatGPT, DeepSeek, OpenRouter)
- Simple Memory — контекст на 10 последних сообщений, чтобы классификатор понимал диалог
у языковой модели ставим температуру поменьше, чтобы не ИИ не додумывал лишнего, а работал строго по промту (можно еще ограничить вывод токенами, но я не стал).
Памяти даём контекст на последние 10 сообщений (можно и 5 в принципе). Сессионный ключ берем из первой ноды, обязательно в поле Session ID выбираем перед этим Define below.
Шаг 4. Маршрутизация по типу сообщения
Нода: Switch
По результату классификации (start / faq / other) направляем пользователя на разные ветки:
start Отправляем приветствие
faq Запускаем поиск ответа в базе знаний
other Пересылаем сообщение оператору
Шаг 5. Обработка приветствия
Нода: Отправляем приветствие
Если пользователь написал «Привет», «Здравствуйте» или что-то в этом роде, бот отвечает:
Привет! Я виртуальный помощник. Чем могу помочь? 😊
Простые вещи. Но без этого диалог часто обрывается - человек не понимает, что делать дальше. Когда бот сам предлагает помощь - количество брошенных диалогов заметно снижается.
Шаг 6. Обработка оффтопа (пересылка оператору)
Нода: Сообщение оператору
Если пользователь пишет что-то не по делу (спасибо, пока, бессмысленный набор символов), бот не пытается отвечать. Вместо этого отправляю оператору уведомление:
- ID пользователя
- Имя и username
- Текст сообщения
Оператор видит это и, если нужно, отвечает вручную, нажав «Reply» на уведомлении.
В поле Chat ID вставляем ID оператора, который мы уже использовали в шаге 2.
Шаг 7. Ручной ответ оператора (обработка reply)
Нода: Фиксируем chatID
Когда оператор отвечает на уведомление, система должна понять, кому отправлять ответ. Эта нода извлекает ID пользователя из исходного сообщения и текст ответа оператора.
Алгоритм:
- Проверяет, что сообщение является ответом (reply) на предыдущее
- Парсит ID пользователя из текста уведомления
- Возвращает объект с userChatId и replyText
Шаг 8. Отправка ручного ответа пользователю
Нода: Ответ пользователю
Получив ID пользователя и текст ответа, нода отправляет сообщение пользователю в Telegram (сообщение пользователю придет в боте от его лица)
Шаг 9. Основной поток: обработка вопроса (faq)
Если пользователь задал вопрос, попадаем на ветку faq.
Сначала — Анимация набора. Бот отправляет в Telegram сигнал «печатает». Пользователь видит три точки и понимает, что ответ готовится.
Шаг 10. Сообщение «Секундочку»
Нода: Секундочку
Перед поиском ответа отправляю временное сообщение: «Секундочку, ищу информацию ⏳».
Это снимает ощущение «зависания». Пользователь знает, что всё работает, нужно просто подождать. После получения ответа это сообщение будет удалено, чтобы не засорять диалог.
Шаг 11. Поиск ответа в базе знаний (Google Sheets)
Нода: Получаем FAQ
Подключаюсь к Google Sheets, где хранится база знаний.
Структура таблицы у меня такая:
- question — вопрос
- category — категория
- keywords — ключевые слова
- short_answer — краткий ответ
- full_answer — полный ответ
Нода забирает все строки из таблицы. Я пробовал делать поиск прямо в Sheets через запрос, но в итоге решил выгружать всё и передавать нейросети. Так проще, потому что пользователь может спросить «сколько стоит доставка?», а в таблице ответ лежит по запросу «стоимость доставки». Нейросеть сама находит соответствие.
Шаг 12. Форматирование FAQ для AI
Нода: Форматирование FAQ для AI
Google Sheets возвращает данные в «сыром» виде. Формат может быть разным — массив, объект с полем data, rows и т.д. Нода приводит всё к единому виду.
Что делает:
- Парсит входящие данные, определяя их структуру
- Преобразует каждую строку таблицы в формат:1. [категория] вопросКлючевые слова: ...Ответ: краткий ответ
- Возвращает объект с полями:userMessage — исходный вопрос пользователяchatId — ID чатаfaqText — отформатированная база знаний для промптаfaqData — оригинальные данные (на случай если понадобятся для отладки)
Шаг 13. Вторая анимация
Нода: Анимация набора1
Перед тем как обратиться к AI за финальным ответом, снова отправляю сигнал «печатает». Между «Секундочку» и готовым ответом может пройти несколько секунд (нейросети иногда думают дольше). Вторая анимация держит пользователя в курсе.
Шаг 14. Генерация ответа AI
Нода: Пишем ответ
Центральная нода. Формирует финальное сообщение.
Использует:
- Языковую модель: Температура 0.2 — чтобы ответы были предсказуемыми, без лишней креативности (OpenRouter, Deepseek, ChatGPT, AI-RAPI)
- Память: Simple Memory — контекст последних 10 сообщений.
- Промт: системный промт.
Системный промт включает:
- Роль и контекст (дружелюбный ассистент, общение на «вы»)
- Иерархию источников: сначала база знаний, потом общие знания, если не нашлось — предложить обратиться к оператору
- Стиль: 1–3 абзаца, без канцелярита, без служебных маркеров («Ответ:», «Из базы:»)
- Запреты: не выдумывать факты, не давать опасные советы
- Примеры (few-shot) — 4 диалога, чтобы модель понимала нужный тон
Ключевое: AI обязан сначала искать ответ в faqText и только если там ничего нет — использовать общие знания.
Шаг 15. Удаление временного сообщения
Нода: Delete a chat message
После того как AI сгенерировал ответ, удаляю сообщение «Секундочку». В диалоге остается только вопрос пользователя и ответ бота. Чисто и аккуратно.
Шаг 16. Отправка финального ответа
Нода: Отправляем ответ
Финальная нода. Берет сгенерированный AI-ответ и отправляет пользователю в Telegram.
Вот такой простейший, но полностью рабочий ИИ-ассистент получился.
Обратите внимание: здесь нет векторных баз данных, нет эмбеддингов, нет сложной инфраструктуры на десятки микросервисов. Только инструменты, до которых можно дотянуться рукой:
- n8n - визуальный конструктор, где логика собирается как пазл
- Google Sheets - таблица, которую заполнит даже менеджер без технического образования
- Telegram - мессенджер, который есть у каждого клиента
- API языковой модели - настройка через пару полей с ключом
Всё это настраивается без глубоких знаний программирования. Базовое понимание, что такое API, как создать бота в Telegram и как скопировать ID таблицы - этого достаточно. Остальное собирается мышкой в n8n.
Что в итоге:
Ассистент работает 24/7. Отвечает на типовые вопросы, пока сотрудники занимаются задачами, которые требуют человеческого участия. Базу знаний пополняет сам бизнес - просто добавляет строки в таблицу. Если вопрос сложный или нестандартный - бот отправляет уведомление оператору, и тот отвечает вручную.
Никаких танцев с бубном. Никакой необходимости нанимать разработчика для каждого изменения. Всё под контролем у того, кто ведет таблицу.
Блогером никогда быть не хотел и не хочу, но чтобы материалы были в одном месте я решил создать канал в тг (там пока я один, подписываться не прошу): t.me/n8n_kitchen
Шаблоны n8n и Google Sheet выложу туда.
Всем спасибо за внимание)