У меня, как наверное, и у многих есть множество телеграм груп, довольно активных, накопивших много информации (полезной и не очень) за продолжительное время.
В той сингулярности что мы с вами сейчас живём, хочется попробовать сделать из этого что полезное.
Я какое то время использовал ботов с бекендом от lllm модели, и быстро, как мне кажется, нашупал проблему в том, как передавать контекст боту-помошнику (или имеющуему другую роль в зависимости от system prompt).
Я пробовал разные подходы:
- просто накапливал последние сообщения в кеше, и подсовывал как контекст
- пробовал ходить по цепочкам reply_to и так, поддерживать связный диалог
но у всех у них есть свои плюсы и минусы.
Захотелось, немного усложнить и попробовать добавить к боту "память" к которой он может обращаться, и загрузить в эту память все сообщения с сотворения мира.
Но проблема ограниченного контекста, остается, нужно как то фильтровать то что релевантно.
В качестве подхода, попробовал считать ембединги по тексту, складывать их в векторную базу, и затем доставать релевантные к запросу и подавать их контекстом.
То есть подход, который сейчас называется RAG: Retrieval-Augmented Generation.
Результат тут: https://github.com/korjavin/ragtgbot
Взял all-MiniLM-L6-v2 model из sentence-transformers для еmbeddings, qdrant для векторной базы, и написал
а) загрузчик из экспортируемой истории группы телеграма в базу.
Он создает батчи сообщений, считает ембединги и складывает в базу.
б) телеграм бота который
- поддерживает базу актуальной добавляя туда новые сообщения
- если его упомянуть по имени, то текст сообщения он считает запросом, забирает из базы релевантный контекст, и генерирует ответ с помощью gpt-4o-mini
Всё self-hosted, докеризировано, запускайте у себя на здоровье. Есть docker-compose файл, который запускает уже всё собранное.
Вам только нужно создать бота, взять токен, засунуть его в env, и также в env положить свой openai api key.
Я с интересом послушаю какие у вас результаты от такого подхода, и рад буду идеям и фиче реквестам.
У меня пока более интересные чем раньше, но явно есть место для улучшения по группировке сообщений.
Пользуйтесь, делитесь, буду рад если оно полезно.
В свое время делал подобный бот в Телеграме и использовал команды, чтобы запускать цепочки - таким образом решал проблему системных промптов. На тот момент использовал Make (Integromat), позже перетащил на n8n. На скрине - некоторые из команд
