Структура КП
Система автоматизированного анализа коммерческих предложений
Высокоуровневое описание решения
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 система |
Данное решение обеспечивает полную автоматизацию процесса анализа коммерческих предложений с использованием передовых технологий искусственного интеллекта при полном контроле над инфраструктурой и данными компании.
No comments to display
No comments to display