# AI‑tehostama Retrieval‑Augmented Generation reaaliaikaiselle todisteiden kokoamiselle turvallisuuslomakkeissa

Turvallisuuslomakkeet, toimittajariskiarviot ja vaatimustenmukaisuustarkastukset ovat muodostuneet päivittäiseksi pullonkaulaksi SaaS‑yrityksissä. Käsin tapahtuva politiikkojen, auditointiraporttien ja konfiguraatio‑snapshottien etsiminen ei ainoastaan hukkaa insinöörien työaikaa, vaan se myös tuo mukanaan vääriin tai vanhentuneisiin vastauksiin liittyvän riskin.  

Retrieval‑Augmented Generation (RAG) esittelee uuden paradigman: sen sijaan, että luottaisi pelkästään staattiseen Large Language Model (LLM) -malliin, RAG **hakee kyselyn aikana eniten relevantit asiakirjat** ja syöttää ne mallille synteesiprosessia varten. Tuloksena on **reaaliaikainen, todisteisiin perustuva vastaus**, jonka alkuperä voidaan jäljittää takaisin lähteeseen, täyttäen sekä nopeus‑ että auditointivaatimukset.

Tässä artikkelissa tarkastelemme:

* RAG‑arkkitehtuurin ydinosa‑kohtia ja sen soveltuvuutta lomake‑työnkulkuun.  
* Miten Procurize voi upottaa RAG‑putken vaikuttamatta nykyisiin prosesseihin.  
* Askel askeleelta -toteutusopasta datan syötöstä vastauksen vahvistukseen.  
* Turvallisuus-, tietosuoja‑ ja vaatimustenmukaisuusnäkökohtia, jotka ovat erityisen tärkeitä tässä lähestymistavassa.  
* Mitattavissa oleva ROI ja tulevaisuuden parannuksia, kuten jatkuvaa oppimista ja dynaamista riskipistemääritystä.

---

## 1. Miksi perinteiset LLM‑mallit eivät riitä turvallisuuslomakkeisiin

| Rajoitus | Vaikutus lomakkeen automatisointiin |
|----------|--------------------------------------|
| **Staattinen tietojen katkaisupiste** | Vastaukset heijastavat mallin koulutuksen aikaisempaa tilannetta, eivät viimeisimpiä politiikkamuutoksia. |
| **Harhakuva‑riski** | LLM:t voivat tuottaa uskottavalta näennäistä tekstiä, jolla ei ole todellista perustaa asiakirjoissa. |
| **Lähdeviennin puute** | Tarkastajat vaativat suoraa linkkiä lähdeartefaktiin (politiikka, **[SOC 2]‑raportti**, konfiguraatiotiedosto). |
| **Sääntelyn rajoitukset** | Tietyt lainsäädännöt edellyttävät, että AI‑luodulla sisällöllä on varmennettavat ja muuttumattomat tiedot. |

Nämä puutteet pakottavat organisaatiot takaisin manuaaliseen kopioi‑ja‑liitä‑työhön, mikä kumoaa AI:n lupaaman tehokkuuden.

---

## 2. Retrieval‑Augmented Generation – Keskeiset käsitteet

RAG koostuu olennaisesti kolmesta osasta:

1. **Retriever** – Hakemisto (usein vektoripohjainen), joka pystyy nopeasti nappaamaan relevantit asiakirjat annettuun kysymykseen.  
2. **Generatiivinen malli** – LLM, joka käyttää haetut pätkät ja alkuperäisen lomake‑kysymyksen tuottaakseen yhtenäisen vastauksen.  
3. **Fusion‑kerros** – Logiikka, joka hallitsee, kuinka monta pätkää syötetään, niiden järjestyksen ja painotuksen generaation aikana.

### 2.1 Vektorivarastot todisteiden hakua varten

Jokainen vaatimustenmukaisuuden artefakti (politiikat, auditointiraportit, konfiguraatio‑snapshotit) upotetaan tiheään vektoriavaruuteen, mikä mahdollistaa semanttisen samankaltaisuushakujen toteuttamisen. Suosittuja avoimen lähdekoodin vaihtoehtoja ovat:

* **FAISS** – Nopea, GPU‑kiihtyvä, ihanteellinen suuritehoisille putkille.  
* **Milvus** – Pilvipohjainen, tukee hybridihakemistoa (scalar + vector).  
* **Pinecone** – Hallinnoitu palvelu, jossa on sisäänrakennetut turvallisuusasetukset.

### 2.2 Promptisuunnittelu RAG:lle

Hyvin muotoiltu prompti varmistaa, että LLM kohtelee haettua kontekstia *auktoritatiivisena todisteena*.

```text
Olet vaatimustenmukaisuusanalyytikko, joka vastaa turvallisuuslomakkeeseen. KÄYTÄ VAIN annettuja todistepätkiä. Viittaa jokaiseen pätkään sen lähde‑ID:n avulla. Jos vastausta ei voida täysin perustella, merkitse se manuaalista tarkistusta varten.
```

Prompti voidaan mallipohjaistaa Procurize‑järjestelmässä niin, että jokainen lomake‑kohta saa automaattisesti liitettyä todisteet.

---

## 3. RAG:n integrointi Procurize-alustaan

Alla on korkean tason kaaviokuva, joka havainnollistaa RAG:n sijoittumista olemassa olevaan Procurize‑työnkulkuun.

```mermaid
graph LR
    A["Lomakekohde"] --> B["RAG‑palvelu"]
    B --> C["Retriever (vektorivarasto)"]
    C --> D["Parhaat k‑t todistepätkät"]
    D --> E["LLM‑generaattori"]
    E --> F["Luonnos vastaus lähdeviitteineen"]
    F --> G["Procurize‑tarkistus UI"]
    G --> H["Lopullinen vastaus tallennettu"]
    style B fill:#f9f,stroke:#333,stroke-width:2px
    style G fill:#bbf,stroke:#333,stroke-width:2px
```

**Keskeiset integrointipisteet**

* **Käynnistin** – Kun käyttäjä avaa vielä vastaamattoman lomakekohdan, Procurize lähettää kysymystekstin RAG‑mikropalveluun.  
* **Kontekstin rikastus** – Retriever noutaa enintään *k* (yleensä 3‑5) relevanttia todistepätkää, joille annetaan vakaa tunniste (esim. `policy:ISO27001:5.2`).  
* **Vastausluonnos** – LLM tuottaa luonnoksen, jossa on sisäiset viittaukset kuten `[policy:ISO27001:5.2]`.  
* **Ihminen‑vuorovaikutus** – Tarkistus‑UI korostaa viitteet, sallii tarkistajien muokata, hyväksyä tai hylätä. Hyväksytyt vastaukset tallennetaan provenance‑metatiedoilla.

---

## 4. Vaiheittainen toteutusopas

### 4.1 Valmistele todisteaineistosi

| Toimenpide | Työkalu | Vihjeet |
|------------|---------|----------|
| **Kerää** | Sisäinen dokumenttivarasto (Confluence, SharePoint) | Säilytä kaikki vaatimustenmukaisuuden artefaktit yhdessä totuudenkäsittelykansiossa. |
| **Normitoi** | Pandoc, omat skriptit | Muunna PDF‑, DOCX‑ ja markdown‑tiedostot pelkeksi tekstiksi; poista ylätunnisteet/alatunnisteet. |
| **Tagaa** | YAML‑front‑matter, oma metatietopalvelu | Lisää kenttiä kuten `type: policy`, `framework: SOC2`, `last_modified`. |
| **Versioi** | Git LFS tai DMS, jossa on muuttumattomat versiot | Takaa todisteiden auditointikelpoisuus. |

### 4.2 Rakenna vektoriindeksi

```python
from sentence_transformers import SentenceTransformer
import faiss, json, glob, os

model = SentenceTransformer('all-MiniLM-L6-v2')
docs = []   # lista (id, teksti) -pareja
for file in glob.glob('compliance_corpus/**/*.md', recursive=True):
    with open(file, 'r') as f:
        content = f.read()
        doc_id = os.path.splitext(os.path.basename(file))[0]
        docs.append((doc_id, content))

ids, texts = zip(*docs)
embeddings = model.encode(texts, show_progress_bar=True)

dim = embeddings.shape[1]
index = faiss.IndexFlatL2(dim)
index.add(embeddings)

faiss.write_index(index, 'compliance.index')
```

* tallenna vektorien ID‑→‑asiakirjametadatan kartoitus kevyeseen NoSQL‑tauluun nopeaa hakua varten.

### 4.3 RAG‑palvelun käyttöönotto

Tyypillinen mikropalvelupräkki:

* **FastAPI** – Käsittelee HTTP‑kutsut Procurizelta.  
* **FAISS** – In‑process vektorihaku (tai ulkoinen gRPC‑palvelu).  
* **OpenAI / Anthropic LLM** – Generointipäätepiste (tai itse isännöity LLaMA).  
* **Redis** – Välimuistit viimeisimmille kyselyille latenssin vähentämiseksi.

```python
from fastapi import FastAPI, Body
import openai, numpy as np

app = FastAPI()

@app.post("/answer")
async def generate_answer(question: str = Body(...)):
    q_emb = model.encode([question])
    distances, idx = index.search(q_emb, k=4)
    snippets = [texts[i] for i in idx[0]]
    prompt = f"""Question: {question}
Evidence:\n{chr(10).join(snippets)}\nAnswer (cite sources):"""
    response = openai.Completion.create(
        model="gpt-4o-mini", prompt=prompt, max_tokens=300)
    return {"answer": response.choices[0].text.strip(),
            "citations": idx[0].tolist()}
```

### 4.4 Liitä Procurize‑käyttöliittymään

* Lisää “Luo AI‑avusteisesti” -painike jokaisen lomakekentän viereen.  
* Kun painiketta painetaan:  
  1. Näytä lataus‑spinneri RAG‑palvelun vastauksen odottamisen aikana.  
  2. Täytä vastauskenttä luonnoksella.  
  3. Renderöi lähde‑badgeja; painamalla badge avautuu lähdeasiakirjan esikatselu.  

### 4.5 Vahvistus ja jatkuva oppiminen

* **Ihmisen tarkistus** – Vaatimus, että vähintään yksi vaatimustenmukaisuusanalyytikko hyväksyy AI‑luodun vastauksen ennen julkaisemista.  
* **Palaute‑silmukka** – Kerää hyväksymis‑/hylkäys‑signaaleja “review outcomes” -tauluun.  
* **Fine‑tuning** – Ajoita mallin hienosäätö hyväksyttyjen QA‑parien perusteella, vähentääksesi harhakuvaa ajan myötä.  

---

## 5. Turvallisuus‑ ja tietosuoja‑kysymykset

| Huolenaihe | Hallintakeino |
|------------|----------------|
| **Tietovuoto** – Upotukset voivat paljastaa arkaluonteista tekstiä. | Käytä paikallisia upotusmalleja; vältä kolmannen osapuolen API‑kutsuja raakojen asiakirjojen kanssa. |
| **Mallin injektio** – Haitallinen kysely, joka pyrkii harhaanjohtamaan LLM:n. | Syötteen sanitointi, salli ainoastaan ennalta määritellyt kysymysmallit. |
| **Lähdeviitteiden manipulointi** – Lähde‑ID:n muuttaminen generoinnin jälkeen. | Tallenna lähde‑ID:t muuttumattomaan kirjanpitoon (esim. AWS QLDB tai lohkoketju). |
| **Sääntelytarkastukset** – AI‑luodun sisällön tarkistettavuus. | Lokita jokainen RAG‑pyyntö aikaleimalla, haetut upotusten tarkistussummat ja LLM:n version. |
| **Pääsynhallinta** – Vain valtuutetut roolit saavat käynnistää RAG:n. | Integroi Procurize‑RBAC; edellytä MFA:ta AI‑generoinnin toiminnoille. |

---

## 6. Vaikutuksen mittaaminen

Pilottikoe keskikokoisessa SaaS‑yrityksessä (≈150 insinööriä) kuuden viikon aikana tuotti seuraavat mittarit:

| Mittari | Ennen RAG‑käyttöä | RAG‑käytön jälkeen | Parannus |
|---------|-------------------|---------------------|----------|
| Keskimääräinen vastausluonnon aika | 12 min | 1,8 min | 85 % lyhenemä |
| Manuaalisten lähdevirheiden määrä | 27 % | 4 % | 85 % vähenemä |
| Tarkistajan hyväksymisprosentti (ensimmäisellä kierroksella) | 58 % | 82 % | +24 % |
| Kvartaali‑vaatimustenmukaisuuskustannus | $120 k | $78 k | $42 k säästö |

Nämä tulokset osoittavat, että RAG ei ainoastaan nopeuta vastausaikaa, vaan myös nostaa vastausten laatua ja vähentää auditoinnin kitkaa.

---

## 7. Tulevaisuuden laajennukset

1. **Dynaaminen riskipistemääritys** – Yhdistä RAG riskienhallintamoottoriin, joka säätää vastausluottamusta todisteiden iän perusteella.  
2. **Monimodaalinen haku** – Sisällytä skärshotteja, konfiguraatiotiedostoja ja jopa Terraform‑tilat haettavaksi.  
3. **Monialainen tietopuu** – Yhdistä todisteet eri tytäryhtiöiden välillä, mahdollistaen globaalin politiikkajärjestelmän yhtenäisyyden.  
4. **Reaaliaikaiset politiikkamuutosten hälytykset** – Kun lähdeasiakirja päivittyy, merkkaa automaattisesti kaikki vaikuttavat lomakevastaukset tarkistettaviksi.  

---

## 8. Aloituslista

- [ ] Koosta kaikki vaatimustenmukaisuuden artefaktit keskitettyyn, versioituun varastoon.  
- [ ] Valitse vektorivarasto (FAISS, Milvus, Pinecone) ja generoi upotukset.  
- [ ] Ota RAG‑mikropalvelu käyttöön sisäisessä verkossa.  
- [ ] Laajenna Procurize‑käyttöliittymä “Luo AI‑avusteisesti” –toiminnolla ja lähde‑viitteiden visualisoinnilla.  
- [ ] Määritä hallintapolitiikka ihmisen tarkistukselle ja palaute‑keruulle.  
- [ ] Pilotoi matalan riskin lomakkeiden joukossa; iteroi tarkastajien palautteen perusteella.  

Seuraamalla tätä tiekarttaa organisaatiosi voi siirtyä **reaktiivisesta, manuaalisesta** lomakeprosessista **proaktiiviseen, AI‑avusteiseen** toimintaan, joka tuottaa luotettavia todisteita napin painalluksella.

---

## Katso myös

- [Retrieval‑Augmented Generation: The Next Wave of Enterprise AI](https://arxiv.org/abs/2005.11401)  
- [FAISS: Efficient Similarity Search and Clustering of Dense Vectors](https://github.com/facebookresearch/faiss)  
- [OpenAI Cookbook – Prompt Engineering for Retrieval‑Augmented Generation](https://github.com/openai/openai-cookbook)