Verhindern, dass eine Funktion zu viel ausgibt
Ein Budget für eine Funktion mit Modell macht aus Token Geld und lehnt einen Aufruf ab, der ein Limit überschreiten würde. Das ist wichtig, weil die Kosten mit der Nutzung wachsen. Eine sehr aktive Person oder eine Schleife kann ein Monatsbudget an einem Nachmittag verbrauchen.
Ein Modell wird pro Token berechnet, und niemand sieht die Rechnung vor Monatsende. Ein Limit im eigenen Code ist die einzige Bremse, die sofort wirkt.
Am Ende dieser Lektion
Notiz
Ich kann verhindern, dass eine Funktion zu viel ausgibt, mit einem Limit je Nutzer, einem Tageslimit und einer klaren Meldung.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Token | die Einheit, die ein Modell liest und schreibt und nach der abgerechnet wird |
| Preisliste | die Kosten für eine Million Token, Eingabe und Ausgabe |
| Limit je Nutzer | das Meiste, was ein Konto an einem Tag ausgeben darf |
| Tageslimit | das Meiste, was die ganze Funktion an einem Tag ausgeben darf |
| Kassenbuch | die laufende Aufzeichnung des Ausgegebenen |
| Ablehnung | einen Aufruf mit einem Grund abweisen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Token in Geld umrechnen
Ein Modell hat zwei Preise: einen für Eingabe-Token, einen für Ausgabe-Token, meist je Million. Ein Aufruf kostet die Eingabe-Token mal den ersten Preis plus die Ausgabe-Token mal den zweiten.
Nutzen Sie für Geld nie Fließkommazahlen. Rechnen Sie in einer kleinen ganzen Einheit. Hier heißt Euro je Million Token, dass jedes Token so viele Mikro-Euro kostet, die Rechnungen bleiben also ganzzahlig. Die Preise dieser Lektion sind erfunden.
Durchgerechnetes Beispiel: zwei Aufrufe
| Modell | Eingabe | Ausgabe | Rechnung | Kosten |
|---|---|---|---|---|
| klein, Preise 1 und 4 | 900 | 300 | 900 x 1 + 300 x 4 | 2100 Mikro-Euro |
| gross, Preise 10 und 40 | 200 | 100 | 200 x 10 + 100 x 40 | 6000 Mikro-Euro |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Limit prüfen, bevor abgerechnet wird
Führen Sie ein Kassenbuch: die Summe jeder Person und die Summe des Tages. Prüfen Sie einen Aufruf, bevor er abgerechnet wird. Lehnen Sie ihn ab, wenn er die Person über ihr Limit bringt oder den Tag über seines. Eine Summe genau am Limit ist erlaubt.
Prüfen Sie das Nutzerlimit zuerst, denn seine Meldung hilft mehr. Ein abgelehnter Aufruf wird nicht abgerechnet. Und die Ablehnung nennt den Grund, in Worten, nach denen sich handeln lässt.
Ein häufiger Fehler
Warnung
Viele glauben, ein Limit sei nur gegen Missbrauch da, und setzen es erst nach dem Start. Kosten steigen auch durch einen Fehler, etwa eine Wiederholungsschleife oder einen langen Prompt an alle. Setzen Sie beide Limits, bevor die erste Person kommt.
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.
Das Budget schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' '// Eine erfundene Preisliste: Euro je Million Token. Token mal Preis = Mikro-Euro.' 'const PREIS = { klein: { eingabe: 1, ausgabe: 4 }, gross: { eingabe: 10, ausgabe: 40 } };' 'const NUTZER_LIMIT = 5000; // Mikro-Euro für eine Person an einem Tag' 'const TAGES_LIMIT = 8000; // Mikro-Euro für alle an einem Tag' 'const ausgegeben = { nutzer: new Map(), tag: 0 };' 'function kosten(modell, eingabe, ausgabe) {' ' return eingabe * PREIS[modell].eingabe + ausgabe * PREIS[modell].ausgabe;' '}' > budget3.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 Budget schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function pruefen(nutzer, preis) {' ' const bisher = ausgegeben.nutzer.get(nutzer) || 0;' ' if (bisher + preis > NUTZER_LIMIT) return \"nutzer\";' ' if (ausgegeben.tag + preis > TAGES_LIMIT) return \"tag\";' ' return \"ok\";' '}' 'function abrechnen(nutzer, preis) {' ' ausgegeben.nutzer.set(nutzer, (ausgegeben.nutzer.get(nutzer) || 0) + preis);' ' ausgegeben.tag = ausgegeben.tag + preis;' '}' >> budget3.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 Budget schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function meldung(grund, nutzer) {' ' if (grund === \"nutzer\") return \"Hallo \" + nutzer + \", damit würden Sie Ihr Kontingent für heute überschreiten. Es wird um Mitternacht erneuert.\";' ' return \"Der Assistent hat sein Tageslimit für alle erreicht. Bitte versuchen Sie es morgen wieder.\";' '}' 'async function probelauf() {' ' const aufgabe = \"Grüße in fünf Wörtern.\";' ' const r = await fragen([{ role: \"user\", content: aufgabe }], \"Hallo, wie kann ich helfen?\", 20);' ' const e = r.eingabe === null ? Math.ceil(aufgabe.length / 4) : r.eingabe;' ' const a = r.ausgabe === null ? Math.ceil(r.text.length / 4) : r.ausgabe;' ' const art = r.eingabe === null ? \"geschätzt\" : \"gezählt\";' ' console.log(\"Ihr Aufruf: \" + e + \" Eingabe, \" + a + \" Ausgabe (\" + art + \"), \" + kosten(\"klein\", e, a) + \" Mikro-Euro\");' '}' >> budget3.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 Budget schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const aufrufe = [' ' { nutzer: \"anna\", modell: \"klein\", eingabe: 900, ausgabe: 300 },' ' { nutzer: \"ben\", modell: \"klein\", eingabe: 1000, ausgabe: 500 },' ' { nutzer: \"anna\", modell: \"gross\", eingabe: 200, ausgabe: 100 },' ' { nutzer: \"clara\", modell: \"gross\", eingabe: 300, ausgabe: 50 },' ' { nutzer: \"clara\", modell: \"klein\", eingabe: 500, ausgabe: 100 },' ' { nutzer: \"david\", modell: \"gross\", eingabe: 200, ausgabe: 50 },' '];' >> budget3.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 Budget schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' await probelauf();' ' aufrufe.forEach(function (a, stelle) {' ' const preis = kosten(a.modell, a.eingabe, a.ausgabe);' ' const grund = pruefen(a.nutzer, preis);' ' const kopf = \"#\" + (stelle + 1) + \" \" + a.nutzer + \" \" + a.modell + \" \" + preis + \" Mikro-Euro: \";' ' if (grund === \"ok\") { abrechnen(a.nutzer, preis); console.log(kopf + \"ok\"); }' ' else console.log(kopf + meldung(grund, a.nutzer));' ' });' ' console.log(\"Heute ausgegeben: \" + ausgegeben.tag + \" Mikro-Euro = \" + (ausgegeben.tag / 1000000).toFixed(6) + \" Euro\");' '}' 'main();' >> budget3.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 Budget ausführen
docker exec -w /home/node/project agent node budget3.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| Ihr Aufruf: 42 Eingabe, 17 Ausgabe (gezählt)... | Ihr eigener Aufruf. Gezählt, wenn die Antwort Nutzungsdaten hat, sonst geschätzt. Er ändert sich bei jedem Lauf |
| #1 anna klein 2100 Mikro-Euro: ok | Abgerechnet |
| #3 anna gross 6000 Mikro-Euro: Hallo anna... | Vom Nutzerlimit abgelehnt, mit Meldung |
| #4 clara gross 5000 Mikro-Euro: Der Assistent... | Vom Tageslimit abgelehnt |
| Heute ausgegeben: 6000 Mikro-Euro = 0.006000 Euro | Nur die abgerechneten Aufrufe zählen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.