Задача: сделать чат бот, который будет отвечать на вопросы клиентов об оборудовании, помогать в настройке на основе данных с сайта wiki. Проблемы с которыми пришлось столкнуться - долгий ответ, галлюцинирование ИИ.
Для решения пришлось построить RAG-пайплайн(грубо говоря, данные переходят из одного ИИ(Llama 3, внутреннего) переходят в другой ИИ(внешний, GigaChat): парсинг вики, API-документации и собственных материалов, эмбеддинги через Ollama, поиск по векторной базе.
Llama переводит запрос пользователя в векторное представление, ищет ближайший вектор и берет информацию по вопросу.
После поиска происходит выгрузка этих данных в гигачат с промтом для выдачи ответа в тг на основе данных найденных в векторной базе.
Для борьбы с галлюцинациями пришлось запретить модели придумывать факты и ссылки на магазины/документацию, разрешил общие знания только при пустом контексте.
Таблицы характеристик рендерятся картинкой вместо ломающегося markdown(таблицы характеристик уже были на wiki сайте). Картинки оборудования привязаны к подзаголовкам тематик и выгружены в отдельную папку, подсоединяются к ответу, если вопрос общий(не касается технической информации) по оборудованию.
Мусорные вопросы и вопросы не по теме отклоняются в промте к GigaChat, это может расходовать токены и является слабым местом бота, но эту проблему тоже можно решить локально за счет векторного представления информации или отдельным обработчиком информации локально.
Стэк:
Kotlin
Ktor
Jsoup
Ollama, GigaChat API
Telegram Bot API
Docker
Возможно потребуется туннелирование трафика для работы в Telegram, если сервер в РФ, но на некоторых серверах работает без туннеля. У клиента свой сервер и настройки туннелирования, развертывал с Docker. На примере(в картинках) локальный запуск с логгированием.
Бот отвечает по документации конкретной модели, а не общими фразами, контекст диалога поддерживается.
При расплывчатых вопросах уточняет детали вместо шаблонного чек-листа. Присылает таблицы характеристик картинкой и ограничен по ссылкам на покупку или документацию(выдается только информация заказчика по данным вопросам, чтобы клиент не пошел покупать к конкуренту).
Самый важный момент - стоимость обслуживания бота. Llama запускается на сервере и не стоит обслуживания. Нужен только сервер, сполна достаточно 2 vCPU и 2-4 ГБ RAM(500 рублей в месяц) и GigaChat (500 запросов, если 2000 токенов в среднем будет тратиться - бесплатно, а если нужно больше то 1300 рублей за пакет 20000000 токенов, это 10000 ответов).