Suivre les données à travers une fonction
Une revue de parcours suit les données personnelles de leur entrée jusqu’à leur fin. Elle demande où elles vont, qui les voit, combien de temps elles restent et pourquoi.
Une revue repère des problèmes sur le papier, avant la mise en service. C’est une façon de réfléchir, pas un certificat que quoi que ce soit est conforme.
À la fin de cette leçon
Remarque
Je peux revoir le parcours des données d’une fonction avec une liste de contrôle.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Parcours des données | le chemin que prennent les données personnelles dans une fonction | |
| Liste de contrôle | une liste de questions auxquelles chaque étape doit répondre | |
| Lieu approuvé | un endroit où vous avez décidé que des données peuvent aller | notre base |
| Lecteur | une personne ou un groupe qui peut voir les données | |
| Finalité | la raison pour laquelle une étape utilise les données |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un parcours est une liste d’étapes
Écrivez chaque étape du trajet sur une ligne. Une étape a un nom, les données qu’elle utilise, le lieu où elles vont et qui peut les lire là-bas.
Elle a aussi le nombre de jours de conservation, l’indication d’un masquage préalable et la raison de son usage. Cinq questions transforment ces lignes en revue.
Les cinq contrôles
| Contrôle | Il échoue quand | Exemple du Run |
|---|---|---|
| Envoyé sans masquage | Des données vont vers un lieu non approuvé, sans masquage | Application vers modèle |
| Trop de lecteurs | Les lecteurs comprennent tout le monde | Écriture du journal |
| Pas de limite | Aucun nombre de jours n’est fixé | Écriture du journal |
| Gardé trop longtemps | Les jours dépassent votre limite | Export hebdomadaire, 400 jours |
| Pas de finalité | Aucune raison n’est écrite | Export hebdomadaire |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
La revue signale chaque échec
Contrôlez chaque étape dans l’ordre et listez chaque échec qu’elle a. Une étape peut échouer à plusieurs contrôles. Une étape qui n’échoue à aucun n’ajoute rien à la liste.
Comptez les échecs par contrôle. Vous voyez alors, par exemple, que trois étapes n’ont pas de limite, et vous les corrigez ensemble.
Une erreur courante
Attention
Beaucoup pensent qu’un parcours qui passe la liste est conforme à la loi. Ce n’est pas vrai. Cela montre seulement que cinq questions ont une réponse. Les règles varient selon le lieu et l’usage : une personne compétente décide. Cette leçon n’est pas un avis juridique.
É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 réviseur de parcours, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { demander } = require(\"./model\");' 'const approuves = [\"notre application\", \"notre base\"];' 'const limite = 90;' 'const parcours = [' ' { etape: \"Formulaire vers application\", donnees: [\"courriel\", \"message\"], vers: \"notre application\", qui: [\"assistance\"], jours: 30, masque: false, pourquoi: \"Répondre au client\" },' ' { etape: \"Application vers modèle\", donnees: [\"message\"], vers: \"hébergeur du modèle\", qui: [\"hébergeur du modèle\"], jours: 0, masque: false, pourquoi: \"Écrire une réponse\" },' ' { etape: \"Écriture du journal\", donnees: [\"courriel\"], vers: \"notre base\", qui: [\"tout le monde\"], jours: null, masque: false, pourquoi: \"Débogage\" },' '];' > revue.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 réviseur de parcours, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'parcours.push({ etape: \"Export hebdomadaire\", donnees: [\"courriel\"], vers: \"prestataire d’analyse\", qui: [\"analyste\"], jours: 400, masque: true, pourquoi: \"\" });' 'parcours.push({ etape: \"Cache\", donnees: [], vers: \"notre application\", qui: [\"assistance\"], jours: 1, masque: false, pourquoi: \"Rapidité\" });' 'function verifier(e) {' ' const sortie = [];' ' if (e.donnees.length > 0 && approuves.indexOf(e.vers) < 0 && e.masque === false) sortie.push(\"envoyé sans masquage\");' ' if (e.qui.indexOf(\"tout le monde\") >= 0) sortie.push(\"trop de lecteurs\");' ' if (e.jours === null) sortie.push(\"pas de limite\");' ' else if (e.jours > limite) sortie.push(\"gardé trop longtemps\");' ' if (e.pourquoi.trim().length === 0) sortie.push(\"pas de finalité\");' ' return sortie;' '}' >> revue.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 réviseur de parcours, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' let en_echec = 0;' ' parcours.forEach(function (e) {' ' const f = verifier(e);' ' if (f.length > 0) en_echec = en_echec + 1;' ' console.log(e.etape + \" -> \" + (f.length === 0 ? \"réussit\" : f.join(\", \")));' ' });' ' console.log(\"étapes en échec : \" + en_echec + \" sur \" + parcours.length);' ' const q = \"En une courte phrase, pourquoi écrire la finalité de chaque étape qui utilise des données personnelles ?\";' ' const echantillon = \"Une finalité écrite montre pourquoi les données servent, et une étape sans raison saute aux yeux.\";' ' const r = await demander([{ role: \"user\", content: q }], echantillon, 60);' ' console.log(\"le modèle dit : \" + r.texte);' '}' 'main();' >> revue.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 réviseur de parcours
docker exec -w /home/node/project agent node revue.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 |
|---|---|
| Formulaire vers application -> réussit | Un lieu approuvé, une raison et une limite |
| Application vers modèle -> envoyé sans masquage | Un message est parti sans masquage |
| Écriture du journal -> trop de lecteurs, pas de limite | Deux échecs dans une étape |
| Export hebdomadaire -> gardé trop longtemps, pas de finalité | Deux échecs de plus |
| étapes en échec : 3 sur 5 | Le résumé |
| le modèle dit : ... | Une phrase. Les mots changent à chaque exécution |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.