Новые маршруты цифровой эволюции
Заказать проект✦
Социальные проекты

Добродон — ИИ-помощник для волонтёров

Помощник сайта отвечает на вопросы о волонтёрстве, а команда клиента обновляет базу знаний в таблице без разработчиков.

2Входные точки: /api/chat с лимитом 10 запросов в минуту с одного IP и /webhook для совместимости с работающим виджетом сайта.
10 минИнтервал автообновления базы знаний из таблицы на Яндекс.Диске без участия разработчиков.
50Порог нечёткого поиска rapidfuzz WRatio. Без уверенного совпадения GigaChat отвечает из общих знаний в рамках заданной темы.

Контекст и задача

У сайта добронадону.рф — ресурса о волонтёрстве в Ростовской области и платформе Добро.рф — уже был фронтенд-виджет чата, отправлявший сообщения на эндпоинт /webhook. Отвечать на типовые вопросы посетителей (как стать волонтёром, что такое Добро.рф, куда обращаться) вручную или только статьями на сайте было неудобно: вопросы повторялись, а держать ответы актуальными нужно было отдельно от кода сайта.

Задача Routeam — дать сайту ИИ-помощника, который отвечает на вопросы о волонтёрстве живым языком, использует базу знаний, которую ведёт сама команда клиента, и не отвечает на вопросы за пределами темы волонтёрства и Ростовской области.

Исследование

Базу знаний решили не превращать в отдельную БД или векторное хранилище — сложность разметки и поддержки RAG-инфраструктуры не оправдана для задачи уровня FAQ. Вместо этого ответы ведут в таблице (категория, заголовок, вопрос, ответ, ссылка, ключевые слова) на Яндекс.Диске по публичной ссылке — так контент-команда клиента правит её в привычном табличном виде, без участия разработчиков.

Для поиска ответа внутри таблицы выбрали нечёткое сопоставление текста (rapidfuzz) по объединённому полю «вопрос + ключевые слова + заголовок + категория» с пороговым значением уверенности — это проще embedding-поиска и достаточно точно для ограниченного набора тематических вопросов.

Чтобы бот не отвечал на посторонние темы, добавили лёгкий тематический фильтр по ключевым словам (волонтёрство, Добро.рф, Ростовская область и т.п.) перед обращением к LLM; приветствия пропускаются отдельным списком, чтобы бот мог поздороваться и сразу пояснить свою тематику.

В качестве LLM выбрали GigaChat, а ответы модели жёстко ограничили системным промптом: простой текст без Markdown-разметки, тема строго волонтёрство/Добро.рф/Ростовская область, вежливый отказ и возврат к теме при посторонних вопросах.

Решение

Собрали backend на FastAPI с двумя входными точками: новым /api/chat (лимит 10 запросов в минуту на IP через slowapi) и прежним /webhook — его оставили, чтобы не трогать уже работающий виджет на сайте. CORS ограничен доменом сайта клиента.

Логика ответа одинакова для обоих эндпоинтов. Сообщение пользователя проверяется на тематическую релевантность — с учётом истории диалога: если хотя бы одно из прошлых сообщений пользователя было по теме, текущий запрос тоже считается релевантным. Если вопрос точно не по теме, бот вежливо отвечает, что помогает только с волонтёрством, не обращаясь к LLM. Если по теме — сервис базы знаний ищет наиболее похожий вопрос в загруженной таблице; при уверенном совпадении найденная запись (категория, заголовок, вопрос, ответ, ссылка) передаётся в GigaChat как контекст, и модель формулирует живой ответ на её основе. Если совпадения нет, GigaChat отвечает из общих знаний, но всё ещё в рамках темы, заданной системным промптом. В ответе может быть ссылка на материал-источник.

Бот поддерживает историю диалога, которую присылает фронтенд (роль и текст предыдущих сообщений), — это позволяет учитывать контекст при ответе на уточняющие вопросы.

База знаний загружается при старте приложения и обновляется фоновой задачей каждые 10 минут — изменения в таблице на Яндекс.Диске подхватываются без перезапуска и без деплоя. Токен GigaChat (OAuth2) кешируется и обновляется автоматически по истечении срока действия. Ошибки валидации, превышения лимита запросов и сбоя обращения к GigaChat перехватываются глобальными хендлерами и возвращаются пользователю понятным сообщением на русском языке вместо технической ошибки.

Приложение упаковано в Docker и разворачивается через единый шаблон CI/CD компании — отдельные пайплайны для веток dev и master, выкладка на сервер через SSH и docker-compose.

Технологии

Python, FastAPI, Uvicorn, httpx, Pydantic. Нечёткий поиск — rapidfuzz, разбор таблицы знаний — pandas и openpyxl, ограничение нагрузки — slowapi, логирование — loguru. LLM — GigaChat (Сбер), база знаний — таблица на Яндекс.Диске, фронтенд — виджет на сайте добронадону.рф (Bitrix). Docker, GitLab CI/CD, единые deploy-шаблоны компании.

PythonFastAPIUvicornhttpxPydanticrapidfuzzpandasopenpyxlslowapiloguruGigaChatЯндекс.ДискBitrixDockerGitLab CI/CD

Результат

Посетители сайта получают мгновенный ответ на вопросы о волонтёрстве и платформе Добро.рф, не углубляясь в поиск по разделам сайта. Бот остаётся вежливым и в рамках темы даже при посторонних вопросах, что снижает репутационные риски.

Контент-команда клиента сама пополняет и правит базу знаний в привычной таблице — изменения применяются автоматически в течение 10 минут, без участия разработчиков и без деплоя.

Решение устойчиво к всплескам обращений (лимит запросов на IP) и к единичным сбоям — пользователь видит понятное сообщение, а не падение виджета. Старый виджет сайта продолжил работать благодаря сохранённой обратной совместимости с /webhook.

Решение развёрнуто в продуктивной среде клиента.