Отслеживаем новости, документы и тендеры

Привет! Каждый день приходится столько всего отслеживать— лучше делать это в кратком пересказе и без лишних движений.
Может быть, Вы хотите читать новости и статьи без лишней "воды". А может, вам приходится следить по работе за длинными и скучными, но важными документами: новыми законопроектами, решениями арбитражных судов, государственными торгами и закупками?
Вот было бы здорово, чтобы сайты сами проверялись на наличие новых событий (даже если там нет RSS), выложенные на этих сайтах PDF и DOCX файлы сами выгружались, а мы видели краткую выжимку по каждому событию! И так — для каждого сайта. И все — в единой ленте.
Чтобы любой источник для наблюдения можно было бы добавить по YAML-конфигу, указав CSS-селекторы, правила нормализации и GPT-промт.
Как это работает
Вот, например, реальный пример из сферы урбанистики:
meta:
name: Мониторинг ГИКЭ КГИОП
description: Отслеживает появление новых историко-культурных экспертиз на сайте КГИОП СПб
source:
type: html
url: |
{% set current_year = now().year %}
https://kgiop.gov.spb.ru/deyatelnost/zaklyucheniya-gosudarstvennyh-istoriko-kulturnyh-ekspertiz/gosudarstvennye-istoriko-kulturnye-ekspertizy-za-{{ current_year }}-g/
frequency: daily
gpt:
prompt: |
Проанализируй текст экспертизы ниже и выдели:
1. Объект культурного наследия
2. Адрес
3. Заказчик или собственник
4. Виды работ: реконструкция, реставрация и др.
5. Кадастровые номера
6. Краткое заключение или вывод
Вот текст: {{ text }}
# Часть конфига для краткости пропущена, но все есть в репозитории
И при появлении на сайте очередного 300-страничного документа получить в своей ленте новостей те самые несколько пунктов, которые позволяют оценить будущую судьбу здания. Так как речь идет о GPT-пересказе, что-то может быть отражено неточно, но выжимки достаточно, чтобы понять, представляет ли информация интерес и надо ли изучать документ дальше:
----------------------------------------
1. **Объект культурного наследия**: «Особняк Дурново П.П.»
2. **Адрес**: Санкт-Петербург, Галерная д. 15, лит. А.
3. **Заказчик или собственник**: *Здесь название компании*
4. **Виды работ**: Ремонт фасадов и другие работы по сохранению объекта культурного наследия.
5. **Кадастровые номера**: Не указаны в тексте.
6. **Краткое заключение или вывод**: Экспертиза подтвердила соответствие проектной документации требованиям сохранения объекта культурного наследия регионального значения.
Это уже работает, хоть пока и требует полировки напильником: дорабатываю MVP в виде CLI на "Питоне". Поддерживается выбор шаблона при запуске. Вывод идет в терминал и в лог-файл, а база данных и фласк-интерфейс (в котором и будет та самая единая лента наблюдения) — в ближайших планах.
Философия проекта
Разумеется, можно и нужно делать шаблоны под свои задачи. Сам проект с открытым исходным кодом. Я надеюсь, что такой проект будет полезен как для исследователей данных, которым нужно следить за сложными источниками (аналог Huginn, но со встроенным фидом и более простой логикой), так и для более широкой аудитории, кто хочет не пропустить что-то важное для себя (аналог changedetection.io, но вместо простого diff у нас лента событий, которые формируются путем более глубокого парсинга). Особенность — AI-пересказ новостей.
Сравнение с аналогами
Сравним наш проект с хорошо известными замечательными аналогами с открытым исходным кодом (присмотритесь к ним тоже, возможно, для ваших целей они подойдут больше!), которые так же могут работать как self hosted решения.
Характеристика |
|||
---|---|---|---|
? Тип проекта |
CLI + YAML + AI |
Web-интерфейс + сценарии-агенты |
Web-интерфейс + мониторинг изменений |
? Глубина обработки |
Семантический парсинг + GPT-интерпретация |
Простые действия и фильтры |
Text diff или визуальные различия |
? Работа с документами |
Поддержка PDF/DOCX и анализ содержимого |
Ограничено — нужно писать парсеры или настраивать логику вручную |
Нет обработки документов |
? Шаблоны |
YAML-конфиги с CSS, нормализацией, GPT |
JS/JSON-сценарии и блоки (agents) |
Только URL и настройки diff |
? Сценарии наблюдения |
Арбитраж, тендеры, экспертизы, новости |
Почта, RSS, API, Twitter и др. |
Простой мониторинг сайтов и страниц |
? Поддержка AI |
GPT4All / Deepseek / локальные модели |
Нет встроенной поддержки AI |
Нет |
? Интерфейс |
CLI (терминал), Flask UI — в разработке |
Web UI |
Web UI |
? Вывод |
Событийная лента + лог-файл |
Множественные действия (email, webhook) |
HTML или email |
? Фокус проекта |
Семантический мониторинг и интерпретация |
Автоматизация задач |
Отслеживание изменений |
⚙️ Локальный запуск |
Да (без интернета, с локальной моделью) |
Да |
Да |
? Open source |
✅ Да |
✅ Да |
✅ Да |
Юридические аспекты
Так как с автоматизацией сбора данных связаны не столько технические, сколько сложные юридические и этические вопросы доступа к информации, я считаю себя обязанным об этом предупредить.
Конкретный пример: хотя чисто теоретически мы могли бы настроить сбор данных о судебных решениях, например, из той же картотеки арбитражных дел, мы должны иметь в виду, что за доступ к её API просят большие деньги (от 660 тыс. рублей на 2022 год, см. статью на VC.ru) . Это связано с тем, что сайт картотеки поддерживается частной компанией.
В проекте Rostral.io предполагается использование нашего open source продукта прежде всего для личных, образовательных или научных целей. Либо подразумевается, что мы получили доступ к API нужного ресурса и затем уже настраиваем для него шаблон (потому что хотим собрать все в одну ленту в виде единообразных саммэри). Также мы, конечно, должны стремиться к тому, чтобы учитывать ограничения robots.txt и выдерживать вежливые интервалы запросов к сайтам (например, не чаще чем раз в 5 секунд).
Технические особенности
Наиболее творческой мне кажется часть реализации, связанной с ИИ. Когда источников 100+ и в каждом может быть 100+ страниц текста (если это PDF), оплачивать токены ChatGPT может быть накладно.
Поэтому в качестве основного варианта используется локальная модель на основе Deepseek (можно подключить любую модель по своему желанию, но эта запускается на ноутбуке с 16 GB RAM и даёт осмысленные ответы).
Работа с ней идёт через библиотеку для "Питона" под названием GPT4All — такое решение показалось мне на данном этапе самым простым.
Но и для локальной модели "переварить" большие документы непросто. Поэтому применён следующий подход: сначала выбираются блоки текста по ключевым словам (например, в случае примера с экспертизами выше это могут быть слова "заказчик", "собственник", "проектом предусматривается" и т. п.). Затем эти фрагменты объединяются и передаются модели, что позволяет уложиться в ее окно возможностей. Как мне показалось, это эффективнее, чем обычный embedding.
Конвейер в заголовке не только метафора: по сути система работает как пайплайн, передавая источник по нескольким стадиях (fetch, extract, download, normalize и т. д.), которые управляются из шаблонов.
Я назвал проект Rostral.io ("Ростраль") — по ростральным колоннам Петербурга, огонь которых освещает путь. Пока не знаю, как все пойдёт, но мне было важно поделиться этим с сообществом.
Полная спецификация проекта Rostral.io для разработчиков (на английском языке) вместе с исходным кодом доступна в репозитории на GitHub. Пулл реквесты приветствуются!
Как попробовать
Примерно так:
cd rostral.io
pip install -r requirements.txt
# Дополнительные шаги:
# 1. Установите Tesseract OCR
# Windows: winget install -e --id UB-Mannheim.TesseractOCR
# Mac: brew install tesseract
# Linux: sudo apt install tesseract-ocr
# 2. Скачайте модель вручную (более 4 ГБ на диске):
# - Перейдите: https://huggingface.co/ct-2/DeepSeek-R1-Distill-Llama-8B-Q4_0-GGUF
# - Скачайте файл DeepSeek-R1-Distill-Llama-8B-Q4_0.gguf
# - Положите в папку: rostral.io/models/DeepSeek-R1-Distill-Llama-8B-Q4_0/
python3 -m rostral
А вам близок такой подход к наблюдению? Какие сценарии наблюдения, которые можно реализовать в виде шаблонов, были бы полезны вам? Госказкупки, pravo.gov.ru, regulation.gov.ru, патенты или что-нибудь еще?