Skip to main content

Структура КП

Система автоматизированного анализа коммерческих предложений

Высокоуровневое описание решения

1. Архитектурное решение

1.1. Общая архитектура системы

graph TB
    subgraph "Уровень представления"
        UI[Web-интерфейс]
        API[REST API Gateway]
        Auth[Keycloak SSO]
    end
    
    subgraph "Уровень бизнес-логики"
        OCR[OCR-сервис<br/>TrOCR + EasyOCR]
        LLM[LLM-сервис<br/>Llama/Mixtral/Qwen]
        VEC[Векторизация<br/>E5-large]
        ANAL[Аналитический движок]
        REP[Генератор отчетов]
        FEED[Модуль обратной связи]
    end
    
    subgraph "Уровень данных"
        PG[(PostgreSQL<br/>Реляционные данные)]
        QD[(Qdrant<br/>Векторное хранилище)]
        FS[(File Storage<br/>Документы)]
    end
    
    UI --> Auth
    Auth --> API
    API --> OCR
    API --> LLM
    API --> ANAL
    ANAL --> VEC
    ANAL --> REP
    ANAL --> FEED
    
    OCR --> FS
    LLM --> QD
    VEC --> QD
    ANAL --> PG
    REP --> FS
    FEED --> PG

1.2. Технологический стек LLM-компонентов

Компонент Рекомендуемые модели Требования к ресурсам
Основная LLM • Llama 3.1 70B (максимальная точность)
• Mixtral 8x7B (оптимальный баланс)
• Qwen 2.5 32B (минимальные требования)
• 140GB VRAM
• 90GB VRAM
• 65GB VRAM
OCR • TrOCR + EasyOCR
• LayoutLMv3 (структура документов)
• 8GB VRAM
Векторизация • multilingual-e5-large • 4GB VRAM
Инференс-сервер • vLLM или TGI • CPU: 32 cores
• RAM: 256GB

2. Модель данных

2.1. Структура реляционной базы данных

erDiagram
    Tenders ||--o{ TenderDocuments : contains
    Tenders ||--o{ CommercialProposals : has
    Tenders ||--o{ EvaluationCriteria : defines
    Tenders ||--|| AnalysisReports : generates
    
    Suppliers ||--o{ CommercialProposals : submits
    CommercialProposals ||--o{ CriteriaEvaluations : evaluated_by
    EvaluationCriteria ||--o{ CriteriaEvaluations : used_in
    
    WeightProfiles ||--o{ Tenders : applies_to
    FeedbackRecords ||--|| TrainingQueue : queued_in
    FeedbackRecords }o--|| Tenders : relates_to
    
    Tenders {
        uuid id PK
        string tender_number
        string name
        string status
        timestamp created_at
        string analysis_number
        date analysis_date
    }
    
    TenderDocuments {
        uuid id PK
        uuid tender_id FK
        string document_type
        string file_name
        string file_path
        boolean ocr_completed
        decimal ocr_accuracy
    }
    
    CommercialProposals {
        uuid id PK
        uuid tender_id FK
        uuid supplier_id FK
        decimal total_score
        integer rank
        string recommendation_status
    }
    
    EvaluationCriteria {
        uuid id PK
        uuid tender_id FK
        string category
        string criterion_name
        decimal weight
        boolean is_mandatory
        text expected_value
    }
    
    CriteriaEvaluations {
        uuid id PK
        uuid proposal_id FK
        uuid criterion_id FK
        text found_value
        string compliance_status
        decimal score
        decimal confidence
    }

2.2. Структура векторной базы данных

graph LR
    subgraph "Векторные коллекции Qdrant"
        subgraph "tender_requirements"
            TR[Векторы требований<br/>1024 dimensions]
            TRP[/"tender_id<br/>criterion_id<br/>criterion_text<br/>criterion_type"/]
        end
        
        subgraph "proposal_content"
            PC[Векторы КП<br/>1024 dimensions]
            PCP[/"proposal_id<br/>chunk_text<br/>page_number<br/>section_type"/]
        end
        
        subgraph "criteria_patterns"
            CP[База паттернов<br/>1024 dimensions]
            CPP[/"pattern_text<br/>criterion_type<br/>extraction_rules<br/>success_rate"/]
        end
    end
    
    TR --> TRP
    PC --> PCP
    CP --> CPP

3. Алгоритмы обработки

3.1. Алгоритм извлечения критериев из ТЗ

flowchart TD
    Start([Начало]) --> LoadTZ[Загрузка текста ТЗ]
    LoadTZ --> StructAnalysis[Структурный анализ документа<br/>LayoutLMv3]
    
    StructAnalysis --> FindSections[Поиск стандартных секций]
    FindSections --> Tech[Технические<br/>требования]
    FindSections --> Delivery[Условия<br/>поставки]
    FindSections --> Warranty[Гарантийные<br/>обязательства]
    FindSections --> Payment[Условия<br/>оплаты]
    
    Tech --> ProcessSection1[LLM-анализ секции]
    Delivery --> ProcessSection2[LLM-анализ секции]
    Warranty --> ProcessSection3[LLM-анализ секции]
    Payment --> ProcessSection4[LLM-анализ секции]
    
    ProcessSection1 --> ExtractCriteria1[Извлечение критериев<br/>в формате JSON]
    ProcessSection2 --> ExtractCriteria2[Извлечение критериев<br/>в формате JSON]
    ProcessSection3 --> ExtractCriteria3[Извлечение критериев<br/>в формате JSON]
    ProcessSection4 --> ExtractCriteria4[Извлечение критериев<br/>в формате JSON]
    
    ExtractCriteria1 --> Merge[Объединение критериев]
    ExtractCriteria2 --> Merge
    ExtractCriteria3 --> Merge
    ExtractCriteria4 --> Merge
    
    Merge --> Validate[Валидация и дедупликация]
    Validate --> SaveDB[(Сохранение в БД)]
    SaveDB --> End([Конец])
    
    subgraph "Формат критерия"
        Format[/"name: название<br/>expected_value: значение<br/>type: тип данных<br/>is_mandatory: обязательность"/]
    end

3.2. Алгоритм сопоставления критериев с КП

flowchart TD
    Start([Начало]) --> LoadCriteria[Загрузка критериев из БД]
    LoadCriteria --> Loop{Для каждого<br/>критерия}
    
    Loop --> CreateQuery[Формирование<br/>поискового запроса]
    CreateQuery --> Vectorize[Векторизация<br/>запроса E5-large]
    Vectorize --> VectorSearch[Векторный поиск<br/>в Qdrant]
    
    VectorSearch --> GetChunks[Получение TOP-5<br/>релевантных чанков]
    GetChunks --> FormContext[Формирование<br/>контекста]
    
    FormContext --> LLMAnalysis[LLM-анализ<br/>соответствия]
    
    LLMAnalysis --> ExtractValue[Извлечение<br/>найденного значения]
    ExtractValue --> DetermineStatus[Определение статуса]
    
    DetermineStatus --> Status1[Соответствует]
    DetermineStatus --> Status2[Частично<br/>соответствует]
    DetermineStatus --> Status3[Не соответствует]
    DetermineStatus --> Status4[Информация<br/>отсутствует]
    
    Status1 --> CalcConfidence[Расчет уверенности<br/>0-1]
    Status2 --> CalcConfidence
    Status3 --> CalcConfidence
    Status4 --> CalcConfidence
    
    CalcConfidence --> SaveEvaluation[(Сохранение оценки)]
    
    SaveEvaluation --> NextCriterion{Есть еще<br/>критерии?}
    NextCriterion -->|Да| Loop
    NextCriterion -->|Нет| End([Конец])

3.3. Алгоритм расчета итогового скора

flowchart TD
    Start([Начало]) --> LoadEvals[Загрузка всех оценок КП]
    LoadEvals --> LoadProfile[Загрузка профиля весов]
    
    LoadProfile --> CheckMandatory{Проверка<br/>обязательных<br/>критериев}
    
    CheckMandatory --> Loop1{Для каждого<br/>обязательного}
    Loop1 --> CheckCompliance{Соответствует?}
    CheckCompliance -->|Нет| Disqualify[Дисквалификация<br/>Скор = 0]
    CheckCompliance -->|Да| NextMandatory{Еще есть?}
    NextMandatory -->|Да| Loop1
    NextMandatory -->|Нет| CalcWeighted[Расчет взвешенной оценки]
    
    Disqualify --> End([Конец])
    
    CalcWeighted --> Loop2{Для каждого<br/>критерия}
    Loop2 --> GetWeight[Получение веса<br/>из профиля]
    GetWeight --> GetScore[Получение оценки<br/>критерия]
    
    GetScore --> MapScore[Преобразование статуса в балл]
    MapScore --> Calc1[Соответствует = 1.0]
    MapScore --> Calc2[Частично = 0.5]
    MapScore --> Calc3[Не соответствует = 0]
    MapScore --> Calc4[Отсутствует = 0]
    
    Calc1 --> ApplyConfidence[Умножение на<br/>уверенность]
    Calc2 --> ApplyConfidence
    Calc3 --> ApplyConfidence
    Calc4 --> ApplyConfidence
    
    ApplyConfidence --> ApplyWeight[Умножение на вес]
    ApplyWeight --> Accumulate[Накопление суммы]
    
    Accumulate --> NextCrit{Еще критерии?}
    NextCrit -->|Да| Loop2
    NextCrit -->|Нет| Normalize[Нормализация<br/>к 100%]
    
    Normalize --> SaveScore[(Сохранение<br/>итогового скора)]
    SaveScore --> End

4. Модуль обратной связи и накопления знаний

flowchart TD
    Start([Начало]) --> ReceiveFeedback[Получение обратной связи]
    ReceiveFeedback --> ClassifyFeedback{Тип коррекции}
    
    ClassifyFeedback -->|Критерий| CriterionCorrection[Корректировка<br/>извлечения критерия]
    ClassifyFeedback -->|Оценка| EvaluationCorrection[Корректировка<br/>оценки соответствия]
    ClassifyFeedback -->|Релевантность| RelevanceCorrection[Корректировка<br/>поиска]
    
    CriterionCorrection --> SavePattern1[Сохранение паттерна<br/>извлечения]
    EvaluationCorrection --> SavePattern2[Сохранение паттерна<br/>оценки]
    RelevanceCorrection --> UpdateVectors[Обновление весов<br/>векторов]
    
    SavePattern1 --> UpdatePatternDB[(Обновление базы<br/>паттернов)]
    SavePattern2 --> UpdatePatternDB
    UpdateVectors --> UpdateVectorDB[(Обновление<br/>векторной БД)]
    
    UpdatePatternDB --> QueueTraining[Добавление в очередь<br/>обучения]
    UpdateVectorDB --> QueueTraining
    
    QueueTraining --> ProcessQueue{Обработка очереди}
    ProcessQueue --> FindSimilar[Поиск похожих<br/>случаев]
    FindSimilar --> ApplyPatterns[Применение<br/>паттернов]
    
    ApplyPatterns --> ValidateResults[Валидация<br/>результатов]
    ValidateResults --> UpdateStats[Обновление<br/>статистики успешности]
    
    UpdateStats --> End([Конец])

5. Процесс комплексной обработки тендера

flowchart TB
    Start([Начало]) --> Upload[Загрузка пакета<br/>документов]
    
    Upload --> Router{Источник}
    Router -->|Web| Manual[Ручная загрузка]
    Router -->|Network| Auto[Автоматический импорт<br/>из сетевого каталога]
    
    Manual --> Classify[Классификация<br/>документов]
    Auto --> Classify
    
    Classify --> ProcessTZ[Обработка ТЗ]
    Classify --> ProcessKPs[Обработка КП<br/>параллельно]
    
    subgraph "Обработка ТЗ"
        ProcessTZ --> OCRTZ{OCR?}
        OCRTZ -->|Да| RunOCRTZ[TrOCR +<br/>EasyOCR]
        OCRTZ -->|Нет| ExtractTZ[Извлечение<br/>текста]
        RunOCRTZ --> ExtractTZ
        ExtractTZ --> CriteriaTZ[Извлечение<br/>критериев LLM]
        CriteriaTZ --> WeightsTZ[Применение<br/>профиля весов]
    end
    
    subgraph "Обработка каждого КП"
        ProcessKPs --> OCRKP{OCR?}
        OCRKP -->|Да| RunOCRKP[TrOCR +<br/>EasyOCR]
        OCRKP -->|Нет| ExtractKP[Извлечение<br/>текста]
        RunOCRKP --> ExtractKP
        ExtractKP --> ChunkKP[Разбивка<br/>на чанки]
        ChunkKP --> VectorizeKP[Векторизация<br/>E5-large]
        VectorizeKP --> StoreKP[(Qdrant)]
    end
    
    WeightsTZ --> WaitSync{Синхронизация}
    StoreKP --> WaitSync
    
    WaitSync --> Analysis[Анализ соответствия<br/>всех КП]
    
    Analysis --> Scoring[Расчет скоров]
    Scoring --> Ranking[Ранжирование]
    Ranking --> Winner[Определение<br/>победителя]
    
    Winner --> GenReport[Генерация<br/>PDF-отчета]
    GenReport --> AssignNum[Присвоение<br/>уникального номера]
    AssignNum --> Protection[Защита PDF<br/>от редактирования]
    
    Protection --> Save[(Сохранение<br/>в БД)]
    Save --> Notify[Уведомление<br/>пользователя]
    
    Notify --> Feedback{Обратная<br/>связь?}
    Feedback -->|Да| FeedbackModule[Модуль<br/>обратной связи]
    Feedback -->|Нет| End([Конец])
    FeedbackModule --> End

6. Ожидаемые показатели производительности

6.1. Целевые метрики

Показатель Целевое значение Методы достижения
Время обработки тендера < 10 минут • Параллельная обработка КП
• Кэширование векторов
• Батчевая обработка в LLM
Точность OCR > 95% • Комбинация TrOCR + EasyOCR
• Постобработка результатов
Точность анализа > 95% • Использование больших LLM
• Векторный поиск для контекста
• Накопление паттернов
Одновременные пользователи 50+ • Горизонтальное масштабирование
• Очереди обработки
• Load balancing
Доступность системы 99% • Резервирование компонентов
• Мониторинг и алертинг
• Автоматическое восстановление

6.2. Архитектура масштабирования

graph TB
    subgraph "Load Balancer"
        LB[HAProxy/Nginx]
    end
    
    subgraph "Processing Nodes"
        N1[GPU Node 1<br/>LLM + OCR]
        N2[GPU Node 2<br/>LLM + OCR]
        N3[GPU Node N<br/>LLM + OCR]
    end
    
    subgraph "Queue System"
        RQ[Redis Queue]
        W1[Worker 1]
        W2[Worker 2]
        W3[Worker N]
    end
    
    subgraph "Data Layer"
        PG1[(PostgreSQL<br/>Master)]
        PG2[(PostgreSQL<br/>Replica)]
        QD1[(Qdrant<br/>Cluster)]
    end
    
    LB --> N1
    LB --> N2
    LB --> N3
    
    N1 --> RQ
    N2 --> RQ
    N3 --> RQ
    
    RQ --> W1
    RQ --> W2
    RQ --> W3
    
    W1 --> PG1
    W2 --> PG1
    W3 --> PG1
    
    PG1 --> PG2
    
    W1 --> QD1
    W2 --> QD1
    W3 --> QD1

7. Интеграционная архитектура

graph LR
    subgraph "Внешние системы"
        KC[Keycloak SSO]
        FS[Сетевой каталог<br/>документов]
        Mail[Email<br/>уведомления]
    end
    
    subgraph "Система анализа КП"
        API[API Gateway]
        Core[Ядро системы]
        Storage[Хранилище]
    end
    
    KC -->|OAuth 2.0| API
    FS -->|SMB/CIFS| Core
    Core -->|SMTP| Mail
    
    API --> Core
    Core --> Storage

8. Преимущества решения

8.1. Технологические преимущества

  • Полный контроль над инфраструктурой и данными (on-premise развертывание)
  • Независимость от внешних API и облачных сервисов
  • Гибкая настройка весов критериев под различные типы закупок
  • Накопление знаний без необходимости переобучения моделей

8.2. Бизнес-эффекты

Показатель Текущее состояние После внедрения Эффект
Время анализа КП 2-5 дней 10 минут Ускорение в 300+ раз
Трудозатраты экспертов 8-16 человеко-часов 0.5 человеко-часа Снижение на 95%
Риск ошибок Человеческий фактор Автоматическая проверка Снижение на 80%
Прозрачность процесса Субъективные решения Документированные критерии 100% аудируемость
Простои оборудования 5-10 дней на закупку 1-2 дня Сокращение на 80%

9. Этапы внедрения

gantt
    title План внедрения системы
    dateFormat YYYY-MM-DD
    section Этап 1: Подготовка
    Развертывание инфраструктуры    :2025-10-01, 14d
    Установка LLM-моделей            :2025-10-08, 7d
    Настройка баз данных             :2025-10-10, 5d
    
    section Этап 2: Разработка
    Модуль обработки документов      :2025-10-15, 10d
    Модуль анализа критериев         :2025-10-20, 10d
    Модуль оценки соответствия       :2025-10-25, 10d
    Модуль генерации отчетов         :2025-11-01, 7d
    
    section Этап 3: Интеграция
    Интеграция с Keycloak            :2025-11-05, 5d
    Настройка автоимпорта            :2025-11-08, 3d
    Модуль обратной связи            :2025-11-10, 5d
    
    section Этап 4: Тестирование
    Функциональное тестирование      :2025-11-15, 10d
    Нагрузочное тестирование         :2025-11-20, 5d
    Приемочное тестирование          :2025-11-25, 5d
    
    section Этап 5: Внедрение
    Пилотная эксплуатация           :2025-12-01, 10d
    Обучение пользователей          :2025-12-05, 5d
    Промышленная эксплуатация       :2025-12-10, 10d
    Сдача проекта                   :2025-12-20, 1d

10. Требования к инфраструктуре

10.1. Минимальные требования

Компонент Конфигурация
GPU-сервер для LLM • 2x NVIDIA A100 80GB или 4x A6000 48GB
• CPU: 32 cores
• RAM: 256GB
• SSD: 2TB NVMe
Сервер БД • CPU: 16 cores
• RAM: 64GB
• SSD: 1TB для БД
• HDD: 10TB для документов
Сервер приложений • CPU: 16 cores
• RAM: 32GB
• SSD: 500GB

10.2. Рекомендуемая конфигурация для 50+ пользователей

Компонент Конфигурация
GPU-кластер • 3x узла с 2x NVIDIA A100 80GB каждый
• Infiniband для связи между узлами
БД-кластер • 2x PostgreSQL (master-replica)
• 3x Qdrant nodes
Приложения • 3x application servers
• Load balancer
Хранилище • SAN/NAS система 50TB
• Backup система

Данное решение обеспечивает полную автоматизацию процесса анализа коммерческих предложений с использованием передовых технологий искусственного интеллекта при полном контроле над инфраструктурой и данными компании.