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

Rostral.io размышляет над ответом вместо вас
Rostral.io размышляет над ответом вместо вас

Привет! Каждый день приходится столько всего отслеживать— лучше делать это в кратком пересказе и без лишних движений.

Может быть, Вы хотите читать новости и статьи без лишней "воды". А может, вам приходится следить по работе за длинными и скучными, но важными документами: новыми законопроектами, решениями арбитражных судов, государственными торгами и закупками?

Вот было бы здорово, чтобы сайты сами проверялись на наличие новых событий (даже если там нет 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 решения.

Характеристика

Rostral.io

Huginn

Changedetection.io

? Тип проекта

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, патенты или что-нибудь еще?

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