Этот репозиторий содержит код и описание сервиса для mvp хакатона
Интерфейс представляет собой ленту новостей, агрегированных из разных источников. Наверху всегда более "горячие" новости, рейтинг постоянно пересчитывается из-за обновления социальных маркеров (реакции, репосты, просмотры и тд). Пока новость обсуждают (меняется количествво просмотров, появляются реакции, репосты) hotness остается высоким. Чем старше новость, тем меньше влияния социальные маркеры имеют на hottnes_score и "горячесть" падает.
Архитектура построена на базе event-driven + fun-out, обработка новостей ассинхронная, что позволяет легко расширят решение при росте пользователей. Постарался все обмазать кешами чтобы не тратить токены лишний раз.
Свой пулл фетчеров на один источник новостей (телеграм, RSS лента, новостные сайты, X и другие социальные сети ps: реализован только telegram). Они парсят новости и собирают социальные метрики (лайки, репеосты, просмотры и тд) какие можно получить из источника. Каждый источник имеет свои метрики кредабилити (например в тг это общее количество подписчиков и степень доверия каналу. ps: еще можно посчитать среднюю скорость изменения совокупности социальных метрик чотб точнее выявлять всплески активности для более точно оценки hottnes_score). Далее эти новости (после небольшой фильтрации от спама или рекламы) с метаданными идут в очередь (кафка или что-то еще, тут используется редис стрим) и их вычитывает следующий узел - пулл embedding воркеров. Если очередь новости могут отправляться повторно если его социальные метрики изменились (нужно для актуальной оценки hottnes_score)
Принимают текст новостей и с помощью модели расчитывается вектор в 1024 мерный, который описывает тему новости (инфоповод), на основе котрого будет производится кластеризация (дедубликация) - объединение одинаковых новостей в группу. после этого обогощенные данные идут в следущую очередь, из которой ее читает воркер занимающийся кластеризацией.
Берет новости и группирурует, одна группа - один инфоповод. После чего сохраняются в БД (используется постгрес +pgvector). Далее эту базу анализируют различные агенты и обогащают базу (описания агентов ниже будет).
- translator: переводит новости если они не на русском (текущая реализация только переводит английский)
- ranking: расчитывает hottness_score на основе формул (подробнее ниже будет)
- title generator: на основе новостей в кластере формирует заголовок обощенный
- entity extractor: на основе текстов новостей в рамках инфоповода выявляет теги компании/тикеры/страны/сектора
- why_now: на основе текстов говорит почему новсть важная (на что влияет и тп)
- draft generator: не совсем воркер, но выдает черновик поста/заметки об инфоповоде по запросу юзера.
Так как операция очень частая тк требуется актуальную информацию о "горячести" иметь, поэтому используется формула для оценки:
