Eine Antwort nicht zweimal bezahlen
Modellantworten zwischenzuspeichern heißt, eine Antwort abzulegen und für dieselbe Anfrage später wiederzugeben. Das ist wichtig, weil ein Aufruf Geld und Sekunden kostet und sich viele Anfragen wiederholen.
Eine Hilfeseite lässt das Modell für jeden Besucher dieselbe Rückgaberegel zusammenfassen. Tausend Aufrufe zahlen tausendmal für eine Antwort. Ein Aufruf und neunhundertneunundneunzig Treffer tun das nicht.
Am Ende dieser Lektion
Notiz
Ich kann Modellantworten sicher zwischenspeichern und genau sagen, was einen Treffer ausmacht.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Cache | ein Speicher für Antworten, die schon bezahlt sind |
| Cache-Schlüssel | der Wert, der entscheidet, ob zwei Anfragen gleich sind |
| Treffer | eine Anfrage, die aus dem Cache beantwortet wird |
| Kein Treffer | eine Anfrage, die das Modell aufrufen muss |
| Ablauf | der Zeitpunkt, ab dem ein Eintrag verworfen wird |
| Personenbezogene Daten | alles, was eine Person erkennbar macht |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Der Schlüssel entsteht aus der ganzen Anfrage
Zwei Anfragen dürfen sich eine Antwort nur teilen, wenn das Modell dasselbe sieht. Der Cache-Schlüssel deckt also alles ab, was die Antwort verändert. Das sind das Modell, jede Nachricht mit ihrer Rolle und die Parameter wie Temperatur und Antwortlimit.
Lassen Sie eines weg, liefern Sie die falsche Antwort. Ein Hashwert dieses Textes hält den Schlüssel kurz.
Durchgerechnetes Beispiel: was den Schlüssel ändert
| Änderung | Gleicher Schlüssel? | Warum |
|---|---|---|
| Gleiches Modell, gleiche Nachrichten und Parameter | Ja | Das Modell sieht dieselbe Anfrage |
| Ein Wort anders in einer Nachricht | Nein | Die Nachrichten gehören zum Schlüssel |
| Temperatur 0 und dann 1 | Nein | Die Antworten können abweichen |
| Ein anderes Modell | Nein | Ein anderes Modell antwortet anders |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einträge laufen ab, Personenbezogenes bleibt draußen
Eine Antwort veraltet. Geben Sie jedem Eintrag einen Ablauf: eine Lebensdauer in Sekunden. Danach wird der Eintrag verworfen, und die nächste Anfrage ist kein Treffer.
Speichern Sie nie Personenbezogenes zwischen. Eine Antwort, die aus der Adresse oder Bestellung eines Nutzers entstand, könnte dem Nächsten mit demselben Schlüssel gezeigt werden. Prüfen Sie die Anfrage vor der Suche und umgehen Sie den Cache für sie.
Ein häufiger Fehler
Warnung
Viele glauben, ein Cache sei immer sicher, weil die Antwort nur Text ist. Eine gespeicherte Antwort mit den Angaben einer Person kann einer anderen angezeigt werden. Entscheiden Sie, was gespeichert werden darf, bevor der erste Eintrag entsteht.
Die Modell-Hilfe 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 Modell-Hilfe 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.
Den Cache schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const crypto = require(\"crypto\");' 'const { fragen } = require(\"./model\");' '' 'let jetzt = 0; // Sekunden auf einer Uhr, die wir selbst weiterstellen' 'const LEBENSDAUER = 60; // ein Eintrag lebt 60 Sekunden' 'const cache = new Map();' > cache2.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.
Den Cache schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Der Schlüssel entsteht aus der ganzen Anfrage: Modell, Nachrichten und Parameter.' 'function schluesselVon(anfrage) {' ' const alles = JSON.stringify([anfrage.modell, anfrage.nachrichten, anfrage.temperature, anfrage.max_tokens]);' ' return crypto.createHash(\"sha256\").update(alles).digest(\"hex\").slice(0, 12);' '}' '// Personenbezogenes wird nie zwischengespeichert. Hier: eine E-Mail-Adresse oder eine lange Zahl.' 'function personenbezogen(anfrage) {' ' return /@|[0-9]{7,}/.test(JSON.stringify(anfrage.nachrichten));' '}' >> cache2.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.
Den Cache schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function antworten(anfrage, probe) {' ' if (personenbezogen(anfrage)) return \"übersprungen, personenbezogen\";' ' const schluessel = schluesselVon(anfrage);' ' const gefunden = cache.get(schluessel);' ' if (gefunden && gefunden.laeuftAb > jetzt) return \"Treffer\";' ' const antwort = await fragen(anfrage.nachrichten, probe, anfrage.max_tokens);' ' cache.set(schluessel, { text: antwort.text, laeuftAb: jetzt + LEBENSDAUER });' ' return gefunden ? \"abgelaufen, kein Treffer\" : \"kein Treffer\";' '}' >> cache2.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.
Den Cache schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const tipp = [{ role: \"user\", content: \"Gib einen Tipp zu Caches, in einem Satz.\" }];' ' const basis = { modell: \"lab\", temperature: 0, max_tokens: 40, nachrichten: tipp };' ' const anders = { ...basis, temperature: 1 };' ' const geheim = { ...basis, nachrichten: [{ role: \"user\", content: \"Schreibe an [email protected] einen Tipp.\" }] };' ' const probe = \"Speichern Sie nur, was für alle gleich ist.\";' ' for (const t of [0, 30, 90]) {' ' jetzt = t;' ' console.log(\"t=\" + t + \" s: \" + (await antworten(basis, probe)));' ' }' ' console.log(\"gleicher Schlüssel bei anderer Temperatur: \" + (schluesselVon(basis) === schluesselVon(anders)));' ' console.log(\"personenbezogene Anfrage: \" + (await antworten(geheim, probe)));' '}' 'main();' >> cache2.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.
Den Cache ausführen
docker exec -w /home/node/project agent node cache2.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Übungs-Cache statt eines echten Dienstes
Das Labor hat keinen Cache-Server. Der Cache ist eine Map im Skript, und die Uhr ist eine Zahl, die das Skript setzt. Ein echtes System nutzt einen echten Cache-Dienst, den alle Server teilen.
Die Regeln bleiben gleich: ein Schlüssel aus der ganzen Anfrage, ein Ablauf und eine Prüfung auf personenbezogene Daten.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| t=0 s: kein Treffer | Die erste Anfrage ruft das Modell auf |
| t=30 s: Treffer | Dieselbe Anfrage, aus dem Cache beantwortet |
| t=90 s: abgelaufen, kein Treffer | Der Eintrag lief bei 60 Sekunden ab, also wird das Modell neu gerufen |
| gleicher Schlüssel bei anderer Temperatur: false | Ein neuer Parameter ist ein neuer Schlüssel |
| personenbezogene Anfrage: übersprungen, personenbezogen | Der Cache wurde nie angefasst |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.