Skip to content

Раздел 1: Архитектура

Проект: Автоматизированный правовой мониторинг для e-commerce
Модуль: Lex / Architecture
Версия: 1.0
Дата: Январь 2026


1.1 Обзор архитектуры

Принципы проектирования

ПринципОписание
Reuse InfrastructureИспользование инфраструктуры Watcher (агенты, Task Dispatcher)
AI-FirstФильтрация, классификация и резюмирование через LLM
Knowledge-CentricВсе документы индексируются в Knowledge Base для RAG
Event-DrivenАлерты генерируются при обнаружении релевантных документов
ConfigurableКлючевые слова и пороги настраиваются администратором

Ключевая особенность

Lex не имеет собственных агентов — задачи парсинга добавляются в очередь Watcher и выполняются теми же агентами в ночное время. Это обеспечивает:

  • Отсутствие дублирования инфраструктуры
  • Единое управление агентами
  • Общий пул ресурсов (IP-адреса, вычислительные мощности)
  • Упрощённое администрирование

1.2 Границы модуля

Входит в модуль Lex

КомпонентОписание
Task GeneratorФормирование задач парсинга для Watcher
Source AdaptersАдаптеры для КонсультантПлюс и Гарант
AI FilterОценка релевантности документа (GPT-5 mini)
AI ClassifierОпределение категории и уровня релевантности
AI SummarizerГенерация резюме документа
Document FormatterФормирование Markdown для Knowledge Base
Alert EngineГенерация алертов о новых документах
REST APIEndpoints для управления модулем
Open WebUI PipelineИнтерфейс @Adolf_Lex
Manual Upload HandlerОбработка ручной загрузки документов

Не входит в модуль Lex (используется из других модулей)

КомпонентГде реализованоТип взаимодействия
Watcher AgentsADOLF WatcherВыполнение задач парсинга
Task DispatcherADOLF WatcherРаспределение задач
IP SemaphoreADOLF WatcherПредотвращение коллизий
Knowledge BaseADOLF KnowledgeХранение документов
RAG PipelineADOLF KnowledgeПоиск по документам
ETLADOLF CoreИндексация документов в KB
АвторизацияADOLF Core (Middleware)Проверка ролей
PostgreSQLADOLF CoreМетаданные, алерты, настройки
NotificationsADOLF CoreОтправка алертов
CeleryADOLF CoreФоновые задачи

Функционал v2.0 (не входит в MVP)

КомпонентОписание
Additional Sources6 дополнительных источников (pravo.gov.ru, ФНС и др.)
Deadline RemindersНапоминания о сроках вступления в силу
Reputation IntegrationПодсказки статей закона при ответе на претензию
Content Factory IntegrationПроверка описаний на соответствие требованиям
CFO IntegrationАлерты об изменениях налогового законодательства
Weekly DigestЕженедельный дайджест изменений
Version CompareСравнение версий документа

1.3 Архитектура модуля

1.3.1 Общая схема

1.3.2 Схема потока данных

1.3.3 Схема компонентов


1.4 Зависимости от ADOLF Watcher

1.4.1 Используемые компоненты

Компонент WatcherИспользование в LexМодификации
Task DispatcherРаспределение задач парсингаНовый тип задач lex_parse
Task Queue (Redis)Очередь задачОбщая очередь с Watcher
Watcher AgentsВыполнение парсингаБез изменений
AI ParserБазовое извлечение текстаРасширен для правовых документов
IP SemaphoreПредотвращение коллизийБез изменений

1.4.2 Интеграция с Task Dispatcher

1.4.3 Типы задач

Тип задачиОчередьИсточникОбработчик
watcher_parsetask_queue:watcherWB, Ozon, YMWatcher AI Parser
lex_parsetask_queue:lexКонсультантПлюс, ГарантLex AI Pipeline

1.4.4 Отличия от задач Watcher

ПараметрWatcher TaskLex Task
CookiesТребуются (менеджера МП)Не требуются
Эмуляция поведенияПолная (scroll, mouse)Минимальная
OutputJSON → PostgreSQLMarkdown → Knowledge Base
AI-обработкаИзвлечение структурированных данныхФильтрация + резюме
ПриоритетВысокий (ценовой мониторинг)Средний

1.5 Зависимости от ADOLF Knowledge

1.5.1 Используемые компоненты

Компонент KnowledgeИспользование в Lex
Timeweb KBХранение полных текстов документов
RAG PipelineПоиск по правовым документам
ETLИндексация новых документов
Document MetadataСтруктура YAML-заголовка

1.5.2 Формат документа для KB

yaml
---
# Системные метаданные (совместимо с Knowledge)
source: consultant_plus
category: consumer_rights
access_level: manager
brand_id: shared
indexed_at: 2026-01-20T10:30:00Z

# Специфичные метаданные Lex
document_type: federal_law
document_number: "ФЗ-2300-1"
document_date: 2025-12-15
effective_date: 2026-03-01
relevance: high
original_url: "https://www.consultant.ru/document/..."
---

## Резюме

**Название:** О защите прав потребителей (в редакции от 15.12.2025)
**Суть:** Новые правила возврата товаров, купленных дистанционным способом
**На кого распространяется:** Продавцы, маркетплейсы, покупатели
**Срок вступления в силу:** 01.03.2026
**Ключевые положения:**
- Срок возврата увеличен до 30 дней для товаров, купленных на маркетплейсах
- Маркетплейс несёт солидарную ответственность с продавцом
- Новые требования к информированию покупателя

**Влияние на бизнес:** Высокое. Необходимо обновить политику возврата и информационные материалы.

---

## Полный текст

[Полный текст документа]

1.5.3 Интеграция с RAG Pipeline


1.6 Зависимости от ADOLF Core

1.6.1 Middleware (FastAPI)

ВозможностьПрименение в Lex
АвторизацияПроверка role IN (manager, senior, director, admin)
ИдентификацияПолучение user_id, role из сессии
РоутингРегистрация endpoints /api/v1/lex/*
АудитЛогирование действий в audit_log

Разграничение доступа:

python
# Проверка доступа к Lex
ALLOWED_ROLES = ["manager", "senior", "director", "admin"]

# Функции с ограниченным доступом
SENIOR_PLUS_FUNCTIONS = [
    "manual_upload",
    "delete_document"
]

ADMIN_ONLY_FUNCTIONS = [
    "edit_keywords",
    "edit_relevance_threshold",
    "manage_sources"
]

def check_lex_access(user: User, function: str) -> bool:
    if user.role not in ALLOWED_ROLES:
        return False
    
    if function in ADMIN_ONLY_FUNCTIONS:
        return user.role == "admin"
    
    if function in SENIOR_PLUS_FUNCTIONS:
        return user.role in ["senior", "director", "admin"]
    
    return True

1.6.2 PostgreSQL

Используемые таблицы (существующие):

ТаблицаНазначение
usersРоль пользователя, проверка доступа
audit_logЛоги всех действий
notificationsУведомления (алерты)

Новые таблицы Lex:

ТаблицаНазначение
lex_documentsМетаданные документов
lex_alertsИстория алертов
lex_keywordsКлючевые слова для фильтрации
lex_sourcesИсточники данных
lex_settingsНастройки модуля
lex_statisticsСтатистика сбора

1.6.3 Celery

Фоновые задачи:

ЗадачаРасписаниеОписание
lex.generate_tasks20:30 (до старта Watcher)Генерация задач парсинга
lex.process_resultsContinuousОбработка результатов парсинга
lex.cleanup_old_alerts03:00 ежедневноОчистка старых алертов
lex.generate_statistics08:00 ежедневноФормирование статистики

1.6.4 Notifications

События для уведомлений:

СобытиеТипУровеньПолучатели
lex.new_lawНовый законinfoManager+
lex.amendmentИзменение НПАwarningManager+
lex.court_decisionСудебное решениеinfoManager+
lex.clarificationРазъяснение госорганаinfoManager+
lex.effective_soonСкоро вступает в силуwarningManager+
lex.marketplace_mentionУпоминание МПinfoManager+
lex.parse_errorОшибка парсингаcriticalAdmin
lex.source_unavailableИсточник недоступенcriticalAdmin

1.7 Потоки данных

1.7.1 Автоматический сбор документов

1.7.2 Ручная загрузка документа

1.7.3 Запрос алертов


1.8 REST API

1.8.1 Endpoints

МетодEndpointОписаниеДоступ
GET/api/v1/lex/alertsСписок алертовManager+
GET/api/v1/lex/alerts/{id}Детали алертаManager+
PATCH/api/v1/lex/alerts/{id}Отметить прочитаннымManager+
GET/api/v1/lex/documentsСписок документовManager+
GET/api/v1/lex/documents/{id}Детали документаManager+
POST/api/v1/lex/uploadРучная загрузкаSenior+
DELETE/api/v1/lex/documents/{id}Удалить документSenior+
GET/api/v1/lex/statisticsСтатистикаManager+
GET/api/v1/lex/keywordsСписок ключевых словManager+
PUT/api/v1/lex/keywordsОбновить ключевые словаAdmin
GET/api/v1/lex/settingsНастройки модуляAdmin
PUT/api/v1/lex/settingsОбновить настройкиAdmin
GET/api/v1/lex/sourcesСписок источниковAdmin
PUT/api/v1/lex/sources/{id}Обновить источникAdmin

1.8.2 Примеры запросов

Получение алертов:

http
GET /api/v1/lex/alerts?status=unread&category=marking&limit=10
Authorization: Bearer {token}

Response 200:
{
  "alerts": [
    {
      "id": 456,
      "document_id": 123,
      "type": "new_law",
      "title": "ФЗ о маркировке товаров лёгкой промышленности",
      "category": "marking",
      "relevance": "high",
      "effective_date": "2026-03-01",
      "summary": "Новые требования к маркировке...",
      "created_at": "2026-01-20T08:00:00Z",
      "status": "unread"
    }
  ],
  "total": 1,
  "unread_count": 1
}

Ручная загрузка документа:

http
POST /api/v1/lex/upload
Authorization: Bearer {token}
Content-Type: multipart/form-data

file: [PDF/DOCX file]
# или
url: "https://www.consultant.ru/document/..."

Response 200:
{
  "success": true,
  "document_id": 124,
  "relevance_score": 0.85,
  "category": "consumer_rights",
  "relevance_level": "high",
  "summary": "..."
}

Response 400:
{
  "success": false,
  "reason": "low_relevance",
  "relevance_score": 0.42,
  "threshold": 0.60
}

1.9 Конфигурация

1.9.1 Environment Variables

bash
# Database
DATABASE_URL=postgresql://adolf:password@postgres:5432/adolf

# Redis (shared with Watcher)
REDIS_URL=redis://redis:6379/0

# AI
TIMEWEB_AI_URL=https://api.timeweb.cloud/ai/v1
TIMEWEB_AI_KEY=xxx

# Lex settings
LEX_RELEVANCE_THRESHOLD=0.60
LEX_TASK_QUEUE=task_queue:lex
LEX_BATCH_SIZE=50

# Knowledge Base
TIMEWEB_KB_URL=https://api.timeweb.cloud/kb/v1
TIMEWEB_KB_ID=xxx

1.9.2 Настройки в PostgreSQL

sql
-- lex_settings
INSERT INTO lex_settings (key, value, description) VALUES
('relevance_threshold', '0.60', 'Минимальный порог релевантности (0-1)'),
('max_documents_per_day', '100', 'Максимум документов в день'),
('alert_on_high_relevance', 'true', 'Алерт только для высокой релевантности'),
('enabled_categories', '["trade","marking","consumer_rights","advertising","tax","labor","personal_data"]', 'Активные категории'),
('parse_full_text', 'true', 'Сохранять полный текст документа');

1.9.3 Ключевые слова (lex_keywords)

sql
INSERT INTO lex_keywords (category, keywords, weight) VALUES
('trade', '["маркетплейс","дистанционная торговля","интернет-магазин","розничная торговля","оптовая торговля","электронная коммерция"]', 1.0),
('marking', '["маркировка товаров","Честный ЗНАК","товары лёгкой промышленности","одежда","текстиль","обувь"]', 1.2),
('consumer_rights', '["возврат товара","защита прав потребителей","гарантия","претензия","недостаток товара"]', 1.1),
('advertising', '["реклама в интернете","таргетированная реклама","маркетинг","рекламная деятельность"]', 0.9),
('tax', '["НДС","УСН","налог на прибыль","самозанятые","индивидуальный предприниматель"]', 1.0),
('labor', '["трудовой договор","удалённая работа","дистанционная работа","ГПХ","гражданско-правовой договор"]', 0.8),
('personal_data', '["персональные данные","обработка ПДн","согласие на обработку","оператор ПДн"]', 0.9),
('platforms', '["Wildberries","Ozon","Яндекс.Маркет","Яндекс Маркет"]', 1.5);

1.10 Безопасность

1.10.1 Аутентификация

КомпонентМетод
REST APIBearer Token (через Middleware)
Celery TasksInternal (без аутентификации)
Watcher IntegrationShared API Key

1.10.2 Авторизация

ДействиеManagerSeniorDirectorAdmin
Просмотр алертов
Просмотр документов
Ручная загрузка
Удаление документов
Редактирование keywords
Настройки модуля

1.10.3 Валидация данных

ПолеВалидация
URL для загрузкиWhitelist доменов (consultant.ru, garant.ru)
Файл для загрузкиPDF, DOCX, максимум 10 MB
Ключевые словаМаксимум 50 слов на категорию
Порог релевантности0.0 — 1.0

1.11 Мониторинг

1.11.1 Метрики

МетрикаОписаниеХранение
lex.documents.totalВсего документов в KBPostgreSQL
lex.documents.todayДобавлено сегодняPostgreSQL
lex.documents.rejectedОтклонено по релевантностиPostgreSQL
lex.alerts.unreadНепрочитанных алертовPostgreSQL
lex.parse.success_rateУспешность парсингаPostgreSQL
lex.ai.avg_response_timeСреднее время AIRedis

1.11.2 Health Checks

ПроверкаИнтервалДействие при сбое
Watcher Queue availability5 минАлерт Admin
AI Filter availability5 минАлерт Admin
KB connection5 минАлерт Admin
Source availability1 часАлерт Admin

1.11.3 Алерты мониторинга

СобытиеУровеньПолучатель
Источник недоступен > 1 часcriticalAdmin
AI Filter error rate > 10%warningAdmin
0 документов за ночьwarningAdmin
KB upload failedcriticalAdmin

1.12 Масштабирование

1.12.1 Ограничения

РесурсЛимитПричина
Документов в день~100Rate limit источников
Размер документа10 MBЛимит KB
AI запросов в минуту60Rate limit Timeweb AI
Задач Lex в очереди500Приоритет Watcher

1.12.2 Приоритеты очередей

Watcher tasks (цены) > Lex tasks (документы)

Task Dispatcher обрабатывает задачи Lex с меньшим приоритетом, чтобы не влиять на ценовой мониторинг.


1.13 Диаграмма развёртывания


1.14 Структура файлов модуля

/app/modules/lex/
├── __init__.py
├── api/
│   ├── __init__.py
│   ├── router.py              # FastAPI роутер
│   ├── schemas.py             # Pydantic модели
│   └── dependencies.py        # Зависимости
├── services/
│   ├── __init__.py
│   ├── task_generator.py      # Генерация задач парсинга
│   ├── ai_filter.py           # Фильтрация по релевантности
│   ├── ai_classifier.py       # Классификация документов
│   ├── ai_summarizer.py       # Генерация резюме
│   ├── document_formatter.py  # Формирование Markdown
│   ├── alert_engine.py        # Генерация алертов
│   ├── upload_handler.py      # Ручная загрузка
│   └── statistics.py          # Статистика
├── adapters/
│   ├── __init__.py
│   ├── consultant_plus.py     # Адаптер КонсультантПлюс
│   └── garant.py              # Адаптер Гарант
├── models/
│   ├── __init__.py
│   ├── document.py            # SQLAlchemy модели
│   ├── alert.py
│   ├── keyword.py
│   └── settings.py
├── tasks/
│   ├── __init__.py
│   ├── generate_tasks.py      # Celery задача генерации
│   ├── process_results.py     # Обработка результатов
│   └── maintenance.py         # Очистка, статистика
├── prompts/
│   ├── __init__.py
│   ├── filter_prompt.py       # Промпт фильтрации
│   ├── classifier_prompt.py   # Промпт классификации
│   └── summarizer_prompt.py   # Промпт резюмирования
└── utils/
    ├── __init__.py
    ├── text_extractor.py      # Извлечение текста
    └── validators.py          # Валидация

Приложение А: Контрольные точки архитектуры

КритерийПроверка
Задачи Lex в очередиLLEN task_queue:lex > 0 после 20:30
Агенты обрабатывают LexЛоги агентов содержат lex_parse
AI Filter работаетВремя ответа < 5 сек
Документы в KBПоявляются после ночного цикла
Алерты генерируютсяУведомления в Open WebUI
Статистика обновляетсяДанные в lex_statistics
Ручная загрузка работаетPOST /upload возвращает 200

Приложение Б: Сравнение с Watcher

АспектWatcherLex
Собственные агенты❌ (использует Watcher)
Очередь задачtask_queue:watchertask_queue:lex
CookiesТребуютсяНе требуются
OutputJSON → PostgreSQLMarkdown → KB
AI-обработкаИзвлечение данныхФильтрация + резюме
ПриоритетВысокийСредний
АлертыДемпингНовые НПА
Интерфейс@Adolf_Watcher@Adolf_Lex + @Adolf_Knowledge

Документ подготовлен: Январь 2026
Версия: 1.0
Статус: Черновик

Документация ADOLF Platform