Всем привет!
Меня зовут Азрет, я - CTO в AAA (читается как "трипл-эй"). Мы разрабатываем LLM приложения для бизнеса. Решаем разнообразные задачи - оптимизация внутренних процессов за счет ИИ, маркетинговые исследования и запуск новых продуктов. Но запрос на бота, про которого я хочу рассказать, внезапно пришел от фаундера нашего агенства.
Ситуация понятна - я подписан на кучу телеграм каналов, я не успеваю их читать, мне от этого неприятно, я испытываю FOMO. А я бы хотел не пропустить ничего важного, тратить как можно меньше времени и иметь все в одном месте.
Из этого запроса появилась идея саммари бота. Я столкнулся с множеством интересных задач, пока работал над ним, и подумал, что будет полезно, если я поделюсь решениями.
В этой обзорной статье - детали архитектуры и стека. Кому интересно - прошу под кат.
В чём сложность?
С ядром приложения все понятно - это LLM.
Ответы от GigaСhat и YandexGPT меня не устроили, конфигурация сервера для LLAMA стоит дороже, поэтому я остановился на API ChatGPT. Из неудобств - нужно настраивать прокси, но вот уже 2й год как ни для кого из нас это не является проблемой.
Основная же сложность была в получении сообщений из каналов.
Допустим, у нас есть бот, в которого пользователь скидывает канал, из которого он хочет получать саммари. Что бот должен сделать дальше?
Чтобы бот мог прочитать сообщения, его нужно добавить в канал. Сам он добавиться не может. Ещё бот не может прочитать сообщения, которые были получены до его добавления в канал.
Ковыряя эту ситуацию, я пришел к выводу, что тут не обойтись без человека.
Человека-бота.
Бота, который управляет человеческим аккаунтом.
Про Telegram API и Telegram Bot API
Telegram Bot API - это часть Telegram API.
Telegram API - это полное апи телеграмма. С его помощью можно создавать собственных клиентов телеграмма.
Библиотеки на python - Telethon, pyrogram.
Telegram Bot API - это апи для взаимодействия с ботами. С его помощью можно создавать ботов. Наиболее популярные python реализации - aiogram, pyTelegramBotAPI, python-telegram-bot.
Архитектура
У меня получилась такая схема:
Клиентский бот - с которым взаимодействует пользователь. Он принимает каналы и выдает саммари.
Бот на кастомном ТГ - который под человеческим аккаунтом заходит на указанные каналы, подписывается и мониторит сообщения.
Обертка над LLM моделью - принимает на вход сообщения и выдает саммари.
Хранилище сообщений - для оригиналов и саммари текста.
Платежный сервер - на него ловим вебхкуки от платежной системы.
Брокер сообщений, который связывает все компоненты.
Если очень сильно упрощать, то флоу такой:
Пользователь добавляет канал в боте
Бот-аккаунт подписывается на этот канал, забирает оттуда сообщения и пересылает их в хранилище
В момент Х из хранилища в LLM отправляется запрос на создание саммари
Полученные саммари пересылаются пользователю в бота.
Конечно, есть нюансы, но о них в следующих статьях.
Стек
Все компоненты написаны на python.
Пользовательский бот написан на aiogram. В нем используются aiogram-dialog для работы с меню, APscheduler для планировщика саммари, SQLAlchemy для хранения пользовательских данных, redis для кеширования стейта
Кастомный телеграм клиент написан на Telethon. В нем дополнительно ничего нет, так как все данные хранятся в автоматически создаваемом файле сессии.
Хранилище сообщений - приложение без фреймворка. В нем так же используется SQLAlchemy.
LLM враппер - тоже приложение без фреймворка. Работает через официальную библиотеку от open ai. Хорошего промпта оказалось достаточно, использовать langchain было бы оверкилом. Клиент работает через прокси.
Платежный сервер написан на FastAPI. Буквально пара файлов и пара методов. Но чтобы завести его, пришлось повозиться с доменами, сертификатами и обратным прокси.
Брокер сообщений - NATS. Асинхронный, быстрый, с поддержкой pub-sub и request-response механик. Удобнее, чем http запросы.
Все это добро крутится на VPS сервере от Selectel под ubuntu.
Заключение
Лучше один раз увидеть
Бота можно запустить по ссылке - https://t.me/aaa_scout_bot.
Я рад, что пет-проджект оброс деталями и дошел до широкой аудитории.
В нем есть бесплатный тариф, можно спокойно потыкать, а так же есть возможность оставлять комментарии и отзывы.
Название "скаут" как предзнаменование будущих фич. Я планирую добавить фильтры, чтобы из тонны каналов пользователь мог получать только интересующие его сообщения.
Что касается следующих статей, я совершенно точно хочу рассказать про подключение платежной системы, а именно, как работает связка "бот-вебхук-платежка".
Вопросы, замечания, комментарии велком.
Спасибо.
Комментарии (16)
d-sh
10.10.2024 13:00Такое уже давно есть. В разных вариантах. Есть например бот в которого можно кидать экспортные файлы которые телеграм делает и потом задавать вопросы по всей огромной истории канала.
И ни один из них нормально не работает :(
С пересказами статей и видеороликов такая же проблема, обзорные пересказы просто бесполезны а на конкретные вопросы получить хороший ответ не получается.
nullpexx Автор
10.10.2024 13:00Да, перед началом работ было такое же мнение - такие боты есть, но они не работают нормально. Ну и пошло-поехало, свое решение.
d-sh
10.10.2024 13:00Не работают - в смысле если ты не читаешь полную версию то не станешь и сокращеную читать. Гпт не может сделать из мусора конфетку.
Homyakin
10.10.2024 13:00Не уверен, насколько это оно, но есть такой проект НЯН - https://github.com/NyanNyanovich/nyan. Он по умолчанию настроен на парсинг новостных каналов, но можно сконфигурировать любую подборку. Агрегирует одинаковые по смыслу посты с разных каналов в один со ссылками, в выжимки за промежутки он тоже умеет.
nullpexx Автор
10.10.2024 13:00Да, топ, жаль, что не наткнулся на него до начала разработки)
Планируем в скаута добавить такие же фичи: группировку по темам и фильтрацию нужных/не нужных сообщений.
vkrasikov
10.10.2024 13:00Бот на кастомном ТГ - который под человеческим аккаунтом заходит на указанные каналы, подписывается и мониторит сообщения.
Скажите, пожалуйста, как вы обходите проблему того, что человеческий бесплатный аккаунт может зайти только на 500 каналов? Или у вас пока мало пользователей?
nullpexx Автор
10.10.2024 13:00Сейчас пользователей мало, а каналы перекликаются.
Но если упремся в лимит, то можно будет завести очередной аккаунт.
Тут 2 варианта - запустить второй акк параллельно в том же процессе, или завести новый процесс с другим аккаунтом.
ED-209
Заново переизобрели RSS. Информационные потоки с разных источников в одном месте (приложении).
nullpexx Автор
Согласен, сходство есть.
ED-209
Но в целом задумка и реализация здравая, конечно. Рано или поздно кто-нибудь, да сделал. Однозначно плюс!
erley
А есть кстати такой RSS-digest сервис?
Ну чтобы туда подцеплять разные источники (обычные RSS и всякие каналы с телеги например), он там сам читает, делает выжимку и отдаёт опять же как RSS.
И читать этот RSS с того к чему кто привык.
ED-209
C RSS сейчас можно очень много всего сделать. Куча разных сервисов, ботов, вплоть до выдирания любых текстов с различных сайтов и заворачивая их в поток. Все кастомизируется, настраивается in-out и крутится-вертится как угодно.
Вот тут всеобъемлющий материал по возможностям RSS.
https://github.com/AboutRSS/ALL-about-RSS
erley
Да, у меня так и сделано, мне хотелось узнать какие digest сервисы-читалки есть чтобы выжимки делать. За ссылку спасибо, буду расширять кругозор.
alexhu
Вот выжимка из новостей - https://moscowi.ru/ - это мой вариант. Собирает новости, выбирает главное и отдаёт html. Api, rss не делал, добавление каналов не делал из за законодательства. А в общем удачно сортирует по важности (по моему скромному мнению).
Делаю и даже сделал по телеграм каналам, только никому не даю доступ, проверяю на соответствие законодательству.