Was ein Latenzbudget ist
Latenz ist die Zeit, die eine Nutzerin auf eine Antwort wartet. Ein Latenzbudget ist die längste Zeit, die Sie erlauben, aufgeteilt auf die Schritte einer Anfrage.
Das Modul über Kosten, Tracing und Zuverlässigkeit zeigt Perzentile und einen Timeout. Diese Lektion geht weiter: ein Budget für die ganze Anfrage und was Streaming ändert und was nicht.
Am Ende dieser Lektion
Notiz
Ich kann ein Latenzbudget festlegen und sagen, was Streaming ändert.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Latenz | die Zeit, die eine Nutzerin wartet | |
| Zeit bis zum ersten Token | das Warten, bevor die ersten Wörter erscheinen | 600 ms |
| Gesamtzeit | das Warten bis zum letzten Wort | |
| Streaming | Wörter senden, sobald sie entstehen, nicht erst am Ende | |
| Budget | die längste erlaubte Zeit, auf Schritte verteilt | |
| Millisekunde | ein Tausendstel einer Sekunde |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Zwei Zeiten: erste Wörter und letztes Wort
Eine Antwort braucht etwas Zeit bis zum ersten Wort und danach ein wenig mehr für jedes weitere. Die erste Zeit ist die Zeit bis zum ersten Token. Die letzte ist die Gesamtzeit.
Die Gesamtzeit ist die Zeit bis zum ersten Token plus die Zeit je Token mal die Zahl der Token.
Durchgerechnetes Beispiel: zwei Antworten
| Antwort | Bis zum ersten Token | Je Token | Token | Gesamt |
|---|---|---|---|---|
| Kurz | 600 | 20 | 30 | 1200 |
| Lang | 600 | 20 | 300 | 6600 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, Streaming mache eine Antwort schneller. Das stimmt nicht: Das letzte Wort kommt genau gleich spät. Es ändert sich nur, wann die Nutzerin zuerst Wörter sieht, also fühlt sich das Warten kürzer an.
Wo das Warten gespürt wird
Ohne Streaming sieht die Nutzerin bis zur Gesamtzeit nichts. Mit Streaming sieht sie nach der Zeit bis zum ersten Token Wörter und kann zu lesen beginnen.
Bei einer langen Antwort ist der Unterschied groß. Im Beispiel sinkt das Warten auf die ersten Wörter von 6600 auf 600 Millisekunden, eine Ersparnis von 6000.
Was Streaming Sie kostet
Wichtig
Wörter erscheinen, bevor die ganze Antwort geprüft ist. Eine Prüfung, die den vollen Text braucht, etwa eine Sicherheitsprüfung, kann nicht vorher laufen. Entscheiden Sie, wie Sie damit umgehen, bevor Sie Streaming einschalten.
Das Budget auf die Schritte verteilen
Eine Anfrage hat mehr Schritte als das Modell. Sie wartet in einer Schlange, holt Dokumente und prüft die Antwort. Addieren Sie die Zeiten der Reihe nach.
Der erste Schritt, an dem die laufende Summe über das Budget geht, ist der, den Sie zuerst beheben oder streichen.
Durchgerechnetes Beispiel: ein Budget von 1000
| Schritt | Zeit | Laufende Summe | Über 1000? |
|---|---|---|---|
| Warteschlange | 150 | 150 | Nein |
| Suche | 400 | 550 | Nein |
| Modell erstes Token | 600 | 1150 | Ja, zuerst darüber |
| Sicherheitsprüfung | 200 | 1350 | Ja, 350 darüber |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
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 Latenz-Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'function gesamt(a) { return a.bisErstes + a.jeToken * a.token; }' 'function erster(a) { return a.gestreamt ? a.bisErstes : gesamt(a); }' 'const antworten = [' ' { name: \"kurz\", bisErstes: 600, jeToken: 20, token: 30, gestreamt: false },' ' { name: \"lang\", bisErstes: 600, jeToken: 20, token: 300, gestreamt: false },' ' { name: \"lang-gestreamt\", bisErstes: 600, jeToken: 20, token: 300, gestreamt: true },' '];' > latenz.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 Latenz-Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const teile = [[\"Warteschlange\", 150], [\"Suche\", 400], [\"Modell erstes Token\", 600], [\"Sicherheitsprüfung\", 200]];' 'function budget(grenze) {' ' let summe = 0;' ' let drueber = \"keiner\";' ' for (const t of teile) {' ' summe = summe + t[1];' ' if (summe > grenze && drueber === \"keiner\") drueber = t[0];' ' }' ' return \"gesamt \" + summe + \", übrig \" + (grenze - summe) + \", zuerst darüber: \" + drueber;' '}' >> latenz.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 Latenz-Skript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' for (const a of antworten) console.log(a.name + \": erster Text \" + erster(a) + \", gesamt \" + gesamt(a));' ' console.log(\"Budget 1000: \" + budget(1000));' ' console.log(\"Budget 2000: \" + budget(2000));' ' const start = Date.now();' ' const probe = \"Sie können sofort zu lesen beginnen, also fühlt sich das Warten kürzer an.\";' ' const antwort = await fragen([{ role: \"user\", content: \"Warum sehen Nutzer gern früh die ersten Wörter? Antworten Sie in einem kurzen Satz.\" }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' ' console.log(\"Gemessene Wartezeit für die ganze Antwort: \" + (antwort.aufgezeichnet ? \"nicht gemessen\" : Date.now() - start + \" ms\"));' '}' 'main();' >> latenz.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 Latenzrechnung ausführen
docker exec -w /home/node/project agent node latenz.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 |
|---|---|
| kurz: erster Text 1200, gesamt 1200 | Ohne Streaming ist der erste Text die Gesamtzeit |
| lang-gestreamt: erster Text 600, gesamt 6600 | Mit Streaming erscheinen Wörter früh, die Gesamtzeit bleibt |
| Budget 1000: gesamt 1350, übrig -350, zuerst darüber: Modell erstes Token | Der Schritt, den Sie beheben |
| Das Modell sagte: ... | Ein Satz aus dem Labor. Eine Aufgezeichnete Probe, wenn kein Modell antwortet |
| Gemessene Wartezeit für die ganze Antwort: ... | Eine echte Zeit in ms, oder nicht gemessen bei einer aufgezeichneten Probe |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.