insight ·

Persoonsgegevens pseudonimiseren vóór je een taalmodel aanroept

Een praktisch patroon om persoonsgegevens te vervangen voordat tekst naar een taalmodel gaat en ze daarna terug te zetten. Plus wat het niet oplost.

Veel waardevolle AI-toepassingen werken met tekst vol persoonsgegevens: dossiers, e-mails, klantnotities. De vraag is dan niet alleen of een model de taak aankan, maar ook wat er met die gegevens gebeurt. Een sterke maatregel is om persoonsgegevens te vervangen door neutrale tokens vóór het verzoek, en ze terug te zetten in het antwoord.

Het idee

Origineel:  "Jan de Vries (jan@voorbeeld.nl) wil zijn hypotheek oversluiten."
Naar model: "[PERSOON_1] ([EMAIL_1]) wil zijn hypotheek oversluiten."
Antwoord:   "[PERSOON_1] kan het beste eerst ..."
Na herstel: "Jan de Vries kan het beste eerst ..."

Het model krijgt genoeg context om de taak uit te voeren, maar ziet de identiteit niet. De koppeltabel tussen token en echte waarde verlaat je eigen systeem nooit.

Vervang wat je al kent

De verleiding is om persoonsgegevens automatisch te detecteren met patronen of een herkenningsmodel. Dat helpt als extra laag, maar het mist dingen. In de meeste bedrijfssoftware weet je al welke gegevens persoonlijk zijn: ze staan in je eigen database, in velden als naam, e-mail en adres. Gebruik die als bron.

export class PseudonymSession {
  private forward = new Map<string, string>();
  private reverse = new Map<string, string>();
  private counters = new Map<string, number>();

  /** Registreer bekende waarden uit het eigen record, langste eerst. */
  register(kind: string, values: string[]): void {
    for (const value of values.filter(Boolean).sort((a, b) => b.length - a.length)) {
      if (this.forward.has(value)) continue;
      const n = (this.counters.get(kind) ?? 0) + 1;
      this.counters.set(kind, n);
      const token = `[${kind}_${n}]`;
      this.forward.set(value, token);
      this.reverse.set(token, value);
    }
  }

  mask(text: string): string {
    let out = text;
    for (const [value, token] of this.forward) out = out.split(value).join(token);
    return out;
  }

  unmask(text: string): string {
    return text.replace(/\[[A-Z]+_\d+\]/g, (t) => this.reverse.get(t) ?? t);
  }
}

Per verzoek maak je een nieuwe sessie, registreer je de velden van het dossier, maskeer je de tekst, en zet je het antwoord terug. Omdat de tokens per sessie oplopen, verwijzen twee vermeldingen van dezelfde persoon naar hetzelfde token, zodat het model de samenhang behoudt.

Waar het hoort: in de toegangslaag

Pseudonimisering werkt alleen als het niet per feature vergeten kan worden. In Attentiv AI loopt elk modelverzoek daarom via één provider-laag die in vaste volgorde opt-in, rate limit en tokenbudget controleert, pseudonimiseert, het model aanroept, het antwoord valideert en pas dan de echte waarden terugzet. De herkenning gebruikt de bekende velden van het dossier, met woordgrenzen en varianten voor IBAN, BSN en telefoonnummers. Het verbruik wordt gelogd zonder persoonsgegevens.

Wat het niet oplost

Wees eerlijk over de grenzen:

  • Gepseudonimiseerde gegevens blijven persoonsgegevens onder de AVG, zolang jij de koppeltabel hebt. Pseudonimisering verkleint het risico; het vervangt geen verwerkersovereenkomst, grondslag of beveiliging.
  • Context kan identificeren. Een unieke combinatie van beroep, woonplaats en situatie kan iemand herkenbaar maken zonder naam. Stuur alleen de context mee die de taak echt nodig heeft.
  • Let op woordgrenzen. De eenvoudige versie hierboven vervangt ook stukken van woorden: “Jan” in “Janssen”. In productie match je op woordgrenzen en houd je rekening met schrijfvarianten, zoals spaties in een IBAN of telefoonnummer.
  • Vrije tekst blijft lastig. Een naam die alleen in een notitie staat en niet in een veld, glipt erdoor. Combineer bekende velden met detectie, en test met echte (geanonimiseerde) voorbeelden.

Goed toegepast maakt pseudonimisering het verschil tussen “we vertrouwen erop dat het goed gaat” en “het model heeft deze gegevens nooit gezien”. Dat is een sterkere positie, technisch en richting je klanten.

sys://contact

Wat wil je automatiseren of bouwen?

Beschrijf het proces, de tool of het product in een paar zinnen. Je krijgt een concreet antwoord: wat haalbaar is, hoe je het zou bouwen en waar de risico’s zitten.