Как я за день собрал пайплайн для сбора и фильтрации новостей
У меня есть хобби – я веду телеграмм канал, в котором публикую новости про транспорт и общественный транспорт Чебоксар и Чувашии. Для этого я собираю новости с сайтов администрации города, республиканских министерств, СМИ и региональных сайтов, пабликов в VK и Telegram.
Со временем источников стало много, количество новостей стало зашкаливать, где-то 200-250 сообщений в день, из которых нужно было выискивать 3-4 новости. Это занимало 10 минут в день, но самые "неприятные" 10 минут, которые я старался отложить на потом. Эту рутину я и решил автоматизировать, сначала написал небольшой скрипт на PHP, а теперь написал пайплайн на Prefect, который собирает новости из разных источников, фильтрует их через стоп слова и LLM, а результат публикует в закрытый паблик Telegram, где я их читаю.
Почему нужно публиковать в Telegram, а не делать email рассылку или RSS ? Telegram есть на каждом компьютере, в каждом телефоне, не нужно отдельно запускать приложение. Читать может несколько человек, очень простой API, быстро интегрируется.
Сразу скажу, что я не делал коробочное решение для всех, а быстро сделал инструмент для себя. Я не стал тратить время на класстеризацию новостей, группировку похожих новостей с помощью embeddings и Vector DB. Самую муторную часть, первичную фильтрацию, я переложил на LLM. Всё остальное оставил себе.
Новости в основном состоят из политических заявлений, отчеты чиновников ("Глава республики обратился к депутатам") и новости, которые хоть и формально связаны с транспортом, но не касаются его по смыслу ("Глава города выступил перед работниками Чувашского транспортного управления"). Вторая проблема - дубликаты, когда разные источники публикуют одну новость по 3-4 раза. С дубликатами я пока не боролся.
Изначально у меня был скрипт на 100 строк кода, но каждое новое улучшение существенно усложняло код, и я решил сделать пайплайн на основе Prefect. Получился полноценный ETL, с concurency выполнением запросов, retry и просмотром логов через Web UI, не нужно по SSH читать логи.
Пришлось подбирать rate limit для запросов VK API, чтобы читать паблики, делать запросы в LLM батчами. Отдельная боль в том, что сайты госучреждений грузятся только из России, а ChatGPT не работают в России. Но выход нашелся, OpenRouter работает из России.
Как я использую prefilter ? С помощью ключевых стоп слов можно легко убрать ненужные новости, касательно политики ("урок управления FPV-дронами") или ДТП без связи с инфраструктурой ("автомобиль сбил корову"). Это помогает снизить шум в новостях.
Одного флага keep: true / false оказалось недостаточно. Я сохраняю reason, краткое объяснение, почему модель приняла то или иное решение. Это не лог ради лога: со временем по этим причинам можно анализировать типовые ошибки, видеть, в каких случаях промпт работает плохо, и калибровать фильтр уже на реальных данных, а не на ощущениях. Дополнительно все посты раскладываются по bucket’ам: A — точно подходят, B — скорее всего подходят, C — не подходят. Это позволяет не сводить всё к бинарному решению и использовать результаты гибко: например, публиковать A и B в разных комбинациях — в Telegram или в отдельные RSS-ленты с разной «жёсткостью» фильтрации.
Так-же я хочу добавить обратную связь в Telegram паблик с готовыми новостями: я ставлю реакции на посты 👍 или 👎. Потом эти реакции можно использовать для тюнинга промпта
Итог: Сейчас пайплайн экономит около 10 минут в день, но это самые неприятные 10 минут, которые требуют концентрации и быстро выматывают. По сути это история про автоматизацию рутины.
Инструменты позволяют автоматизировать гораздо больше, чем кажется. Вопрос только в том, готовы ли мы потратить день, чтобы перестать тратить внимание на мусор.