Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Modellantworten im Cache speichern

Nach dieser Lektion: Ich kann Modellantworten sicher zwischenspeichern und genau sagen, was einen Treffer ausmacht.

Lektion, 60 Min.7 BefehleLab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

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

BegriffWas er bedeutet
Cacheein Speicher für Antworten, die schon bezahlt sind
Cache-Schlüsselder Wert, der entscheidet, ob zwei Anfragen gleich sind
Treffereine Anfrage, die aus dem Cache beantwortet wird
Kein Treffereine Anfrage, die das Modell aufrufen muss
Ablaufder Zeitpunkt, ab dem ein Eintrag verworfen wird
Personenbezogene Datenalles, 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

ÄnderungGleicher Schlüssel?Warum
Gleiches Modell, gleiche Nachrichten und ParameterJaDas Modell sieht dieselbe Anfrage
Ein Wort anders in einer NachrichtNeinDie Nachrichten gehören zum Schlüssel
Temperatur 0 und dann 1NeinDie Antworten können abweichen
Ein anderes ModellNeinEin 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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
docker exec -w /home/node/project agent node 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.

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

ZeileWas sie zeigt
t=0 s: kein TrefferDie erste Anfrage ruft das Modell auf
t=30 s: TrefferDieselbe Anfrage, aus dem Cache beantwortet
t=90 s: abgelaufen, kein TrefferDer Eintrag lief bei 60 Sekunden ab, also wird das Modell neu gerufen
gleicher Schlüssel bei anderer Temperatur: falseEin neuer Parameter ist ein neuer Schlüssel
personenbezogene Anfrage: übersprungen, personenbezogenDer Cache wurde nie angefasst

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Über dieses Lab und seinen Quellcode: Lab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.