Garder des données, puis les effacer
La conservation des données est la règle qui dit combien de temps une application garde chaque sorte de données. Ce temps passé, les données sont effacées.
Une application de discussion qui garde tout pour toujours porte plus de risque chaque année. Le module « Sécuriser les applications LLM » a donné une première règle ; ici, vous balayez, vous effacez à la demande et vous comptez ce qui reste.
À la fin de cette leçon
Remarque
Je peux effacer des données selon une règle et à la demande d’une personne.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Conservation | la durée pendant laquelle des données sont gardées | |
| Balayage | une tâche qui efface ce qui est trop vieux | |
| Demande d’effacement | une personne qui demande que ses données soient retirées | |
| Copie | un autre endroit où les mêmes données sont stockées | un cache |
| Sauvegarde | une copie gardée pour se remettre d’une panne |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une règle de conservation fixe une durée
Chaque sorte de données demande un temps différent. Une discussion peut être gardée 30 jours. Une facture est gardée plus longtemps, car la comptabilité en a besoin. Cette leçon prend 365 jours.
Chaque fiche a un jour de création. Un balayage calcule son âge : aujourd’hui moins ce jour. Si l’âge dépasse la durée, la fiche part. Une fiche exactement à la limite reste.
Exemple détaillé : un balayage au jour 100
| Fiche | Sorte | Faite au jour | Âge | Durée | Résultat |
|---|---|---|---|---|---|
| d1 | discussion | 10 | 90 | 30 | Effacée |
| d2 | discussion | 80 | 20 | 30 | Gardée |
| f1 | facture | 20 | 80 | 365 | Gardée |
| d3 | discussion | 70 | 30 | 30 | Gardée, exactement à la limite |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une demande d’effacement doit atteindre chaque copie
Une personne peut demander l’effacement de ses données. Ses messages peuvent vivre dans le stockage principal, dans un cache qui accélère les choses et dans une sauvegarde.
Un effacement qui n’atteint que le stockage principal laisse le reste. Listez d’abord tous les lieux. Le RGPD parle du droit à l’effacement, qui a des limites : demandez conseil à un spécialiste. Ce n’est pas un avis juridique.
Une erreur courante
Attention
Beaucoup pensent que supprimer dans le stockage principal supprime les données de la personne. Ce n’est pas vrai. Les caches, les journaux et les sauvegardes gardent des copies. Une sauvegarde ne se modifie pas : elle disparaît à son expiration. Dites-le à la personne, avec la date.
Écrire l’assistant du modèle, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Les jetons d’une réponse, ou null si elle n’en donne pas.' 'function compter(donnees, nom) {' ' return donnees.usage && typeof donnees.usage[nom] === \"number\" ? donnees.usage[nom] : null;' '}' > model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire l’assistant du modèle, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function demander(messages, echantillon, max) {' ' try {' ' const res = await fetch(base + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"statut \" + res.status);' ' const d = await res.json();' ' return { texte: d.choices[0].message.content, entree: compter(d, \"prompt_tokens\"), sortie: compter(d, \"completion_tokens\"), enregistre: false };' ' } catch (erreur) {' ' console.log(\"Échantillon enregistré : aucun modèle n’a répondu (\" + erreur.message + \").\");' ' return { texte: echantillon, entree: null, sortie: null, enregistre: true };' ' }' '}' 'module.exports = { demander };' >> model.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le balayage de conservation, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const regles = { discussion: 30, facture: 365 };' 'const aujourdhui = 100;' 'const fiches = [' ' { id: \"d1\", utilisateur: \"u1\", jour: 10, sorte: \"discussion\" },' ' { id: \"d2\", utilisateur: \"u2\", jour: 80, sorte: \"discussion\" },' ' { id: \"f1\", utilisateur: \"u1\", jour: 20, sorte: \"facture\" },' ' { id: \"d3\", utilisateur: \"u1\", jour: 70, sorte: \"discussion\" },' '];' > conserver.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le balayage de conservation, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function expiree(f) {' ' return typeof regles[f.sorte] === \"number\" && aujourdhui - f.jour > regles[f.sorte];' '}' 'function ids(liste) {' ' return liste.map(function (f) { return f.id; });' '}' 'const lieux = {' ' actif: fiches.filter(function (f) { return expiree(f) === false; }),' ' cache: [fiches[3]],' ' sauvegarde: [fiches[0], fiches[2], fiches[3]],' '};' >> conserver.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le balayage de conservation, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function reste(utilisateur, atteints) {' ' const restant = {};' ' Object.keys(lieux).forEach(function (nom) {' ' const miennes = lieux[nom].filter(function (f) { return f.utilisateur === utilisateur; });' ' if (atteints.indexOf(nom) < 0 && miennes.length > 0) restant[nom] = ids(miennes);' ' });' ' return restant;' '}' >> conserver.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le balayage de conservation, partie 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' console.log(\"expirées aujourd’hui : \" + JSON.stringify(ids(fiches.filter(expiree))));' ' console.log(\"gardées par le balayage : \" + JSON.stringify(ids(lieux.actif)));' ' console.log(\"effacer u1 de actif et cache, il reste : \" + JSON.stringify(reste(\"u1\", [\"actif\", \"cache\"])));' ' console.log(\"effacer u1 des trois, il reste : \" + JSON.stringify(reste(\"u1\", [\"actif\", \"cache\", \"sauvegarde\"])));' ' console.log(\"sauvegarde faite au jour 90, gardée 35 jours, jours restants : \" + Math.max(0, 90 + 35 - aujourdhui));' >> conserver.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire le balayage de conservation, partie 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const q = \"En une courte phrase, pourquoi une sauvegarde peut-elle contenir encore des données après leur suppression ?\";' ' const echantillon = \"Une sauvegarde est une copie à part : elle ne change que quand elle expire.\";' ' const r = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + r.texte);' '}' 'main();' >> conserver.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer le balayage de conservation
docker exec -w /home/node/project agent node conserver.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que le Run affiche
| Ligne | Ce qu’elle montre |
|---|---|
| expirées aujourd’hui : ["d1"] | Seule d1 dépasse sa durée |
| gardées par le balayage : ["d2","f1","d3"] | Ce qui reste dans le stockage principal |
| effacer u1 de actif et cache, il reste : {"sauvegarde":[...]} | La sauvegarde garde encore u1 |
| effacer u1 des trois, il reste : {} | Chaque copie atteinte |
| jours restants : 25 | Quand la sauvegarde disparaît |
| le modèle dit : ... | Une phrase. Les mots changent à chaque exécution |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.