sentiment_analysis / docs /PRIVACY.md
vojmahdal's picture
Repair date filter NER
dc51a6e verified
|
Raw History Blame Contribute Delete
5.49 kB
# Zpracování osobních údajů – technický popis prototypu
Tento dokument popisuje, **co systém dělá** s osobními údaji a jaká opatření
jsou skutečně implementována. Není to právní posudek ani certifikace souladu
s GDPR; organizační a právní předpoklady (viz poslední sekce) musí zajistit
provozovatel.
## 1. Účel a rozsah zpracování
| Položka | Popis |
|---|---|
| Účel | Prototyp diplomové práce: automatická extrakce entit, tématu a sentimentu z textových zpráv zákaznické podpory a jejich strukturované uložení. |
| Vstup | Text zpráv (a volitelně `conversation_id`, `speaker`, `timestamp`) nahraný přes `/analyze` nebo `/ingest`. |
| Kategorie údajů ve vstupu | Cokoli, co uživatelé do zpráv napíší: jména, e-maily, telefony, adresy, čísla objednávek apod. |
| Testovací data | Veřejný dataset *Customer Support on Twitter* (uživatelská jména v něm jsou již nahrazena identifikátory). Pro demonstrace a testy se mají používat smyšlené údaje. |
## 2. Tok dat
```
vstup → NER + datumy/časy → téma → sentiment → maskování (Presidio) → uložení
↘ (volitelně) maskovaný text → LLM API
```
* Lokální větev (výchozí): žádná data neopouštějí aplikaci.
* LLM větev: poskytovateli (Anthropic / Google / OpenAI) se posílá **pouze
maskovaný text** (režim `pre_pseudonymized`). Režim `raw` posílá text bez
maskování; je vypnutý a zapíná se výhradně `LLM_ALLOW_RAW=true`.
* Selže-li maskování, text se do LLM neodešle a nic se neuloží (viz 4.).
* Odpověď `/analyze` a stav ingest úlohy (`/ingest/status/{id}`) obsahují
původní text a entity – vrací se jen tomu, kdo text poslal, a úloha žije
pouze v paměti procesu.
## 3. Co se ukládá
| Sloupec | Obsah | Poznámka |
|---|---|---|
| `original_hash` | SHA-256 původního textu | slouží k deduplikaci; krátké/předvídatelné texty lze hashem ověřit, proto jde stále o pseudonymizaci |
| `anonymized_text` | text po maskování (`[NAME]`, `[EMAIL]`, …) | maskování je statistické – může nechat drobnost nezakrytou |
| `entities` | typ, skóre, `[TYP]` místo textu; u `DATE`/`TIME` i normalizovaná hodnota | původní text entit se **neukládá** (`STORE_RAW_ENTITIES=false`) |
| `conversation_id`, `speaker`, `input_timestamp`, `input_id` | metadata vstupu | `conversation_id` může být identifikátor převzatý ze vstupního souboru – posuzuje provozovatel |
| `topic`, `sentiment` (+ skóre), `engine`, `provider`, `model`, `latency_ms`, `cost_usd` | výsledek a provozní údaje | |
Datum/čas: v `anonymized_text` je maskováno (`[DATE]`), ale jako strukturovaný
výstup extrakce se jeho normalizovaná hodnota ukládá (je to požadovaný výstup
práce). Datum sám o sobě zpravidla neidentifikuje osobu, v kombinaci s jinými
údaji ale může – při vyšším riziku vypněte extrakci v `processors/temporal.py`.
## 4. Chybové stavy a maskování
* Nelze-li zaručit plné maskování (Presidio nedostupné / selhalo), používá se
slabší regex maskování **jen** při `ANONYMIZER_ALLOW_FALLBACK=true`. Regex
nemaskuje osobní jména. Výchozí chování: text se odmítne (`/analyze` → 503).
* Neúspěšná analýza se ukládá jako nic – v databázi není žádný „prázdný“ nebo
„neutrální“ záznam vzniklý z chyby.
## 5. Uchovávání, výmaz, zálohy
| Téma | Stav |
|---|---|
| Doba uchování | `RETENTION_DAYS=N` maže při startu záznamy starší než N dní. Není-li nastaveno, data se uchovávají neomezeně. |
| Výmaz na žádost | `db.purge_older_than(0)` smaže vše; cílený výmaz jednoho subjektu není implementován (uložený text je maskovaný, subjekt se v něm nedá spolehlivě dohledat). |
| Zpětné čištění | `db.scrub_stored_entities()` nevratně přepíše entity ve starších záznamech. |
| Zálohy | Zajišťuje poskytovatel databáze (např. Neon); prototyp je neřeší ani nemaže. Zálohy pořízené před čištěním mohou obsahovat původní entity. |
| Přístup | API nemá autentizaci. Historie a exporty obsahují jen maskovaná data; omezení přístupu musí zajistit infrastruktura (reverzní proxy, síťová pravidla). |
## 6. Externí poskytovatelé
Do poskytovatele LLM odchází maskovaný text a technické údaje (model,
identifikátor požadavku). Provozovatel musí mít s poskytovatelem uzavřené
podmínky odpovídající jeho roli (zpracovatel / samostatný správce) a ověřit
umístění zpracování. Maskování před odesláním snižuje riziko, ale samo o sobě
nenahrazuje smluvní ošetření ani nezaručuje anonymitu.
## 7. Co prototyp nezajišťuje
* právní základ zpracování, informování subjektů údajů, záznamy o
zpracování, posouzení vlivu na ochranu údajů,
* autentizaci a autorizaci uživatelů API,
* šifrování uložených dat nad rámec toho, co nabízí použitá databáze,
* spolehlivost detekce osobních údajů: na 600 anotovaných zprávách zamaskoval samotný Presidio 68,1 % jmen osob (119 osob, 38 zůstalo viditelných, převážně podpisy agentů a oslovení). Doplňující pravidla (`mask_name_patterns`) zvýšila podíl na 93,3 % na vzorku, ze kterého vznikla, což je optimistický odhad. Míra odhalení adres, čísel objednávek a míst změřena nebyla.