
# Komponuojama AI mikroservisų architektūra mastelio lygio saugumo klausimynų automatizavimui

Įmonės skęsta nuolat augančio saugumo klausimynų, tiekėjų vertinimų ir atitikties audito šuolio. Tradiciniai monolitiniai įrankiai sunkiai sekasi, ypač kai jie turi integruotis su skirtingomis produktų ekosistemomis, palaikyti daugiakalbes užklausas ir suteikti realaus laiko audito takelius.  

A **komponuojama mikroservisų architektūra**, sukurta aplink didelius kalbos modelius (LLM) ir informacijos atkūrimo patobulintą generavimą (RAG), siūlo būdą mastelinti automatizavimą, išlaikant lankstumą ir valdymą, kurio reikalauja reguliuojamos pramonės šakos. Šiame gidė:

* Apibrėžti pagrindinius projektavimo principus, kurie užtikrina, kad sistema būtų **saugi, audituojama ir išplečiama**.  
* Peržvelgti referencinę įgyvendinimo schemą, nupieštą Mermaid diagramoje.  
* Parodyti, kaip kiekviena paslauga gali būti diegiama savarankiškai Kubernetes, serverless FaaS arba krašto (edge) aplinkoje.  
* Pateikti konkretų geriausios praktikos rekomendacijas duomenų valdžiai, stebėjimui ir nuolatiniam tobulinimui.

> **TL;DR:** Išskaidykite klausimyno automatizacijos platformą į mažas, gerai apibrėžtas paslaugas, leiskite LLM veikti užstatine be būsenos inferencijos sluoksnyje ir naudokite įvykių valdomus duomenų srautus, kad išlaikytumėte vieną tikrąjį šaltinį įrodymams ir versijų kontrolei.

---

## 1. Kodėl komponuoti, o ne kurti milžinišką monolitą?

| Monolitinis požiūris | Komponuojami mikroservisai |
|-----------------------|----------------------------|
| Vienas kodo pagrindas, sunku mastelinti specifinius darbo krūvius (pvz., LLM inferenciją). | Nepriklausomas mastelis – AI inferencija gali būti vykdoma GPU mazguose, o saugojimas lieka patikimose objekto saugyklose. |
| Stiprus susiejimas daro atnaujinimus rizikingu; klaida vartotojo sąsajoje gali nuversti visą sistemą. | Laisvas susiejimas per asinkroninius įvykius arba HTTP API izoliuoja gedimus. |
| Ribota kalbų nepriklausoma integracija – dažnai priklausoma nuo vienos technologijų stųklos. | Poliglotas palaikymas – kiekviena paslauga gali būti rašoma geriausiai per savo užduočiai tinkama kalba (Go autentifikacijai, Python LLM orkestras, Rust didelės spartos duomenų srautams). |
| Audito ir atitikties valdymas tampa košmaru, kai žurnalai susikerta. | Centralizuota įvykių saugykla + nekintantis audito žurnalas suteikia aiškų, užklausų patogų takelį reguliuotojams. |

**Komponuojamas** modelis priima filosofiją *„kurk ką reikia ir pakeisk ką nereikia“*. Tai atitinka dinamišką saugumo klausimynų pobūdį, kai reguliariai atsiranda naujų kontrolės sistemų (pvz., [ISO 27001 Rev 2](https://www.iso.org/standard/27001)) ir komandos turi greitai prisitaikyti.

---

## 2. Pagrindinės architektūros skiltis

1. **Be būsena API šliuzas** – įėjimo taškas UI, SaaS jungikliams ir išoriniams įrankiams. Tvarko autentifikaciją, užklausų tikrinimą ir greitintoją.  
2. **Domenų specifiniai mikroservisai** – kiekvienas kapsuliuoja ribotą kontekstą:  
   * **Klausimyno paslauga** – saugo klausimyno metaduomenis, versijų valdymą ir užduočių paskirstymą.  
   * **Įrodymų paslauga** – tvarko artefaktus (politikas, ekrano nuotraukas, audito žurnalus) nekintamoje objekto saugykloje.  
   * **AI orkestras paslauga** – sudaro užklausas, vykdo RAG duomenų srautus ir grąžina atsakymų juodraščius.  
   * **Pokyčių aptikimo paslauga** – stebi įrodymų atnaujinimus, sukelia pertvarkymą paveiktų atsakymų.  
   * **Pranešimų paslauga** – siunčia Slack, Teams arba el. pašto įvykius suinteresuotiems asmenims.  
3. **Įvykių magistralė (Kafka / Pulsar)** – garantuoja bent vieną pristatymą domenų įvykiams (pvz., `EvidenceUploaded`, `AnswerDrafted`).  
4. **Stebėjimo stack** – OpenTelemetry sekos tarp paslaugų, Prometheus metrikos ir Loki žurnalai.  
5. **Politikos kaip kodo variklis** – įvertina atitikties taisykles (parašytas Rego arba OPA) prieš pažymint atsakymą kaip „galutinį“.

Visos paslaugos komunikuoja per **gRPC** (mažam delsimo) arba **REST** (išorinei integracijai). Dizainas skatina „kvailus kanalus, protingus galinius taškus“ – verslo logika yra ten, kur turėtų būti, o magistralė tik perneša pranešimus.

---

## 3. Duomenų srautas – nuo klausimo iki audituojamo atsakymo

Žemiau pateikiama Mermaid diagrama, vaizduojanti tipinį užklausos gyvavimo ciklą.

```mermaid
flowchart TD
    subgraph UI["Vartotojo sąsaja"]
        UI1["\"Web vartotojo sąsaja\""] -->|Pateikti klausimyną| AG["\"API šliuzas\""]
    end

    AG -->|Autentifikuoti ir patikrinti| QMS["\"Klausimyno paslauga\""]
    QMS -->|Gauti šabloną| AIOS["\"AI orkestras paslauga\""]
    AIOS -->|Gauti susijusius įrodymus| ES["\"Įrodymų paslauga\""]
    ES -->|Įrodymų objektai| AIOS
    AIOS -->|Vykdyti RAG duomenų srautus| RAG["\"RAG duomenų srautas\""]
    RAG -->|LLM išvestis| AIOS
    AIOS -->|Saugo juodraštį| QMS
    QMS -->|Išsiųsti AnswerDrafted| EB["\"Įvykių magistralė\""]
    EB -->|Paleisti| CDS["\"Pokyčių aptikimo paslauga\""]
    CDS -->|Perkelti dar kartą, jei įrodymas pasikeitė| AIOS
    CDS -->|Išsiųsti AnswerUpdated| EB
    EB -->|Siųsti į Slack/El. paštą| NS["\"Pranešimų paslauga\""]
    NS -->|Siųsti į vartotoją| UI

    style UI fill:#f9f,stroke:#333,stroke-width:2px
    style AG fill:#bbf,stroke:#333,stroke-width:1px
    style QMS fill:#bfb,stroke:#333,stroke-width:1px
    style AIOS fill:#ffb,stroke:#333,stroke-width:1px
    style ES fill:#fbb,stroke:#333,stroke-width:1px
    style RAG fill:#fdd,stroke:#333,stroke-width:1px
    style CDS fill:#ddf,stroke:#333,stroke-width:1px
    style NS fill:#cfc,stroke:#333,stroke-width:1px
```

**Svarbūs momentai sraute**:

1. **Vartotojas pateikia** naują klausimyną arba pasirenka esamą.  
2. **API šliuzas** patikrina JWT, riboja greitį ir perduoda į Klausimyno paslaugą.  
3. **Klausimyno paslauga** iškviečia AI orkestras paslaugą, kad gautų klausimyno šabloną.  
4. **AI orkestras** atlieka *atskaitos žingsnį* – perka įrodymus iš Įrodymų paslaugos, naudodamas vektorinę panašumą arba raktinių žodžių paiešką.  
5. Gauti kontekstai, kartu su šablonu, pateikiami **RAG duomenų srautui** (pvz., `openAI/gpt‑4o‑preview`).  
6. **Juodraštas** saugomas atgal į Klausimyno paslaugą, pažymėtas kaip *„laukiamas peržiūrėjimo“*.  
7. **Pokyčių aptikimo paslauga** stebi įrodymų įkėlimus. Jei politika atnaujinama, ji pakartoja RAG srautą paveiktiems atsakymams.  
8. Galutiniai recenzentai priima arba redaguoja juodraštį; priėmus, **Politikos kaip kodo variklis** patikrina, ar atsakymas atitinka visus taisyklių apribojimus prieš įrašant į nekintamą audito žurnalą.  

---

## 4. Įgyvendinimo detalės

### 4.1. API šliuzas (Envoy + OIDC)

* **Routavimas** – `POST /questionnaires/:id/answers` → `questionnaire-service`.  
* **Saugumas** – Įgyvendinti apimtis (`questionnaire:write`).  
* **Užklausų ribojimas** – 100 užklausų per minutę vienam nuomininkui, siekiant apsaugoti LLM išlaidas.

### 4.2. Klausimyno paslauga (Go)

```go
type Questionnaire struct {
    ID          string            `json:"id"`
    Version     int               `json:"version"`
    Controls    []Control        `json:"controls"`
    Drafts      map[string]Answer `json:"drafts"` // key = control ID
    AssignedTo  map[string]string `json:"assigned_to"` // userID
}
```

* Naudoja **PostgreSQL** reliaciniams duomenims ir **EventStoreDB** domenų įvykiams.  
* Teikia gRPC metodus `GetTemplate`, `SaveDraft`, `FinalizeAnswer`.

### 4.3. Įrodymų paslauga (Python + FastAPI)

* Saugo failus **MinIO** arba **AWS S3** su krepšelio lygiu šifravimu.  
* Indeksuoja turinį **Qdrant** (vektorinė duomenų bazė) panašumui ieškoti.  
* Teikia galutinį tašką `POST /search`, kuris priima užklausą ir grąžina top‑k artefaktų ID.

### 4.4. AI orkestras paslauga (Python)

```python
def generate_answer(question: str, evidence_ids: List[str]) -> str:
    evidence = fetch_evidence(evidence_ids)
    context = "\n".join(evidence)
    prompt = f"""Tu esi atitikties specialistas.
Naudodamas šiuos įrodymus, atsakyk į klausimą glaustai:\n{context}\n\nKlausimas: {question}"""
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role":"system","content":prompt}]
    )
    return response.choices[0].message.content
```

* **RAG** – sujungia vektorinės paieškos rezultatų kontekstą su sistemine užklausa, nurodančia LLM cituoti įrodymų ID.  
* **Kešavimas** – saugo sugeneruotus atsakymus 24 h, siekiant sumažinti dublikuotas LLM iškviestas.

### 4.5. Pokyčių aptikimo paslauga (Rust)

* Prenumeruoja `EvidenceUploaded` įvykius.  
* Apskaičiuoja **hash** naujam artefaktui ir palygina su esamais įrodymų rinkiniais, susijusiais su kiekviena kontrolės dalimi.  
* Jei skirtumas viršija nustatytą slenkstį, publikuoja `AnswerRequiresRegen`.

### 4.6. Pranešimų paslauga (Node.js)

* Klausosi `AnswerDrafted`, `AnswerFinalized`, `AnswerRequiresRegen`.  
* Formuoja „Slack blocks“, „Teams Adaptive Cards“ arba el. pašto šablonus.  
* Palaiko **deduplikavimą** – pranešimas siunčiamas tik kartą per pakeitimą klausimyno.

---

## 5. Saugumas ir valdymas

| Rizika | Mitigacija |
|--------|------------|
| **Duomenų nutekėjimas** – LLM užklausose gali būti jautrių politikos tekstų. | Naudoti **on‑prem LLM inferenciją** (pvz., Llama 3.2) viduje VPC. Maskuoti PII prieš siunčiant į išorines API. |
| **Neleistinas įrodymų priėjimas** | Įgyvendinti griežtą ACL per OPA politiką Įrodymų paslaugoje. |
| **Modelio nuosmukis** – atsakymų kokybė prastėja laikui bėgant. | Planuoti **periodišką vertinimą** su etalonu ir atnaujinti užklausų šablonus. |
| **Audito ir atitikties valdymas** – sunku sekti kas ir kada atliko veiksmą. | Kiekvienas būsenos pokytis įrašomas **nekintamame įvykių žurnale** saugomi **WORM S3**. |
| **GDPR / CCPA** – teisė būti pamirštam. | Įdiegti **right‑to‑be‑forgotten** procesą, kuris išvalo naudotojui priklausantį turinį iš vektorinės DB ir objektų saugyklos. |
| **ISO 27001** | Patikrinti, kad įrodymų saugojimas, šifravimas ir prieigos kontrolė atitinka ISO 27001 reikalavimus. |
| **HIPAA / SOC 2** | Išplėsti OPA taisykles, kad apriboti prieigą prie sveikatos duomenų ar kitų jautrių informacijos šaltinių. |

---

## 6. Mastelio didinimo strategijos

1. **Horizontalus Podų automatinis skalavimas (HPA)** – mastelinti AI orkestras podus pagal GPU išnaudojimą (`nvidia.com/gpu`).  
2. **Pūstinių eilių (Burst‑able) eilės** – naudoti Kafka skaidrumą izoliacijai tarp didelio apkrovimo klientų.  
3. **Šalto starto mažinimas** – palaikyti šiltą konteinerių grupę AI inferencijos serverio (pvz., su **KEDA** ir individualiu skalatoriumi).  
4. **Kontrolės išlaidos** – taikyti **token‑based biudžetą** kiekvienam klientui; automatiškai riboti arba apmokestinti viršijimus.  

---

## 7. Stebėjimas ir nuolatinis tobulinimas

* **Distribiutinės sekimosi (Distributed Tracing)** – OpenTelemetry spinduliai nuo UI užklausos → API šliuzo → AI orkestras → RAG → Įrodymų paslauga.  
* **Metrikos** – `answer_draft_latency_seconds`, `evidence_upload_bytes`, `llm_token_usage`.  
* **Žurnalų agregavimas** – struktūruoti JSON žurnalai su `request_id`, perduodami per visas paslaugas.  
* **Atsiliepimų ciklas** – po galutinio atsakymo, fiksuoti recenzento komentarus (`review_score`). Šį duomenį naudoti **reinforcement learning** modeliui, koreguojančiam užklausų temperaturą arba pasirenkantį alternatyvius įrodymus.

---

## 8. Žingsnis po žingsnio migracijos kelias esamoms komandų

| Etapas | Tikslas | Veiksmai |
|-------|---------|----------|
| **0 – Atranka** | Nustatyti dabartinį klausimyno darbų srautą. | Identifikuoti duomenų šaltinius, apibrėžti kontrolės taksonomiją. |
| **1 – Pagrindų sukūrimas** | Įdiegti API šliuzą, autentifikaciją ir bazines paslaugas. | konteinerizuoti `questionnaire-service` ir `evidence-service`. |
| **2 – AI integravimas** | Paleisti RAG pilotinį klausimyną. | Naudoti sandbox LLM, rankiniu būdu patikrinti juodraščius. |
| **3 – Įvykių valdymas** | Prijungti Change‑Detection duomenų srautą. | Įjungti automatinį perregeneravimą kai įkeliamas įrodymas. |
| **4 – Valdymo sustiprinimas** | Pridėti OPA politikas, nekintamus auditorijos žurnalus. | Pereiti prie gamybinės LLM (on‑prem). |
| **5 – Mastelio ir optimizavimas** | Skalavimas GPU podų, kontrolės išlaidų limitavimas. | Įdiegti stebėjimo stack, nustatyti SLO. |

Palaipsniui diegiant komponuojamą architektūrą, komandos išvengia „didžiojo šuolio“ rizikos ir gali anksti parodyti investicijų grąžą (dažnai **30‑50 %** sumažėjimas klausimyno atsakymo laiko).

---

## 9. Ateities atsparumas sistema

* **Federacinis mokymasis** – mokyti lengvus adapterius kiekvieno kliento duomenyse, neperkelti žaliavinių įrodymų iš jų aplinkos, taip didinant atsakymo aktualumą ir laikantis duomenų suvereniteto.  
* **Zero‑Trust serviso tinkle** – naudoti **Istio** arba **Linkerd** su abipusiu TLS, apsaugant vidinį srautą.  
* **Semantinė valdymas** – išplėsti Politikos kaip kodo variklį ne tik tikrinti atsakymo turinį, bet ir **semantinį panašumą** tarp įrodymo ir kontrolės kalbos.  
* **Generatyvių stebėjimų atsekamumas** – įrašyti tikslią LLM temperatūrą, top‑p, sisteminę užklausą šalia kiekvieno atsakymo, kad būtų galima forensiniams tyrimams.

---

## 10. Išvada

Komponuojama mikroservisų architektūra paverčia saugumo klausimynų automatizavimą iš **skausmingos rankinės užduoties** į **mastelį, audituojamą ir nuolat tobulinantį variklį**. Atskirdamas atsakomybės sritis į mažas, gerai apibrėžtas paslaugas, naudojant LLM per be būsenos RAG sluoksnį ir įvykių valdomus duomenų srautus, organizacijos gali:

* Atsakyti į tiekėjų vertinimus per minutes, o ne dienas.  
* Laikytis nuolat atnaujinamų įrodymų be rankinio darbo.  
* Reguliatoriams pateikti aiškų, užklausų patogų audito takelį.  

Pradėkite nuo mažų komponentų, greitai eksperimentuokite ir leiskite mikroservisų filosofijai vedžioti jus link ateities, kur atitiktis tampa **savybe**, o ne našta.  

---

## Taip pat žiūrėkite

- [OPA Politika kaip kodas mikroservisams](https://www.openpolicyagent.org/docs/latest/policy-language/)