Всем привет!

Меня зовут Азрет, я - 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.

Архитектура

У меня получилась такая схема:

  1. Клиентский бот - с которым взаимодействует пользователь. Он принимает каналы и выдает саммари.

  2. Бот на кастомном ТГ - который под человеческим аккаунтом заходит на указанные каналы, подписывается и мониторит сообщения.

  3. Обертка над LLM моделью - принимает на вход сообщения и выдает саммари.

  4. Хранилище сообщений - для оригиналов и саммари текста.

  5. Платежный сервер - на него ловим вебхкуки от платежной системы.

  6. Брокер сообщений, который связывает все компоненты.

Как обычно, клиент даже не подозревает, что творится на беке
Как обычно, клиент даже не подозревает, что творится на беке

Если очень сильно упрощать, то флоу такой:

  1. Пользователь добавляет канал в боте

  2. Бот-аккаунт подписывается на этот канал, забирает оттуда сообщения и пересылает их в хранилище

  3. В момент Х из хранилища в LLM отправляется запрос на создание саммари

  4. Полученные саммари пересылаются пользователю в бота.

Конечно, есть нюансы, но о них в следующих статьях.

Стек

Все компоненты написаны на python.

  1. Пользовательский бот написан на aiogram. В нем используются aiogram-dialog для работы с меню, APscheduler для планировщика саммари, SQLAlchemy для хранения пользовательских данных, redis для кеширования стейта

  2. Кастомный телеграм клиент написан на Telethon. В нем дополнительно ничего нет, так как все данные хранятся в автоматически создаваемом файле сессии.

  3. Хранилище сообщений - приложение без фреймворка. В нем так же используется SQLAlchemy.

  4. LLM враппер - тоже приложение без фреймворка. Работает через официальную библиотеку от open ai. Хорошего промпта оказалось достаточно, использовать langchain было бы оверкилом. Клиент работает через прокси.

  5. Платежный сервер написан на FastAPI. Буквально пара файлов и пара методов. Но чтобы завести его, пришлось повозиться с доменами, сертификатами и обратным прокси.

  6. Брокер сообщений - NATS. Асинхронный, быстрый, с поддержкой pub-sub и request-response механик. Удобнее, чем http запросы.

Все это добро крутится на VPS сервере от Selectel под ubuntu.

Заключение

Лучше один раз увидеть

Бот рассчитывает сэкономленное время при средней скорости чтения в 180 слов в минуту
Бот рассчитывает сэкономленное время при средней скорости чтения в 180 слов в минуту

Бота можно запустить по ссылке - https://t.me/aaa_scout_bot.
Я рад, что пет-проджект оброс деталями и дошел до широкой аудитории.
В нем есть бесплатный тариф, можно спокойно потыкать, а так же есть возможность оставлять комментарии и отзывы.

Название "скаут" как предзнаменование будущих фич. Я планирую добавить фильтры, чтобы из тонны каналов пользователь мог получать только интересующие его сообщения.

Что касается следующих статей, я совершенно точно хочу рассказать про подключение платежной системы, а именно, как работает связка "бот-вебхук-платежка".

Вопросы, замечания, комментарии велком.
Спасибо.

Комментарии (16)


  1. ED-209
    10.10.2024 13:00

    Заново переизобрели RSS. Информационные потоки с разных источников в одном месте (приложении).


    1. nullpexx Автор
      10.10.2024 13:00

      Согласен, сходство есть.


      1. ED-209
        10.10.2024 13:00

        Но в целом задумка и реализация здравая, конечно. Рано или поздно кто-нибудь, да сделал. Однозначно плюс!


      1. erley
        10.10.2024 13:00

        А есть кстати такой RSS-digest сервис?
        Ну чтобы туда подцеплять разные источники (обычные RSS и всякие каналы с телеги например), он там сам читает, делает выжимку и отдаёт опять же как RSS.
        И читать этот RSS с того к чему кто привык.


        1. ED-209
          10.10.2024 13:00

          C RSS сейчас можно очень много всего сделать. Куча разных сервисов, ботов, вплоть до выдирания любых текстов с различных сайтов и заворачивая их в поток. Все кастомизируется, настраивается in-out и крутится-вертится как угодно.

          Вот тут всеобъемлющий материал по возможностям RSS.

          https://github.com/AboutRSS/ALL-about-RSS


          1. erley
            10.10.2024 13:00

            Да, у меня так и сделано, мне хотелось узнать какие digest сервисы-читалки есть чтобы выжимки делать. За ссылку спасибо, буду расширять кругозор.


            1. alexhu
              10.10.2024 13:00

              Вот выжимка из новостей - https://moscowi.ru/ - это мой вариант. Собирает новости, выбирает главное и отдаёт html. Api, rss не делал, добавление каналов не делал из за законодательства. А в общем удачно сортирует по важности (по моему скромному мнению).

              Делаю и даже сделал по телеграм каналам, только никому не даю доступ, проверяю на соответствие законодательству.


  1. d-sh
    10.10.2024 13:00

    Такое уже давно есть. В разных вариантах. Есть например бот в которого можно кидать экспортные файлы которые телеграм делает и потом задавать вопросы по всей огромной истории канала.

    И ни один из них нормально не работает :(

    С пересказами статей и видеороликов такая же проблема, обзорные пересказы просто бесполезны а на конкретные вопросы получить хороший ответ не получается.


    1. nullpexx Автор
      10.10.2024 13:00

      Да, перед началом работ было такое же мнение - такие боты есть, но они не работают нормально. Ну и пошло-поехало, свое решение.


      1. d-sh
        10.10.2024 13:00

        Не работают - в смысле если ты не читаешь полную версию то не станешь и сокращеную читать. Гпт не может сделать из мусора конфетку.


  1. Farni41
    10.10.2024 13:00

    Как быть с кучей рекламных и мусорных постов во многих каналах?


    1. nullpexx Автор
      10.10.2024 13:00

      Можно поиграться с промптом, помечать рекламные посты.
      По умолчанию chatgpt сглаживает углы и пытается завуалировать мусорные посты.


  1. Homyakin
    10.10.2024 13:00

    Не уверен, насколько это оно, но есть такой проект НЯН - https://github.com/NyanNyanovich/nyan. Он по умолчанию настроен на парсинг новостных каналов, но можно сконфигурировать любую подборку. Агрегирует одинаковые по смыслу посты с разных каналов в один со ссылками, в выжимки за промежутки он тоже умеет.


    1. nullpexx Автор
      10.10.2024 13:00

      Да, топ, жаль, что не наткнулся на него до начала разработки)

      Планируем в скаута добавить такие же фичи: группировку по темам и фильтрацию нужных/не нужных сообщений.


  1. vkrasikov
    10.10.2024 13:00

    1. Бот на кастомном ТГ - который под человеческим аккаунтом заходит на указанные каналы, подписывается и мониторит сообщения.

    Скажите, пожалуйста, как вы обходите проблему того, что человеческий бесплатный аккаунт может зайти только на 500 каналов? Или у вас пока мало пользователей?


    1. nullpexx Автор
      10.10.2024 13:00

      Сейчас пользователей мало, а каналы перекликаются.
      Но если упремся в лимит, то можно будет завести очередной аккаунт.
      Тут 2 варианта - запустить второй акк параллельно в том же процессе, или завести новый процесс с другим аккаунтом.