АвтоматизацияИнтеграции
Tech Radar: фильтр сигнала из потока сообщений разработчиков
- Что это было
- Собственный сервис: собирает сообщения из профессионального сообщества, отсеивает шум объяснимыми правилами и собирает дайджест. Работает на моём сервере.
- Моя роль
- Постановка, архитектура, разработка, эксплуатация — один
- Период
- 2026, развивается
- Результат
- 7 627 сообщений от 581 автора в архиве; сервис работает без вмешательства.
Контекст и исходная проблема
Сообщество разработчиков, где обсуждают новые библиотеки, инструменты и цены на API. Ценность есть, но она размазана по сотням сообщений в день, и читать всё вручную невозможно.
Бизнес-задача
Не пропускать полезное, не читая всё. Получать короткую сводку за сутки вместо ленты, и уметь объяснить, почему сообщение попало в сводку.
Ограничения и неизвестные
- Один сервер 2 CPU / 4 ГБ, без GPU
- Сообщения чужие: архив не публикуется, в выдачу идут только ссылки и фрагменты
- Решение должно работать без присмотра — я занят другими задачами
- Ноль платных API
Моя ответственность
Всё: сбор через Telethon, схема базы, правила отбора, дайджест, systemd-юнит, тесты, эксплуатация.
Ключевые решения и компромиссы
- Сырой архив неприкосновенен: обработка ничего не удаляет из items, все производные выводы лежат отдельно в item_analysis. Правила отбора можно переписать и прогнать заново по всей истории.
- Сначала детерминированные правила, только потом LLM. Правила дёшевы, воспроизводимы и объясняют своё решение списком причин; модель на 2 ядрах без GPU медленная и объяснить себя не может.
- LLM вынесен за интерфейс ItemAnalyzer, а не вписан в код обработки. Добавить локальную модель можно новой реализацией того же протокола, не трогая пайплайн.
- Инкрементальный сбор по курсору: перезапуск не перечитывает историю заново.
- Наблюдаемость с первого дня — каждый прогон коллектора пишется со статусом, включая аварийное завершение.
Что получилось
- 7 627 сообщений от 581 автора собрано за период с марта по август 2026
- Дедупликация по нормализованному тексту и по канонизированным ссылкам, с удалением tracking-параметров
- Дайджест выдаёт оценку, категорию и список причин, по которым сообщение отобрано
- Сервис живёт под systemd и переживает перезагрузку сервера без ручного вмешательства
- 1 148 строк собственного кода, четыре внешние зависимости, три набора тестов
Границы публикации
Следующий шаг для похожей задачи
Похожая задача — вытащить сигнал из потока сообщений, писем или заявок. Начнём с того, что считать сигналом.