Как я собрала AI-helpdesk поверх GLPI и Яндекс Мессенджера, когда в компании вообще не было системы поддержки

Когда компания небольшая, отсутствие helpdesk-системы почти не ощущается. Все писали мне напрямую, что-то решалось в мессенджере, что-то в личке, что-то на словах. Пока людей мало, это даже кажется удобным: быстро, без формальностей, “по-человечески”.

Как я собрала AI-helpdesk поверх GLPI и Яндекс Мессенджера, когда в компании вообще не было системы поддержки

Но со временем такой подход начал мешать. Команда выросла примерно до 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:

  1. принять сообщение;
  2. спросить ИИ, что делать;
  3. отправить ответ.

По факту получилось намного больше:

  • маршрутизация;
  • проверки;
  • хранение состояния;
  • несколько ИИ-ролей;
  • RAG по базе знаний;
  • внешний сервис для медиа;
  • работа с тикетами в GLPI;
  • защита от дублей;
  • суммаризация;
  • ограничения, чтобы система не зацикливалась и не сжигала бюджет.

Главный вывод из этой части простой: AI-система в реальном процессе почти всегда сложнее, чем кажется на этапе идеи.

Что я вынесла из проекта

Для меня это был не просто проект “внедрить helpdesk”.

Здесь сошлись сразу несколько направлений:

  • backend-разработка;
  • интеграции;
  • AI orchestration;
  • проектирование состояния;
  • автоматизация процессов;
  • техническое управление внутренним инструментом.

Такие проекты хорошо показывают, что ценность не в том, чтобы “прикрутить ИИ”. Ценность в том, чтобы понять процесс, найти правильные точки автоматизации и собрать систему, которая будет работать стабильно.

Важно разделять:

  • где нужна вероятностная логика;
  • где достаточно обычного кода;
  • где ИИ действительно помогает;
  • где он только усложняет поддержку.

Вывод

После этого проекта я стала осторожнее относиться к идее “давайте внедрим ИИ во всё”.

Сначала стоит разобрать процесс:

  • где реально узкие места;
  • какие решения должны быть детерминированными;
  • что можно автоматизировать обычным кодом;
  • где ИИ даёт заметный выигрыш;
  • сколько это будет стоить;
  • как это поддерживать.

Во многих местах обычная логика будет лучше LLM: дешевле, прозрачнее, стабильнее.

ИИ хорошо подходит для:

  • классификации;
  • работы с неструктурированным вводом;
  • поиска по базе знаний;
  • генерации аккуратных ответов;
  • анализа изображений.

Но если сделать LLM “мозгом всего процесса”, есть риск получить дорогую и нестабильную систему, которую сложно отлаживать.

Что дальше

Сейчас я продолжаю развивать этот helpdesk:

  • улучшаю базу знаний;
  • дорабатываю сценарии обработки обращений;
  • добавляю ограничения и проверки;
  • готовлю систему к расширению команды;
  • постепенно превращаю её из внутренней сборки “на себе” в полноценный ИТ-инструмент.

Больше всего в этом проекте мне понравилось, что он не про абстрактный AI ради AI. Он про конкретную боль внутри компании, которую удалось закрыть инженерным способом: где-то кодом, где-то интеграциями, где-то ИИ, а где-то обычной дисциплиной в процессах.

33