Ein Protokoll, das hilft und nichts verrät
Ein Protokoll ist eine Aufzeichnung, die eine App über ihr Tun schreibt. Ist eine Antwort langsam oder falsch, schauen Sie dort nach.
Ein sorgloses Protokoll kopiert jeden Prompt und jede Adresse in eine Datei, die viele lesen können. Ziel ist, genug aufzuheben, um Fehler zu beheben, und nicht mehr.
Am Ende dieser Lektion
Notiz
Ich kann genug protokollieren, um eine Anfrage zu prüfen, und nicht mehr, als ich sollte.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Protokolleintrag | eine Zeile, die ein Programm über ein Ereignis schreibt | |
| Anfrage-Kennung | eine Marke, die alle Einträge einer Anfrage verbindet | a-001 |
| Hash | ein kurzer Code aus einem Wert, der sich nicht zurückrechnen lässt | |
| Salz | ein geheimes Wort, das vor dem Hashen untergemischt wird | |
| Kürzen | einen Wert auf wenige Zeichen zuschneiden |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Heben Sie auf, was Sie zur Fehlersuche brauchen
Fragen Sie, wofür Sie das Protokoll nutzen. Für eine langsame Antwort brauchen Sie die Anfrage-Kennung, die Zeit, das Modell und die Länge. Die Worte brauchen Sie nicht.
Ein Eintrag ohne die Worte lässt sich trotzdem seiner Anfrage zuordnen. Die Anfrage-Kennung ist der Schlüssel, der beide verbindet.
Durchgerechnetes Beispiel: ein Eintrag, vorher und nachher
| Feld | Roher Eintrag | Sicherer Eintrag | Warum |
|---|---|---|---|
| anfrage_id | a-001 | a-001 | Sie verbindet das Protokoll mit der Anfrage |
| nutzer_email | [email protected] | 3ee95f14 | Ein gesalzener Hash zählt weiter eine Person |
| nachricht | Bitte erstatten Sie meine Bestellung | 36 (ihre Länge) | Die Worte bleiben aus dem Protokoll |
| ms | 420 | 420 | Nötig, um langsame Antworten zu finden |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Hash verbirgt den Wert, nicht die Person
Ein Hash macht aus einer Adresse einen kurzen Code. Dieselbe Adresse ergibt immer denselben Code, Sie können also weiter Nutzer zählen. Niemand rechnet den Code durch bloßes Lesen zurück.
Ein Salz macht den Code schwerer erratbar. Legen Sie außerdem fest, wer das Protokoll lesen darf. Ein Protokoll, das niemand lesen muss, sollte es nicht geben.
Ein häufiger Fehler
Warnung
Viele denken, ein Hash sei anonym. Das stimmt nicht. Wer eine Liste von Adressen hat, kann alle hashen und die Codes abgleichen. Ein Hash ist ein Pseudonym, und das Protokoll bleibt personenbezogen. Nutzen Sie ein Salz und halten Sie das Salz vom Protokoll fern.
Die Modellhilfe schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' > model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Modellhilfe schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' 'module.exports = { fragen };' >> model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das sichere Protokoll schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const crypto = require(\"crypto\");' 'const roh = [' ' { anfrage_id: \"a-001\", nutzer_email: \"[email protected]\", nachricht: \"Bitte erstatten Sie meine Bestellung\", modell: \"lab\", ms: 420 },' ' { anfrage_id: \"a-002\", nutzer_email: \"[email protected]\", nachricht: \"Rufen Sie mich unter 01234567890 an\", modell: \"lab\", ms: 380 },' ' { anfrage_id: \"a-003\", nutzer_email: \"[email protected]\", nachricht: \"Wo ist mein Paket\", modell: \"lab\", ms: 910 },' '];' > logsafe.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das sichere Protokoll schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function kurzHash(v) {' ' return crypto.createHash(\"sha256\").update(\"labor-salz:\" + v).digest(\"hex\").slice(0, 8);' '}' 'function sicher(r) {' ' return { anfrage_id: r.anfrage_id, nutzer: kurzHash(r.nutzer_email), laenge: r.nachricht.length, modell: r.modell, ms: r.ms };' '}' 'function enthaeltEmail(r) {' ' return Object.values(r).some(function (v) { return typeof v === \"string\" && v.includes(\"@\"); });' '}' >> logsafe.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das sichere Protokoll schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const aus = roh.map(sicher);' ' roh.forEach(function (r, i) {' ' console.log(r.anfrage_id + \" roh mit E-Mail: \" + enthaeltEmail(r) + \" | sicher mit E-Mail: \" + enthaeltEmail(aus[i]));' ' console.log(\" \" + JSON.stringify(aus[i]));' ' });' ' console.log(\"a-001 und a-003 gleiche Person: \" + (aus[0].nutzer === aus[2].nutzer));' ' console.log(\"a-001 und a-002 gleiche Person: \" + (aus[0].nutzer === aus[1].nutzer));' ' const q = \"Schreiben Sie in einem kurzen Satz, warum man die Länge einer Nachricht protokolliert und nicht die Nachricht.\";' ' const probe = \"Eine Länge hilft, langsame Antworten zu finden, und sagt nichts über die Person.\";' ' const antwort = await fragen([{ role: \"user\", content: q }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> logsafe.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das sichere Protokoll ausführen
docker exec -w /home/node/project agent node logsafe.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Was der Run ausgibt
| Zeile | Was sie zeigt |
|---|---|
| a-001 roh mit E-Mail: true | sicher mit E-Mail: false | Der sichere Eintrag hat keine Adresse |
| {"anfrage_id":"a-001","nutzer":"3ee95f14",...} | Der Hash und die Länge, sonst nichts |
| a-001 und a-003 gleiche Person: true | Dieselbe Person lässt sich weiter zuordnen |
| a-001 und a-002 gleiche Person: false | Zwei Personen bleiben getrennt |
| Das Modell sagte: ... | Ein Satz. Die Worte ändern sich bei jedem Lauf |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.