
# Динамічний синтез політик за допомогою LLM та контексту ризику в режимі реального часу

**Анотація** – Анкети безпеки постачальників є відомою «вузькою» точкою для SaaS‑компаній. Традиційні статичні сховища тримають політики «закріпленими» у часі, змушуючи команди вручну редагувати відповіді щоразу, коли з’являється новий сигнал ризику. У цій статті представлено *Динамічний синтез політик* (DPS) – концепцію, що поєднує великі мовні моделі (LLM), безперервну телеметрію ризиків та подієво‑керований оркестраційний шар для створення актуальних, контекстно‑залежних відповідей на вимогу. Після прочитання ви зрозумієте основні компоненти, потік даних і практичні кроки впровадження DPS у платформі Procurize.

---

## 1. Чому статичні бібліотеки політик не підходять для сучасних аудитів

1. **Затримка змін** – Нововиявлена вразливість у сторонньому компоненті може анулювати пункт, затверджений шість місяців тому. Статичні бібліотеки вимагають ручного циклу правок, що може займати дні.  
2. **Невідповідність контексту** – Один і той самий контроль може інтерпретуватись по‑різному залежно від поточної загрози, сфері контракту чи географічних регуляцій.  
3. **Тиск на масштабованість** – Швидко зростаючі SaaS‑компанії отримують десятки анкет на тиждень; кожна відповідь має відповідати найсвішому ризиковому профілю, що неможливо гарантувати вручну.

Ці болі підштовхують до створення *адаптивної* системи, яка може **запитувати** та **вставляти** ризикові інсайти в реальному часі і автоматично переводити їх у законну політичну мову.

---

## 2. Основні стовпи Динамічного синтезу політик

| Стовпець | Функція | Типовий технічний стек |
|----------|----------|------------------------|
| **Інтеграція телеметрії ризиків** | Потоково передає дані про вразливості, сповіщення про погрози та внутрішні метрики безпеки в уніфіковане сховище даних. | Kafka, AWS Kinesis, ElasticSearch |
| **Контекстний рушій** | Нормалізує телеметрію, збагачує інвентарем активів і обчислює *ризиковий бал* для кожного домену контролю. | Python, Pandas, Neo4j Knowledge Graph |
| **Генератор підказок LLM** | Створює доменно‑специфічні підказки, які включають найновіший ризиковий бал, нормативні посилання та шаблони політик. | OpenAI GPT‑4, Anthropic Claude, LangChain |
| **Оракестраційний шар** | Координує події, запускає LLM, зберігає згенерований текст і сповіщає рецензентів. | Temporal.io, Airflow, Serverless Functions |
| **Аудиторський журнал та версіонування** | Зберігає кожну згенеровану відповідь з криптографічними хешами для аудиту. | Git, Immutable Object Store (наприклад, S3 з Object Lock) |

Разом вони утворюють замкнутий цикл, який трансформує сирі сигнали ризику у відполіровані відповіді, готові до заповнення анкет.

---

## 3. Потік даних у вигляді схеми

```mermaid
flowchart TD
    A["Джерела потоків ризиків"] -->|Kafka Stream| B["Сировинне озеро телеметрії"]
    B --> C["Нормалізація та збагачення"]
    C --> D["Рушій оцінки ризику"]
    D --> E["Контекстний пакет"]
    E --> F["Конструктор підказок"]
    F --> G["LLM (GPT‑4)"]
    G --> H["Чернетка пункту політики"]
    H --> I["Центр людського рецензування"]
    I --> J["Сховище схвалених відповідей"]
    J --> K["UI анкети Procurize"]
    K --> L["Відправка постачальнику"]
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style L fill:#9f9,stroke:#333,stroke-width:2px
```

*Текст у вузлах взятий у подвійні лапки, як вимагалося.*

---

## 4. Побудова генератора підказок

Якісний підхід – це секретний інгредієнт. Нижче наведено фрагмент Python, який демонструє, як зібрати підказку, об’єднуючи контекст ризику з багаторазовим шаблоном.

```python
import json
from datetime import datetime

def build_prompt(risk_context, template_id):
    # Load a stored clause template
    with open(f"templates/{template_id}.md") as f:
        template = f.read()

    # Insert risk variables
    prompt = f"""
You are a compliance specialist drafting a response for a security questionnaire.
Current risk score for the domain "{risk_context['domain']}" is {risk_context['score']:.2f}.
Relevant recent alerts: {", ".join(risk_context['alerts'][:3])}
Regulatory references: {", ".join(risk_context['regulations'])}

Using the following template, produce a concise, accurate answer that reflects the latest risk posture.

{template}
"""
    return prompt.strip()

# Example usage
risk_context = {
    "domain": "Data Encryption at Rest",
    "score": 0.78,
    "alerts": ["CVE‑2024‑1234 affecting AES‑256 modules", "New NIST guidance on key rotation"],
    "regulations": ["ISO 27001 A.10.1", "PCI DSS 3.2"]
}
print(build_prompt(risk_context, "encryption_response"))
```

Згенерована підказка передається LLM через API‑виклик, а отриманий текст зберігається як *чернетка*, що очікує швидкого ручного затвердження.

---

## 5. Оракестрація в реальному часі за допомогою Temporal.io

Temporal забезпечує workflow‑as‑code, дозволяючи нам визначити надійний, стійкий до помилок конвеєр.

```goat
workflow DynamicPolicyWorkflow(riskEvent RiskEvent, questionnaireID string) {
    // Step 1: Build context package
    contextPkg := Activity(BuildContextPackage, riskEvent)

    // Step 2: Generate LLM prompt
    prompt := Activity(BuildPrompt, contextPkg, questionnaireID)

    // Step 3: Call LLM
    draft := Activity(CallLLM, prompt)

    // Step 4: Store draft and notify reviewer
    Activity(StoreDraftAndNotify, draft, questionnaireID)

    // Optional: Auto‑approval if risk score < 0.2
    if contextPkg.Score < 0.2 {
        Activity(AutoApprove, draft, questionnaireID)
    }
}
```

Workflow гарантує точно‑один раз виконання, автоматичні повтори при тимчасових збоях і прозору візуалізацію через Temporal UI – критично важливе для аудиторів відповідності.

---

## 6. Управління «Людина‑в‑цикл» (HITL)

Навіть найкраща LLM може „галюцинувати“. DPS включає легкий крок HITL:

1. **Рецензент отримує сповіщення у Slack/Teams** з побічним переглядом чернетки та підкладеного контексту ризику.  
2. **Одне‑клікове схвалення** записує остаточну відповідь у незмінному сховищі та оновлює UI анкети.  
3. **Відхилення** ініціює зворотний зв’язок, який анотує підказку, покращуючи майбутні генерації.

Журнали аудиту фіксують ID рецензента, мітку часу та криптографічний хеш схваленого тексту, задовольняючи більшість вимог [SOC 2](https://secureframe.com/hub/soc-2/what-is-soc-2) та [ISO 27001](https://www.iso.org/standard/27001).

---

## 7. Версіонування та доказова база

Кожен згенерований пункт фіксується у сховищі, сумісному з Git, разом із метаданими:

```json
{
  "questionnaire_id": "Q-2025-09-14",
  "control_id": "C-ENCR-01",
  "risk_score": 0.78,
  "generated_at": "2025-10-22T14:03:12Z",
  "hash": "sha256:9f8d2c1e...",
  "reviewer": "alice.smith@example.com",
  "status": "approved"
}
```

Незмінне сховище (S3 Object Lock) гарантує, що докази не можна змінити після створення, забезпечуючи ланцюжок застави для аудитів.

---

## 8. Кількісні переваги

| Метрика | До DPS | Після DPS (12 міс.) |
|---------|--------|----------------------|
| Середній час відповіді | 3,2 дня | 3,5 години |
| Час ручного редагування | 25 год/тиждень | 6 год/тиждень |
| Прогалини в доказах аудиту | 12 % | <1 % |
| Покриття відповідності (контролі) | 78 % | 96 % |

Ці цифри отримані під час пілотного запуску у трьох середніх SaaS‑компаніях, які інтегрували DPS у своє середовище Procurize.

---

## 9. Чек‑ліст впровадження

- **[ ]** Налаштувати платформу потокової передачі (Kafka) для ризикових потоків.  
- **[ ]** Побудувати граф знань Neo4j, що поєднує активи, контролі та інформацію про погрози.  
- **[ ]** Створити багаторазові шаблони пунктів у Markdown.  
- **[ ]** Розгорнути мікросервіс генератора підказок (Python/Node).  
- **[ ]** Забезпечити доступ до LLM (OpenAI, Azure OpenAI тощо).  
- **[ ]** Налаштувати робочий процес Temporal або DAG Airflow.  
- **[ ]** Інтегрувати з UI рецензій Procurize.  
- **[ ]** Увімкнути незмінне логування (Git + S3 Object Lock).  
- **[ ]** Провести безпековий огляд самого коду оркестрації.

Виконання цих кроків дасть вашій організації готовий до продакшну конвеєр DPS за 6‑8 тижнів.

---

## 10. Перспективи розвитку

1. **Федеративне навчання** – Навчати адаптери LLM, орієнтовані на домен, без перенесення сирих даних за межі корпоративного фаерволу.  
2. **Диференціальна конфіденційність** – Додавати шум до ризикових балів перед їх передачею у генератор підказок, зберігаючи конфіденційність без втрати користі.  
3. **Докази з нульовим розкриттям** – Дозволяти постачальникам перевіряти, що відповідь відповідає ризиковій моделі, не розкриваючи самих даних.  

Ці напрямки досліджень зроблять Динамічний синтез політик ще більш безпечним, прозорим та дружнім до регуляторів.

---

## 11. Висновок

Динамічний синтез політик перетворює виснажливе, схильне до помилок заповнення анкет безпеки у **службу в реальному часі, підтверджену доказами**. Поєднуючи живу телеметрію ризиків, контекстний рушій і потужні LLM у оркестрованому workflow, організації можуть різко скоротити час реакції, підтримувати постійне дотримання вимог і надати аудиторам незмінні докази точності. У поєднанні з Procurize DPS стає конкурентною перевагою – перетворюючи дані про ризики у стратегічний актив, що прискорює укладання угод і підвищує довіру.