
# Reaaliaikainen noudattamisen pistetaulun ohjausliittymä Retrieval‑Augmented Generation -tekniikalla

## Johdanto  

Turvakyselyt, auditointilistat ja säädösarviot tuottavat valtavan määrän rakenteellista ja rakenteetonta dataa. Tiimit käyttävät lukemattomia tunteja vastauksien kopiointiin, todisteiden kartoitukseen ja noudattamisarvioiden manuaaliseen laskentaan. **Reaaliaikainen noudattamisen pistetaulun ohjausliittymä** poistaa tämän kitkan yhdistämällä kolme voimakasta tekijää:

1. **Retrieval‑Augmented Generation (RAG)** – LLM‑pohjainen synteesi, joka hakee relevantteja todisteita tietämyskannasta ennen vastauksen luomista.  
2. **Dynaaminen tietämyskartta** – Jatkuvasti päivittyvä graafi, joka yhdistää politiikat, kontrollit, todisteet ja kyselykohdat.  
3. **Mermaid‑pohjaiset visualisoinnit** – Elävä, interaktiivinen kaaviojärjestelmä, joka muuntaa raakagrafidatan intuitiivisiksi lämpökartoiksi, radarkuvioiksi ja virtauskaavioiksi.

Tuloksena on yhden näkymän paneeli, jossa sidosryhmät näkevät **riskialttiuden, todisteiden kattavuuden ja vastauksen luottamuksen** jokaiselle kyselykohdalle kaikissa säädöskehyksissä (esim. [SOC 2](https://secureframe.com/hub/soc-2/what-is-soc-2), [ISO 27001](https://www.iso.org/standard/27001), [GDPR](https://gdpr.eu/), jne.).  

Tässä artikkelissa tarkastelemme:

* Pistetaulun moottorin kokonaisarkkitehtuuria.  
* Kuinka suunnitella RAG‑kehotteita, jotka tuovat esiin luotettavimmat todisteet.  
* Tietämyskartan putkiston rakentamista, joka pysyy synkassa lähdedokumenttien kanssa.  
* Mermaid‑visualisointien renderöintiä, joka päivittyy reaaliajassa.  
* Skaalausnäkökulmia, turvallisuuden parhaita käytäntöjä sekä lyhyt tarkistuslista tuotantoon siirtymiselle.  

> **Generatiivisen moottorin optimointivinkki** – Pidä RAG‑kehotteet *lyhyinä, kontekstirikkaina ja ankkuroituina* ainutkertaisella todiste‑tunnisteella. Tämä maksimoi token‑tehokkuuden ja parantaa vastauksen tarkkuutta.

---

## 1. Järjestelmän yleiskatsaus  

Alla on korkean tason Mermaid‑kaavio, joka havainnollistaa tietovirran saapuvista kyselylomakkeista elävään pistetaulu‑UI:hin.

```mermaid
graph LR
    subgraph "Syötekerros"
        Q[ "Kyselylomakkeet" ]
        D[ "Dokumenttivarasto" ]
    end

    subgraph "Käsittelyydin"
        KG[ "Dynaaminen tietämyskartta" ]
        RAG[ "RAG‑moottori" ]
        Scorer[ "Noudattamislaskuri" ]
    end

    subgraph "Ulostulokerros"
        UI[ "Pistetaulun ohjausliittymä" ]
        Alerts[ "Reaaliaikaiset hälytykset" ]
    end

    Q -->|Syötetään| KG
    D -->|Jäsennetään & Indeksoidaan| KG
    KG -->|Kontekstin haku| RAG
    RAG -->|Luodut vastaukset| Scorer
    Scorer -->|Pisteet & Luottamus| UI
    Scorer -->|Kynnysylitys| Alerts
```

**Keskeiset komponentit**

| Komponentti | Tarkoitus |
|------------|-----------|
| **Kyselylomakkeet** | JSON‑ tai CSV‑tiedostot, jotka toimittavat toimittajat, myyntitiimit tai tarkastajat. |
| **Dokumenttivarasto** | Keskitetty säilytyspaikka politiikoille, kontrollikäskylehdille, auditointiraporteille ja todiste‑PDF‑tiedostoille. |
| **Dynaaminen tietämyskartta** | Neo4j‑tai vastaava graafi, jossa mallinnetaan *Kysymys ↔ Kontrolli ↔ Todiste ↔ Säädös* -suhteet. |
| **RAG‑moottori** | Hakukerros (vektoritietokanta) + LLM (Claude, GPT‑4‑Turbo). |
| **Noudattamislaskuri** | Laskee numeerisen noudattamispisteet, luottamusvälin ja riskiarvon per kysymys. |
| **Pistetaulun ohjausliittymä** | React‑pohjainen UI, joka renderöi Mermaid‑kaavioita ja numeerisia widgettejä. |
| **Reaaliaikaiset hälytykset** | Slack‑/Sähköposti‑webhook, joka ilmoittaa kohteista, jotka alittavat politiikkakynnykset. |

---

## 2. Tietämyskartan rakentaminen  

### 2.1 Kaavion suunnittelu  

Kompakti, mutta ilmaisuvoimainen kaavio pitää kyselyviiveen alhaisena. Seuraavat solmu‑/reunatyypit riittävät useimmille SaaS‑toimittajille:

```mermaid
classDiagram
    class Question {
        <<entity>>
        string id
        string text
        string framework
    }
    class Control {
        <<entity>>
        string id
        string description
        string owner
    }
    class Evidence {
        <<entity>>
        string id
        string type
        string location
        string hash
    }
    class Regulation {
        <<entity>>
        string id
        string name
        string version
    }
    Question --> "vaatii" Control
    Control --> "tukee" Evidence
    Control --> "karttaaa" Regulation
```

### 2.2 Ingestioputki  

1. **Jäsennys** – Käytä Document AI :ta (OCR + NER) poimiakseen kontrollien otsikot, todisteviitteet ja säädöskartoitukset.  
2. **Normalisointi** – Muunna jokainen entiteetti yllä olevaan kaavioon; poista duplikaatit hash‑arvon perusteella.  
3. **Rikastus** – Luo upotukset (esim. `text‑embedding‑3‑large`) jokaisen solmun tekstikentille.  
4. **Lataus** – Upsert‑toiminnoilla solmut ja relaatiot Neo4j:iin; upotukset tallennetaan vektoripohjaiseen tietokantaan (Pinecone, Weaviate).  

Kevyt Airflow‑DAG voi ajastaa putken 15 min välein, mikä takaa lähes reaaliaikaisen tuoreuden.

---

## 3. Retrieval‑Augmented Generation  

### 3.1 Kehotepohja  

Kehotteen tulee sisältää kolme osaa:

1. **Järjestelmäohje** – Määrittele mallin rooli (Noudattamisen avustaja).  
2. **Haettu konteksti** – Tarkat katkelmat tietämyskartasta (max 3 riviä).  
3. **Käyttäjän kysymys** – Kyselykohde, johon vastataan.

```text
You are a Compliance Assistant tasked with providing concise, evidence‑backed answers for security questionnaires.

Context:
{retrieved_snippets}
--- 
Question: {question_text}
Provide a short answer (<120 words). Cite the evidence IDs in brackets, e.g., [EVID‑1234].
If confidence is low, state the uncertainty and suggest a follow‑up action.
```

### 3.2 Hakustrategia  

- **Hybridihaku**: Yhdistä BM25‑avainsanahaku vektorisimilaarisuuteen, jotta saadaan sekä tarkka politiikkakieli että semanttisesti samankaltaiset kontrollit.  
- **Top‑k = 3**: Rajoita haun tulokset kolmeen todisteeseen, jotta token‑käyttö pysyy alhaisena ja jäljitettävyys paranee.  
- **Kynnysarvo**: Hylkää katkelmat, joiden samankaltaisuus on < 0.78, jotta vältetään kohinaa.

### 3.3 Luottamuspisteet  

Generoinnin jälkeen luodaan **luottamuspisteet** kaavalla:

```
confidence = (avg(retrieval_score) * 0.6) + (LLM token log‑probability * 0.4)
```

Jos `confidence < 0.65`, laskuri merkitsee vastauksen ihmisen tarkistettavaksi.

---

## 4. Noudattamislaskurin moottori  

Laskuri muuntaa jokaisen vastauksen numeeriseksi arvoksi **0‑100‑asteikolla**:

| Mittari | Painotus |
|---------|----------|
| Vastausten täydellisyys (tarvittavien kenttien täyttyminen) | 30 % |
| Todisteiden kattavuus (uniikit todiste‑ID:t) | 25 % |
| Luottamus (RAG‑luottamus) | 30 % |
| Säädöskriittisyys (korkean riskin kehyksiä) | 15 % |

Lopullinen pistemäärä on painotettu summa. Riskiluokitus määritellään näin:

* **0‑49** → Punainen (Kriittinen)  
* **50‑79** → Keltainen (Kohtalainen)  
* **80‑100** → Vihreä (Noudattava)

Nämä arvot syötetään suoraan visualisointipaneeliin.

---

## 5. Elävä pistetaulun ohjausliittymä  

### 5.1 Mermaid‑lämpökartta  

Lämpökartta tarjoaa heti visuaalisen näkymän kattavuudesta eri kehyksissä.

```mermaid
graph TB
    subgraph "SOC 2"
        SOC1["Luottamuspisteet: Turvallisuus"]
        SOC2["Luottamuspisteet: Saatavuus"]
        SOC3["Luottamuspisteet: Luottamuksellisuus"]
    end
    subgraph "ISO 27001"
        ISO1["A.5 Tietoturvapolitiikat"]
        ISO2["A.6 Tietoturvan organisointi"]
        ISO3["A.7 Henkilöstöturvallisuus"]
    end
    SOC1 -- 85% --> ISO1
    SOC2 -- 70% --> ISO2
    SOC3 -- 60% --> ISO3
    classDef green fill:#c8e6c9,stroke:#388e3c,stroke-width:2px;
    classDef amber fill:#fff9c4,stroke:#f57f17,stroke-width:2px;
    classDef red fill:#ffcdd2,stroke:#d32f2f,stroke-width:2px;
    class SOC1 green;
    class SOC2 amber;
    class SOC3 red;
```

Pistetaulun UI käyttää **React‑Flow**‑kirjastoa Mermaid‑koodin upottamiseen. Joka kerta, kun takapää päivittää pisteet, UI generoi uuden Mermaid‑merkkijonon ja renderöi kaavion, tarjoten käyttäjille **nollaviiveen** noudattamisen tilasta.

### 5.2 Riskijakauman radarkuvaaja  

```mermaid
radar
    title Riskijakauma
    categories Security Availability Confidentiality Integrity Privacy
    A: 80, 70, 55, 90, 60
```

Radarkuvaaja päivittyy WebSocket‑kanavan kautta, joka puskee päivitetyt numeeriset taulukot laskurilta suoraan frontendiin.

### 5.3 Vuorovaikutusmallit  

| Toiminto | UI‑elementti | Takapään kutsu |
|----------|--------------|----------------|
| **Syvä tarkastelu** | Klikkaus lämpökartan solmussa | Hae tarkat todisteet kyseiselle kontrollille |
| **Ohituksen korjaus** | Inline‑muokkauskenttä | Kirjoita suoraan tietämyskarttaan auditoidulla jäljityksellä |
| **Hälytysten asetukset** | Liukusäädin riskikynnykselle | Päivitä hälytys­sääntö Alert‑mikro‑palveluun |

---

## 6. Turvallisuus & Hallintomalli  

1. **Zero‑knowledge‑todistus todisteiden varmistukseen** – Tallennetaan jokaisen todiste‑tiedoston SHA‑256‑hash; kun tiedostoa haetaan, luodaan ZKP, joka todistaa eheyden paljastamatta itse sisältöä.  
2. **Roolipohjainen käyttöoikeusvalvonta (RBAC)** – OPA‑politiikoilla rajoitetaan, kuka voi muokata pisteitä vs. kuka voi vain katsella.  
3. **Audit‑loki** – Jokainen RAG‑kutsu, luottamuslaskenta ja pistelaskun päivitys kirjataan muuttumattomaan lisättävään lokiin (esim. Amazon QLDB).  
4. **Tietojen sijainti** – Vektoripohjainen tietokanta ja Neo4j voidaan sijoittaa EU‑West‑1‑alueelle GDPR‑yhteensopivuuden varmistamiseksi, kun taas LLM toimii alueellisesti suljetussa instanssissa, jossa on yksityinen päätepiste.

---

## 7. Moottorin skaalaus  

| Haaste | Ratkaisu |
|--------|----------|
| **Suuri määrä kyselyitä** (10 k+ päivässä) | RAG toteutetaan **serverless‑kontainerissa** API‑gatewayn takana; autoscaling perustuu vasteaikaan. |
| **Upotusten jatkuva päivitys** (uudet politiikat jokainen tunti) | Inkriementaalinen upotus: lasketaan upotukset vain muokatuille tiedostoille, muuta välimuistissa. |
| **Dashboard‑viive** | Päivitetään push‑viestillä Server‑Sent Events; välimuistitetaan Mermaid‑merkkijonot kullekin kehykselle nopeaa uudelleenkäyttöä varten. |
| **Kustannusten hallinta** | Käytetään kvantisoituja upotuksia (8‑bit) ja ryhmitellään LLM‑kutsut (max 20 kysymystä) hyödynnetään kustannusten hajauttamiseksi. |

---

## 8. Toteutustarkistuslista  

- [ ] Määrittele tietämyskartan kaavio ja tuo alkuperäinen politiikkadokumentaatio.  
- [ ] Perusta vektoripohjainen tietokanta ja hybriidihakuputki.  
- [ ] Luo RAG‑kehotepohja ja integroi valittu LLM.  
- [ ] Implementoi luottamuspisteiden laskentakaava ja kynnysarvot.  
- [ ] Rakenna noudattamislaskuri painotetuilla mittareilla.  
- [ ] Suunnittele React‑pohjainen UI Mermaid‑komponenttien (lämpökartta, radar, virtauskaavio) kanssa.  
- [ ] Konfiguroi WebSocket‑kanava reaaliaikaisia päivityksiä varten.  
- [ ] Ota käyttöön RBAC‑ ja audit‑logi‑välitteet.  
- [ ] Aja staging‑ympäristössä kuormitustesti 5 k QPS:lle.  
- [ ] Aktivoi Slack/Teams‑webhook hälytyksiin, jotka ylittävät politiikkakynnykset.  

---

## 9. Käytännön vaikutus  

Pilottiprojekti keskikokoisessa SaaS‑yrityksessä osoitti **70 %**:n ajansäästön turvakyselyihin vastaamisessa. Elävä pistetaulu nosti esiin vain kolme merkittävää riskinaukkua, mikä mahdollisti turvallisuustiimin resurssien kohdistamisen tarkasti. Lisäksi luottamus‑pohjainen hälytys esti potentiaalisen noudattamisvirheen, kun puuttuva [SOC 2](https://secureframe.com/hub/soc-2/what-is-soc-2) -todiste havaittiin **48 tunnin** ennen suunniteltua auditointia.

---

## 10. Tulevaisuuden kehitysideoita  

1. **Federatiivinen RAG** – Hakeminen kumppaniyritysten todisteista ilman datan siirtoa, hyödyntäen turvattua moniosapuolista laskentaa.  
2. **Generatiivinen UI** – Anna LLM:n luoda Mermaid‑kaavioita suoraan luonnollisesta lauseesta, esim. “näytä lämpökartta ISO 27001‑kattavuudesta”.  
3. **Ennustava pisteytys** – Syötä historialliset pisteet aika‑sarjamalliin, jonka avulla ennustetaan tulevia noudattamisaukkoja.  

---

## Katso myös  

- [Retrieval‑Augmented Generation: A Practical Guide – LangChain Docs](https://python.langchain.com/docs/use_cases/retrieval_qa)  
- [Mermaid Live Editor & Documentation](https://mermaid-js.github.io/mermaid/#/)