docs: plan for Control Relevance Filter (3-stage: rules, LLM, follow-up)
Addresses false-positive controls like C_TRANSPARENCY being recommended when no AI usage is evident. Plan for separate implementation session. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
171
zeroclaw/PLAN-control-relevance-filter.md
Normal file
171
zeroclaw/PLAN-control-relevance-filter.md
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
# Plan: Control Relevance Filter — Generische Controls kontextsensitiv filtern
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
Die UCCA-Engine empfiehlt Controls pauschal basierend auf Intake-Flags (Boolean-Felder wie
|
||||||
|
`personal_data: true`, `marketing: true`). Sie prueft NICHT, ob der analysierte Text die
|
||||||
|
Bedingungen fuer einen spezifischen Control tatsaechlich erfuellt.
|
||||||
|
|
||||||
|
### Konkretes Beispiel (Opodo-Test, 2026-04-28)
|
||||||
|
|
||||||
|
- **Control:** `[C_TRANSPARENCY] Nutzer informieren dass sie mit KI interagieren`
|
||||||
|
- **Quelle:** AI Act Art. 52 — nur relevant wenn KI eingesetzt wird
|
||||||
|
- **Opodo sagt:** "automated processing" (kann regelbasierte Software sein, muss keine KI sein)
|
||||||
|
- **Ergebnis:** False Positive — Control wird empfohlen obwohl kein KI-Einsatz belegt ist
|
||||||
|
|
||||||
|
### Skalierung
|
||||||
|
|
||||||
|
Von ~166.740 Controls in der RAG-Datenbank wird ein unbekannter Prozentsatz
|
||||||
|
bei jeder Bewertung generisch empfohlen. Jedes False Positive untergräbt das
|
||||||
|
Vertrauen des Nutzers und macht das Tool fuer Abmahnungen unbrauchbar.
|
||||||
|
|
||||||
|
## Loesung: 3-Stufen Relevance Filter
|
||||||
|
|
||||||
|
### Stufe 1: Regelbasierter Vorfilter (deterministisch, schnell)
|
||||||
|
|
||||||
|
Jeder Control bekommt ein `relevance_conditions` Feld (JSON):
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"control_id": "C_TRANSPARENCY",
|
||||||
|
"relevance_conditions": {
|
||||||
|
"text_must_contain_any": ["KI", "kuenstliche Intelligenz", "artificial intelligence",
|
||||||
|
"machine learning", "maschinelles Lernen", "neural", "deep learning",
|
||||||
|
"AI system", "AI-System", "algorith"],
|
||||||
|
"text_must_not_contain": [],
|
||||||
|
"requires_intake_flag": "automation",
|
||||||
|
"min_confidence": 0.5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Implementierung:**
|
||||||
|
- Neues Feld `relevance_conditions` in `compliance.canonical_controls` (JSONB)
|
||||||
|
- Funktion `check_relevance(control, source_text) -> (relevant: bool, confidence: float)`
|
||||||
|
- Laeuft NACH dem UCCA-Assessment, BEVOR das Ergebnis zurueckgegeben wird
|
||||||
|
- Filtert Controls raus deren Keywords im Quelltext nicht vorkommen
|
||||||
|
|
||||||
|
**Aufwand:** ~200 LOC Python, kein LLM-Call noetig
|
||||||
|
**Datei:** `ai-compliance-sdk/internal/ucca/relevance_filter.go` oder `backend-compliance/compliance/services/relevance_filter.py`
|
||||||
|
|
||||||
|
### Stufe 2: LLM-Validierung (fuer High-Value Controls)
|
||||||
|
|
||||||
|
Fuer Controls mit `severity >= HIGH` oder wenn der regelbasierte Filter unsicher ist
|
||||||
|
(confidence < 0.7), wird Qwen gefragt:
|
||||||
|
|
||||||
|
```
|
||||||
|
Gegeben dieser Dokumenttext:
|
||||||
|
"[...Auszug...]"
|
||||||
|
|
||||||
|
Ist der folgende Control relevant fuer dieses Dokument?
|
||||||
|
Control: "[C_TRANSPARENCY] Nutzer informieren dass sie mit KI interagieren"
|
||||||
|
Rechtsgrundlage: Art. 52 AI Act
|
||||||
|
|
||||||
|
Antworte NUR mit: JA (mit Begruendung) oder NEIN (mit Begruendung)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Implementierung:**
|
||||||
|
- Neuer Endpoint: `POST /sdk/v1/ucca/validate-controls`
|
||||||
|
- Nimmt: `assessment_id`, `source_text`, `controls[]`
|
||||||
|
- Gibt zurueck: `controls[]` mit `relevant: bool`, `reason: string`
|
||||||
|
- Cached: Gleicher Text + Control = gleiche Antwort (24h TTL)
|
||||||
|
|
||||||
|
**Aufwand:** ~150 LOC, 1 LLM-Call pro Control (parallelisierbar)
|
||||||
|
|
||||||
|
### Stufe 3: Follow-Up-Fragen an den Nutzer (Hybrid)
|
||||||
|
|
||||||
|
Wenn weder Regel noch LLM sicher entscheiden koennen:
|
||||||
|
|
||||||
|
```
|
||||||
|
Follow-Up: "Setzt der Anbieter KI oder maschinelles Lernen ein?"
|
||||||
|
→ Ja: Control bleibt
|
||||||
|
→ Nein: Control wird entfernt
|
||||||
|
→ Unsicher: Control bleibt mit Hinweis "Nicht verifizierbar"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Bereits implementiert:** Das `follow_up_questions` System im Agent-Endpoint.
|
||||||
|
|
||||||
|
## Datenmodell-Aenderung
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Neues Feld in canonical_controls
|
||||||
|
ALTER TABLE compliance.canonical_controls
|
||||||
|
ADD COLUMN IF NOT EXISTS relevance_conditions JSONB DEFAULT '{}';
|
||||||
|
|
||||||
|
-- Index fuer schnelle Abfrage
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_controls_relevance
|
||||||
|
ON compliance.canonical_controls USING gin (relevance_conditions);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architektur
|
||||||
|
|
||||||
|
```
|
||||||
|
UCCA Assessment
|
||||||
|
│
|
||||||
|
▼
|
||||||
|
┌────────────────────┐
|
||||||
|
│ Stufe 1: Regelfilter│ ← text_must_contain_any, intake_flags
|
||||||
|
│ (deterministisch) │
|
||||||
|
└────────┬───────────┘
|
||||||
|
│ unsicher oder high-severity
|
||||||
|
▼
|
||||||
|
┌────────────────────┐
|
||||||
|
│ Stufe 2: LLM-Check │ ← Qwen validiert Relevanz
|
||||||
|
│ (1 Call/Control) │
|
||||||
|
└────────┬───────────┘
|
||||||
|
│ immer noch unsicher
|
||||||
|
▼
|
||||||
|
┌────────────────────┐
|
||||||
|
│ Stufe 3: Follow-Up │ ← Nutzer beantwortet Frage
|
||||||
|
│ (Frontend) │
|
||||||
|
└────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Implementierungsreihenfolge
|
||||||
|
|
||||||
|
### Phase 1: Regelfilter (1 Tag)
|
||||||
|
|
||||||
|
1. Migration: `relevance_conditions` Feld zu `canonical_controls`
|
||||||
|
2. Seed-Script: Top-20 generische Controls mit Bedingungen versehen
|
||||||
|
(C_TRANSPARENCY, C_EXPLICIT_CONSENT, C_DSFA_REQUIRED, etc.)
|
||||||
|
3. Filter-Funktion in `agent_analyze_routes.py`
|
||||||
|
4. Test: Opodo erneut analysieren — C_TRANSPARENCY sollte rausfallen
|
||||||
|
|
||||||
|
### Phase 2: LLM-Validierung (1 Tag)
|
||||||
|
|
||||||
|
1. Neuer SDK-Endpoint `/sdk/v1/ucca/validate-controls`
|
||||||
|
2. Integration in den Agent-Workflow
|
||||||
|
3. Caching-Layer (Redis/Valkey)
|
||||||
|
|
||||||
|
### Phase 3: Batch-Seeding (2-3 Tage)
|
||||||
|
|
||||||
|
1. Pipeline-Job: Fuer alle 166k Controls `relevance_conditions` generieren
|
||||||
|
(LLM-gestuetzt: "Welche Keywords im Quelltext wuerden diesen Control relevant machen?")
|
||||||
|
2. Qualitaetspruefung: Stichprobe von 100 Controls manuell validieren
|
||||||
|
|
||||||
|
## Betroffene Dateien
|
||||||
|
|
||||||
|
| Datei | Aenderung |
|
||||||
|
|-------|-----------|
|
||||||
|
| `backend-compliance/compliance/api/agent_analyze_routes.py` | Filter-Integration |
|
||||||
|
| `backend-compliance/compliance/services/relevance_filter.py` | NEU: Regelfilter |
|
||||||
|
| `ai-compliance-sdk/internal/ucca/relevance_filter.go` | NEU: SDK-seitig (alternativ) |
|
||||||
|
| `ai-compliance-sdk/internal/api/handlers/ucca_handlers.go` | Neuer Endpoint |
|
||||||
|
| Migration | `relevance_conditions` Spalte |
|
||||||
|
| `control-pipeline/` | Batch-Seeding Job (Phase 3) |
|
||||||
|
|
||||||
|
## Risiken
|
||||||
|
|
||||||
|
| Risiko | Mitigation |
|
||||||
|
|--------|------------|
|
||||||
|
| Zu aggressive Filterung (False Negatives) | Stufe 1 nur fuer klare Faelle, Stufe 2 als Fallback |
|
||||||
|
| LLM-Kosten bei vielen Controls | Caching + nur high-severity Controls |
|
||||||
|
| Datenbank-Migration auf Production | `ADD COLUMN IF NOT EXISTS` ist non-blocking |
|
||||||
|
| 166k Controls ohne relevance_conditions | Default `{}` = kein Filter = bisheriges Verhalten |
|
||||||
|
|
||||||
|
## Testfaelle
|
||||||
|
|
||||||
|
1. **Opodo-Test:** C_TRANSPARENCY sollte NICHT mehr empfohlen werden (kein KI-Nachweis)
|
||||||
|
2. **Chatbot-Anbieter:** C_TRANSPARENCY SOLL empfohlen werden (KI explizit erwaehnt)
|
||||||
|
3. **Arztpraxis-Website:** C_DSFA_REQUIRED SOLL empfohlen werden (Gesundheitsdaten)
|
||||||
|
4. **Blog ohne Tracking:** Nur minimale Controls (Impressum, Datenschutzerklaerung)
|
||||||
Reference in New Issue
Block a user