Механизм работы онтологической системы построения архитектуры ПО: от требований до C4‐модели - Towareesh/OntoC4Designer GitHub Wiki
Ядро системы: Интеграция ML-классификатора с онтологическими воронками через семантический процессор.
Последовательность работы:
graph TD
A[Текстовое требование] --> B(ML-классификатор)
B --> C{Определение типа}
C -->|FR| D[Привязка к функциональному компоненту]
C -->|NFR| E[Активация онтологической воронки]
E --> F[Семантическая обработка]
F --> G[Сужение архитектурных вариантов]
G --> H[Генерация C4-элементов]
H --> I[Сборка C4-модели]
Детализация ключевых этапов:
1. Классификация требования
- ML-модель определяет:
Тип
: FR/NFRПодтип
: Security, Performance и т.д.
- Пример:
"Система должна шифровать данные в REST API" → Security (SE)
2. Активация онтологической воронки
- Для NFR Security:
activate_voronka( type: 'Прикладное ПО', ontology: 'Security', rules: [ conflict('HighEncryption', 'LowLatency'), requires('DataInTransit', 'TLS'), component('CryptoService') ] )
3. Семантическая обработка
- Извлечение сущностей из текста:
"шифровать"
→ Операция: encrypt"REST API"
→ Компонент: Gateway
- Связь с онтологией:
INSERT { :req1 a :SecurityRequirement ; :hasAction :encrypt ; :appliesTo :Gateway . }
4. Сужение архитектурных вариантов
- Воронка применяет правила:
- Добавляет обязательные элементы:
API Gateway → TLS
- Исключает конфликтующие решения:
HTTP без шифрования
- Предлагает шаблоны:
{ "component": "CryptoService", "technology": ["AWS KMS", "Hashicorp Vault"], "interfaces": ["encrypt(data)", "decrypt(data)"] }
- Добавляет обязательные элементы:
5. Генерация C4-элементов
Уровень C4 | Генерация на основе онтологии |
---|---|
Контекст | Внешние системы, взаимодействующие с CryptoService |
Контейнеры | API Gateway, Сервис шифрования, БД ключей |
Компоненты | CryptoEngine, KeyManager, AuditLogger |
Код | Аннотации: @SecurityLevel(HSM) |
6. Сборка C4-модели
Автоматическая генерация в Structurizr:
@startuml
!include C4_Context.puml
System_Ext(Банк, "Платежная система")
System(Шифрование, "CryptoService")
Rel(Банк, Шифрование, "REST API (HTTPS)")
@enduml
Пример сквозного сценария
Ввод требования:
"Приложение должно обслуживать 10К пользователей с откликом <100мс"
Шаги системы:
- ML-классификация:
Performance (PE)
- Активация воронки для Performance:
rules: [ requires('HighLoad', 'HorizontalScaling'), excludes('VerticalScaling', 'BudgetLimit'), component('LoadBalancer') ]
- Семантическое извлечение:
10К пользователей
→ нагрузка: high_load<100мс
→ SLO: latency_critical
- Сужение вариантов:
- Добавляет: Kubernetes, Redis Cache
- Удаляет: Монолитную архитектуру
- Генерация C4:
- Контейнеры:
[API Gateway, AuthService, Redis, PostgreSQL]
- Компоненты:
[RateLimiter, CacheManager]
- Контейнеры:
- Выход:
{
"containers": [
{
"name": "RedisCache",
"technology": "Redis",
"purpose": "Кеширование ответов для соблюдения SLO"
}
],
"relationships": [
{
"source": "API_Gateway",
"target": "RedisCache",
"protocol": "RESP"
}
]
}
Гарантии корректности C4-модели:
- Конфликт-анализ: Онтологический движок проверяет:
check_conflicts( current_model, [latency < 100ms, encryption=aes256] ) → Разрешает/блокирует решения
- Проверка полноты:
- Автоматическое обнаружение неуказанных компонентов (например, нет Load Balancer для требований масштабируемости)
- Согласованность уровней:
- Связь контейнеров с компонентами через онтологические отношения
contains
- Связь контейнеров с компонентами через онтологические отношения
Техническая реализация:
class OntologyPipeline:
def __init__(self, ml_model, ontologies):
self.classifier = ml_model
self.voronkas = ontologies # Словарь воронок по типам ПО
def process(self, requirement: str):
# Этап 1: Классификация
req_type = self.classifier.predict(requirement)
# Этап 2: Активация воронки
voronka = self.voronkas.select(req_type.domain) # e.g., "Прикладное ПО"
context = voronka.activate(req_type)
# Этап 3: Семантический анализ
entities = NLPEngine.extract_entities(requirement)
context.bind(entities)
# Этап 4: Генерация C4
c4_model = C4Generator.generate(context)
# Этап 5: Валидация
if not OntologyValidator.validate(c4_model, voronka):
raise ArchitectureConflictError
return c4_model
Механизм работы системы на основе следующей онтологической схемы
graph TD
%% Пользовательский ввод
A[Текстовое требование] --> B(ML-классификатор)
%% Классификация
B --> C{Определение типа}
C -->|FR| D[Определение домена]
C -->|NFR| E[Определение домена]
%% Доменная маршрутизация
D --> F[SystemSoftware<br>онтология]
D --> G[ApplicationSoftware<br>онтология]
D --> H[ToolingSoftware<br>онтология]
E --> F
E --> G
E --> H
%% Онтологическая обработка
F --> I[Субдоменная<br>воронка:<br>• HWConstraint<br>• KernelFR<br>• RealtimeNFR]
G --> J[Субдоменная<br>воронка:<br>• UXConstraint<br>• BusinessRuleFR<br>• ScalabilityNFR]
H --> K[Субдоменная<br>воронка:<br>• IDEConstraint<br>• DebuggerFR<br>• CompatibilityNFR]
%% Генерация C4
I --> L[Генератор C4<br>контекста]
J --> M[Генератор C4<br>контейнеров]
K --> N[Генератор C4<br>компонентов]
%% Сборка модели
L --> O[C4-модель]
M --> O
N --> O
Пошаговый механизм работы
- Прием требования:
requirement = {
"text": "Система должна обеспечивать обработку 100К сообщений/сек с задержкой <10мс",
"source": "SRS-документ",
"priority": "HIGH"
}
- ML-классификация:
# Результат классификации
classification = {
"type": "NFR", # Functional/Non-functional
"subtype": "Performance",
"domain": "SystemSoftware",
"confidence": 0.92
}
- Активация онтологической воронки:
activate_voronka(
domain: system_software,
subtype: performance,
rules: [
requires(high_throughput, horizontal_scaling),
excludes(vertical_scaling, cost_constraint),
component(message_broker),
constraint(latency < 10ms)
]
)
- Обработка в воронке:
graph LR
A[100K msg/sec] --> B{Выбор технологии}
B --> C[Kafka] --> D[Подходит]
B --> E[RabbitMQ] --> F[Отклонено]
F -->|Причина| G[Не обеспечивает latency <10ms]
D --> H[Генерация C4-элементов]
- Генерация C4-элементов:
{
"context": {
"actors": ["ExternalProducer", "DataConsumer"],
"systems": ["KafkaCluster"]
},
"containers": [
{
"name": "MessageProcessor",
"technology": "Go",
"scaling": "horizontal"
}
],
"components": [
{
"name": "LatencyMonitor",
"responsibility": "Контроль времени обработки",
"constraints": ["p99 < 10ms"]
}
]
}
- Сборка полной модели:
@startuml
!include C4_Context.puml
System_Ext(ExternalProducer, "Внешний источник данных")
System_Boundary(kafka_cluster, "Обрабатывающий кластер") {
Container(message_queue, "Kafka", "Брокер сообщений")
Container(processor, "MessageProcessor", "Go-сервис")
Component(latency_monitor, "LatencyMonitor", "Мониторинг")
}
Rel(ExternalProducer, message_queue, "Отправка сообщений")
Rel(message_queue, processor, "Обработка")
Rel(processor, latency_monitor, "Метрики производительности")
@enduml
Ключевые интеграционные точки
- Онтологический роутер:
def route_requirement(requirement, classification):
domain_ontology = DOMAIN_ONTOLOGIES[classification['domain']]
voronka = domain_ontology.select_voronka(
type=classification['type'],
subtype=classification['subtype']
)
return voronka.process(requirement)
- Генератор C4 на онтологических правилах:
class C4Generator:
def generate(self, voronka_output):
elements = {}
# Контекст
if voronka_output.get('external_actors'):
elements['context'] = self._gen_context(voronka_output)
# Контейнеры
for component in voronka_output['required_components']:
elements['containers'].append(self._map_to_container(component))
# Компоненты
for constraint in voronka_output['constraints']:
elements['components'].append(self._constraint_to_component(constraint))
return C4Model(elements)
- Валидатор корректности:
validate_c4_model(Model) :-
check_conflicts(Model),
verify_completeness(Model),
assert_consistency(Model, domain_ontology).
Преимущества подхода
-
Автоматическая трассировка:
graph LR Req[Требование] --> Ont[Онтология] --> C4[C4-элемент] C4 -->|trace| Req
-
Консистентность между уровнями:
- Метаонтология → Общие принципы генерации
- Доменная онтология → Стиль диаграмм
- Субдоменная → Детализация компонентов
-
Адаптивность под тип ПО:
- SystemSoftware: Акцент на ресурсы, ядро
- ApplicationSoftware: Бизнес-логика, UX
- ToolingSoftware: Интерфейсы расширения
Пример вывода для разных доменов
Системное ПО (RealtimeNFR):
[Контейнер] RealTimeKernel:
- Технология: PREEMPT_RT
- Ограничения: гарантированное время отклика
- Компоненты: Scheduler, IRQ_Manager
Инструментальное ПО (CompatibilityNFR):
[Контейнер] CrossPlatformSDK:
- Технология: Qt
- Ограничения: поддержка Win/Linux/Mac
- Компоненты: UI_Adapter, NativeBridge
Прикладное ПО (ScalabilityNFR):
[Контейнер] StatelessService:
- Технология: Kubernetes Pod
- Ограничения: автоскейлинг по CPU
- Компоненты: RequestProcessor, CacheClient
Свойства результирующей C4-модели
Итоговые характеристики автоматически генерируемой архитектурной модели:
-
Полная трассируемость требований
- Прямая связь элементов модели с исходными FR/NFR
- Сквозная видимость от бизнес-требований до компонентов реализации
-
Семантическая согласованность
- Гарантированное соответствие онтологическим правилам
- Автоматическое разрешение конфликтов на этапе генерации
- Валидация ограничений предметной области
-
Контекстная адаптация
- Автоматическая оптимизация под тип ПО (прикладное/системное/инструментальное)
- Учет доменной специфики через ML-классификацию требований
-
Техническая готовность
- Поддержка экспорта в промышленные форматы (Structurizr/PlantUML)
- Генерация документации со встроенной трассировкой
- Непротиворечивость между уровнями абстракции (C4 Context → Containers → Components)
-
Автоматизированная генерация
- Сквозное преобразование требований в архитектурные артефакты
- Минимизация ручной работы при сохранении семантической целостности
Визуализация ключевых свойств
[ Требования ] → [ Онтологическая обработка ] → [ C4-модель ]
│ │ 1. Трассируемость ├─▶ Structurizr
├─ML─▶ Классификация │ 2. Согласованность ├─▶ PlantUML
│ │ 3. Контекстная адаптация └─▶ Документация
└─▶ Разрешение конфликтов