Как я собрала AI-helpdesk поверх GLPI и Яндекс Мессенджера, когда в компании вообще не было системы поддержки
Когда компания небольшая, отсутствие helpdesk-системы почти не ощущается. Все писали мне напрямую, что-то решалось в мессенджере, что-то в личке, что-то на словах. Пока людей мало, это даже кажется удобным: быстро, без формальностей, “по-человечески”.
Но со временем такой подход начал мешать. Команда выросла примерно до 40 человек, запросов стало больше, часть задач терялась, часть дублировалась, по некоторым обращениям было сложно вспомнить контекст: кто писал, что уже пробовали, чем всё закончилось.
Нужна была нормальная система поддержки:
- с тикетами;
- историей обращений;
- базой знаний;
- понятным статусом по каждому запросу;
- и без резкого изменения привычек сотрудников.
Последний пункт был для меня важным. Я не хотела заставлять людей идти в отдельный портал, регистрироваться, выбирать категории и “правильно” оформлять заявку. В компании уже привыкли писать в Яндекс Мессенджер — значит, логичнее было оставить этот канал входа, а helpdesk спрятать под капотом.
Параллельно появилась идея: если всё равно выстраивать процесс почти с нуля, можно сразу попробовать снять с себя часть типовых задач с помощью ИИ. Не ради модного слова AI, а ради вполне практичных вещей: классификации обращений, поиска по базе знаний, ответов на повторяющиеся вопросы и анализа скриншотов.
Так начался проект внутреннего AI-helpdesk.
Почему GLPI
В качестве основы я выбрала GLPI в self-hosted-варианте.
Выбор был довольно приземлённый. Мне нужна была не просто форма для заявок, а система, которую можно развивать дальше. У GLPI есть API, а значит его можно связать с мессенджером, внешней логикой и дополнительными сервисами.
Плюс GLPI — это не только тикеты. В нём есть:
- заявки;
- пользователи;
- база знаний;
- инвентаризация;
- лицензии;
- бюджетирование;
- контрагенты.
То есть это уже основа для построения полноценных ИТ-процессов внутри компании.
Что получилось
Для сотрудника всё выглядит просто: он пишет боту в Яндекс Мессенджере, как писал бы обычному человеку.
Дальше сообщение попадает во workflow, где система определяет, что с ним делать:
- создать новый тикет;
- продолжить диалог по уже существующему;
- переключить активный тикет;
- запросить уточнение;
- поискать ответ в базе знаний;
- отправить пользователю ответ;
- зафиксировать всё в GLPI.
Снаружи это обычный бот в мессенджере. Внутри — несколько слоёв логики: часть работает по жёстким правилам, часть завязана на ИИ-компоненты.
Стек
Проект собирался на таком стеке:
- n8n — оркестрация workflow;
- GLPI API — тикеты, пользователи, категории, followups, база знаний;
- Yandex Messenger Bot API — приём и отправка сообщений;
- Redis — состояние диалога, активный тикет пользователя, idempotency по сообщениям;
- OpenAI GPT-5-mini — классификация, анализ изображений, генерация ответов, summary;
- Ollama embeddings nomic-embed-text:latest — embeddings для базы знаний;
- Qdrant — векторное хранилище;
- отдельный сервис на Node.js — обработка медиа и часть серверной логики.
Интеграция оказалась менее no-code, чем хотелось
Изначально план выглядел довольно компактно: n8n как оркестратор, GLPI API, Яндекс Мессенджер, несколько AI-нод — и можно быстро собрать первый рабочий вариант.
На практике всё оказалось менее аккуратно.
Для GLPI и Яндекс Мессенджера в n8n нет готовых встроенных нод, поэтому интеграцию пришлось делать через HTTP Request. Само по себе это нормально: настроить авторизацию, собрать запросы, обработать ответы, привести данные к нужному виду.
Но потом всплыла отдельная история с изображениями.
Проблема с картинками из Яндекс Мессенджера
Пользователи часто присылают не описание проблемы, а скриншот. Это нормально: так быстрее показать ошибку, окно приложения или странное поведение интерфейса.
Но изображения из Yandex Messenger Bot API в n8n обрабатывались не так, как нужно:
- бинарные данные приходили некорректно;
- дальше с ними было сложно работать;
- MIME-тип определялся как html, а не как изображение.
Формально бот “умеет принимать картинки”, но в реальном пайплайне файл приезжал в таком виде, что использовать его дальше было неудобно.
В итоге я вынесла работу с изображениями в отдельный сервис на Node.js. Он занимается тем, что:
- получает изображения;
- нормально обрабатывает файлы;
- передаёт их дальше в нужном формате;
- при необходимости отправляет изображения обратно пользователю.
Это был один из первых моментов, где стало понятно: полностью no-code здесь не получится. Как только появляются нестандартные API, бинарные данные, MIME-типы, ретраи и нормализация, всё равно приходится писать код.
ИИ-агент — это не “одна умная нода”
Со стороны внедрение ИИ-агента часто выглядит очень просто: пользователь написал сообщение, LLM поняла задачу, система что-то сделала.
Для обычного чат-бота такой подход иногда работает. Можно описать роль, тон общения, ограничения — и получить нормального собеседника.
В моём случае нужен был не собеседник, а часть helpdesk-процесса. Система должна была:
- отличать новый запрос от продолжения старого;
- создавать тикеты;
- понимать, когда пользователь пишет по активной заявке;
- переключаться между обращениями;
- учитывать историю;
- закрывать тикеты;
- искать ответы в базе знаний;
- отвечать пользователю;
- не путать контексты;
- не создавать хаос в GLPI.
То есть это уже не “бот, который красиво отвечает текстом”, а система, влияющая на реальный внутренний процесс.
Почему я отказалась от одного большого промпта
Сначала я пошла по очевидному пути: сделать одного умного агента, который будет принимать сообщение и решать, что делать дальше.
Довольно быстро начались проблемы:
- промпт разрастался;
- правил становилось всё больше;
- контекст тяжелел;
- вызовы дорожали по токенам;
- поведение становилось менее предсказуемым;
- любое изменение могло ломать соседний сценарий.
В какой-то момент стало понятно, что один универсальный агент — плохая основа для такой системы. Он слишком дорогой, слишком хрупкий и его сложно поддерживать.
Поэтому я разложила задачу на несколько специализированных ИИ-компонентов.
Как я разделила ИИ-логику
Вместо одного “главного мозга” появились отдельные роли.
1. Classifier
Он определяет тип входящего сообщения.
Например:
- это новый запрос или продолжение старого;
- нужно ли создавать тикет;
- это просьба о помощи или уточнение;
- есть ли признаки, что пользователь хочет сменить контекст;
- относится ли сообщение к активной заявке.
2. Summarizer
Он делает краткое summary по комментариям тикета.
Это нужно, чтобы не отправлять в модель всю историю переписки каждый раз. Summary помогает сохранить смысл, но не раздувать контекст и стоимость вызовов.
3. RAG Agent для нового обращения
Этот агент работает, когда пользователь приходит с новой проблемой.
Он:
- помогает классифицировать запрос;
- ищет релевантные материалы в базе знаний;
- формирует ответ;
- при необходимости инициирует создание тикета.
4. RAG Agent для существующего тикета
Отдельный агент работает с активными обращениями.
Там другая логика: уже есть история, статус тикета, предыдущие комментарии, возможные уточнения. Важно не принять продолжение старой проблемы за новую заявку и не смешать разные обращения.
5. Image Recognizer
Этот компонент анализирует изображения:
- скриншоты ошибок;
- окна приложений;
- интерфейсы;
- сообщения об ошибках;
- другие визуальные артефакты, которые пользователи присылают вместо описания.
Часть логики лучше писать кодом, а не отдавать LLM
Когда начинаешь собирать систему с ИИ, есть соблазн передать модели всё: классификацию, маршрутизацию, валидацию, работу с состояниями, выбор сценария.
Но это не всегда хорошая идея.
Со временем я начала выносить часть логики из ИИ в обычный код. Причины простые:
- так дешевле;
- быстрее;
- надёжнее;
- поведение проще отлаживать;
- меньше неожиданных решений со стороны модели.
Например, через код лучше делать:
- хранение активного тикета пользователя;
- защиту от дублей сообщений;
- маршрутизацию по известным сценариям;
- лимиты на количество попыток поиска по базе знаний;
- технические проверки состояния диалога.
ИИ полезен там, где нужна интерпретация: понять плохо сформулированный запрос, классифицировать сообщение, обработать скриншот, собрать ответ по базе знаний. Но если задачу можно решить правилом, чаще всего лучше решить её правилом.
Redis оказался не “деталью”, а важной частью системы
Отдельная большая тема — состояние.
В Redis я храню:
- активный тикет пользователя;
- контекст диалога;
- idempotency по сообщениям.
На бумаге это выглядит как техническая мелочь. В реальности без этого helpdesk-бот быстро начинает вести себя странно.
Что может пойти не так:
- пользователь отправил одно и то же сообщение два раза;
- вебхук пришёл повторно;
- человек переключился с одной проблемы на другую;
- бот продолжил не тот тикет;
- сообщение без контекста попало не туда.
Если не хранить состояние и не защищаться от дублей, система начинает создавать лишние тикеты, путать обращения и ломать доверие пользователей.
База знаний стала отдельным слоем, а не приложением к боту
Я не хотела, чтобы бот просто отвечал “из головы”. Для внутреннего helpdesk это плохой вариант: ответы должны опираться на реальные инструкции компании.
Поэтому я собрала RAG-контур:
- материалы базы знаний;
- embeddings через Ollama nomic-embed-text:latest;
- хранение в Qdrant;
- поиск релевантных фрагментов;
- передача найденного контекста агенту.
Это даёт несколько преимуществ:
- ответы становятся более предметными;
- бот использует внутренние инструкции;
- снижается риск галлюцинаций;
- база знаний постепенно становится центральной точкой накопления опыта.
Без нормализации данных система разваливается
Это не самая эффектная часть проекта, но одна из самых важных.
Пользовательские сообщения приходят в очень разном виде:
- нормальный текст;
- короткая фраза без контекста;
- картинка без описания;
- продолжение старого диалога;
- новый вопрос в той же переписке;
- ответ “да”, “не помогло”, “а вот так?” без пояснений.
Перед тем как отдавать это ИИ, нужно привести данные к нормальному виду:
- входящие сообщения;
- метаданные;
- идентификаторы пользователей;
- вложения;
- активный тикет;
- историю взаимодействий.
Если этого не делать, модель получает шумный ввод и начинает принимать нестабильные решения.
Промпт-инжиниринг в реальном процессе сильно отличается от демо
Отдельно пришлось долго настраивать поведение агентов.
Мне было важно, чтобы бот:
- не задавал один и тот же вопрос по кругу;
- не мучил пользователя бесконечными уточнениями;
- не заменял действие вежливыми длинными ответами;
- не запускал поиск по базе знаний без необходимости;
- не тратил лимиты на повторяющиеся вызовы;
- не создавал лишние тикеты;
- не терял контекст.
В демо всё обычно выглядит аккуратно: пользователь написал понятный запрос, агент красиво ответил.
В проде всё иначе:
- сообщения неполные;
- контекст плавает;
- формулировки странные;
- вложения приходят не всегда корректно;
- история длинная;
- интеграции иногда ведут себя нестабильно;
- стоимость вызовов имеет значение;
- ошибка бота влияет уже не на презентацию, а на реальную работу людей.
Как проект выглядел сначала и во что превратился
В начале это казалось простым workflow:
- принять сообщение;
- спросить ИИ, что делать;
- отправить ответ.
По факту получилось намного больше:
- маршрутизация;
- проверки;
- хранение состояния;
- несколько ИИ-ролей;
- RAG по базе знаний;
- внешний сервис для медиа;
- работа с тикетами в GLPI;
- защита от дублей;
- суммаризация;
- ограничения, чтобы система не зацикливалась и не сжигала бюджет.
Главный вывод из этой части простой: AI-система в реальном процессе почти всегда сложнее, чем кажется на этапе идеи.
Что я вынесла из проекта
Для меня это был не просто проект “внедрить helpdesk”.
Здесь сошлись сразу несколько направлений:
- backend-разработка;
- интеграции;
- AI orchestration;
- проектирование состояния;
- автоматизация процессов;
- техническое управление внутренним инструментом.
Такие проекты хорошо показывают, что ценность не в том, чтобы “прикрутить ИИ”. Ценность в том, чтобы понять процесс, найти правильные точки автоматизации и собрать систему, которая будет работать стабильно.
Важно разделять:
- где нужна вероятностная логика;
- где достаточно обычного кода;
- где ИИ действительно помогает;
- где он только усложняет поддержку.
Вывод
После этого проекта я стала осторожнее относиться к идее “давайте внедрим ИИ во всё”.
Сначала стоит разобрать процесс:
- где реально узкие места;
- какие решения должны быть детерминированными;
- что можно автоматизировать обычным кодом;
- где ИИ даёт заметный выигрыш;
- сколько это будет стоить;
- как это поддерживать.
Во многих местах обычная логика будет лучше LLM: дешевле, прозрачнее, стабильнее.
ИИ хорошо подходит для:
- классификации;
- работы с неструктурированным вводом;
- поиска по базе знаний;
- генерации аккуратных ответов;
- анализа изображений.
Но если сделать LLM “мозгом всего процесса”, есть риск получить дорогую и нестабильную систему, которую сложно отлаживать.
Что дальше
Сейчас я продолжаю развивать этот helpdesk:
- улучшаю базу знаний;
- дорабатываю сценарии обработки обращений;
- добавляю ограничения и проверки;
- готовлю систему к расширению команды;
- постепенно превращаю её из внутренней сборки “на себе” в полноценный ИТ-инструмент.
Больше всего в этом проекте мне понравилось, что он не про абстрактный AI ради AI. Он про конкретную боль внутри компании, которую удалось закрыть инженерным способом: где-то кодом, где-то интеграциями, где-то ИИ, а где-то обычной дисциплиной в процессах.