Jede Anfrage an das günstigste passende Modell
Modelle zu routen heißt, für jede Anfrage das günstigste Modell zu wählen, das genügt. Das ist wichtig, weil das teuerste ein Vielfaches des kleinsten kostet und die meisten Anfragen es nicht brauchen.
Ein Support-Werkzeug ordnet Tickets zu, beantwortet kurze Fragen und entwirft lange Antworten. Zuordnen braucht nicht das Modell, das entwirft. Alles an ein großes Modell zu schicken, bezahlt eine Leistung, die fast keine Anfrage nutzt.
Am Ende dieser Lektion
Notiz
Ich kann jede Anfrage an das günstigste ausreichende Modell weiterleiten und die Wahl an aufgezeichneten Fällen prüfen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Router | die Regel, die für eine Anfrage ein Modell wählt |
| Stufe | eine Gruppe von Modellen nach Größe und Preis |
| Gut genug | für diese Aufgabe oft genug richtig |
| Aufgezeichneter Fall | eine Anfrage mit der Stufe, die eine Person gewählt hat |
| Abweichung | ein Fall, in dem Router und Person sich unterscheiden |
| Hülle | der Code um einen Aufruf, der die Regeln hinzufügt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Router ist eine einfache Regel
Beginnen Sie mit einer lesbaren Regel. Ein kurzer Text oder eine Zuordnungsaufgabe geht an die Stufe klein. Ein langer Text oder eine Schlussfolgerungsaufgabe geht an die Stufe gross. Der Rest geht an die Stufe mittel.
Eine Regel nach Größe und Aufgabe ist billig, sofort da und leicht zu erklären. Man kann auch ein kleines Modell wählen lassen, doch das fügt jeder Anfrage einen Aufruf hinzu. Probieren Sie also zuerst die Regel.
Durchgerechnetes Beispiel: die Regel an vier Anfragen
| Anfrage | Aufgabe | Größe | Stufe |
|---|---|---|---|
| Ein Ticket zuordnen | klassifizieren | 150 Zeichen | klein |
| Eine Seite zusammenfassen | zusammenfassen | 1500 Zeichen | mittel |
| Eine Migration planen | schlussfolgern | 900 Zeichen | gross |
| Einen langen Bericht zusammenfassen | zusammenfassen | 5000 Zeichen | gross |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Regel an Fällen prüfen
Ein Router spart Geld und kann Qualität kosten, also testen Sie ihn. Halten Sie aufgezeichnete Fälle bereit: eine Anfrage, ihre Größe und Aufgabe und die Stufe, die eine Person für nötig hält. Lassen Sie den Router darüber laufen. Listen Sie die Abweichungen auf und summieren Sie die Kosten.
Eine Abweichung ist nicht immer ein Fehler der Regel. Lesen Sie jede. Dann ändern Sie die Regel oder den Fall.
Ein häufiger Fehler
Warnung
Viele glauben, das billigste Modell sei immer die beste Ersparnis. Ein billiges Modell, das schlecht antwortet, kostet eine Wiederholung, eine Beschwerde oder eine verlorene Person. Gehen Sie nur dort eine Stufe tiefer, wo aufgezeichnete Fälle zeigen, dass die Antwort noch genügt.
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.
Die Router-Prüfung schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' '// Erfundene Preise: Euro je Million Token, also Token mal Preis = Mikro-Euro.' 'const PREIS = { klein: { eingabe: 1, ausgabe: 4 }, mittel: { eingabe: 3, ausgabe: 12 }, gross: { eingabe: 10, ausgabe: 40 } };' 'function weiterleiten(anfrage) {' ' if (anfrage.aufgabe === \"klassifizieren\" || anfrage.zeichen <= 200) return \"klein\";' ' if (anfrage.aufgabe === \"schlussfolgern\" || anfrage.zeichen > 2000) return \"gross\";' ' return \"mittel\";' '}' 'function kosten(stufe, f) { return f.eingabe * PREIS[stufe].eingabe + f.ausgabe * PREIS[stufe].ausgabe; }' > route6.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 Router-Prüfung schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Aufgezeichnete Fälle: was jede Anfrage ist und welche Stufe eine Prüferin für nötig hält.' 'const FAELLE = [' ' { id: 1, aufgabe: \"klassifizieren\", zeichen: 150, eingabe: 60, ausgabe: 5, erwartet: \"klein\" },' ' { id: 2, aufgabe: \"frage\", zeichen: 180, eingabe: 70, ausgabe: 40, erwartet: \"klein\" },' ' { id: 3, aufgabe: \"zusammenfassen\", zeichen: 1500, eingabe: 500, ausgabe: 150, erwartet: \"mittel\" },' ' { id: 4, aufgabe: \"schlussfolgern\", zeichen: 900, eingabe: 400, ausgabe: 600, erwartet: \"gross\" },' '];' >> route6.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 Router-Prüfung schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const WEITERE = [' ' { id: 5, aufgabe: \"zusammenfassen\", zeichen: 5000, eingabe: 1400, ausgabe: 300, erwartet: \"gross\" },' ' { id: 6, aufgabe: \"klassifizieren\", zeichen: 3000, eingabe: 800, ausgabe: 5, erwartet: \"klein\" },' ' { id: 7, aufgabe: \"frage\", zeichen: 700, eingabe: 250, ausgabe: 120, erwartet: \"mittel\" },' ' { id: 8, aufgabe: \"zusammenfassen\", zeichen: 190, eingabe: 80, ausgabe: 30, erwartet: \"mittel\" },' '];' >> route6.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 Router-Prüfung schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const alle = FAELLE.concat(WEITERE);' ' let summe = 0, teuer = 0, abweichungen = [];' ' for (const f of alle) {' ' const stufe = weiterleiten(f);' ' summe = summe + kosten(stufe, f);' ' teuer = teuer + kosten(\"gross\", f);' ' if (stufe === f.erwartet) console.log(\"#\" + f.id + \" \" + f.aufgabe + \": \" + stufe + \" ok\");' ' else { abweichungen.push(f.id); console.log(\"#\" + f.id + \" \" + f.aufgabe + \": \" + stufe + \", erwartet \" + f.erwartet); }' ' }' ' console.log(\"Abweichungen: \" + abweichungen.length + \" von \" + alle.length + \", Fälle \" + abweichungen.join(\", \"));' ' console.log(\"Weitergeleitete Kosten: \" + summe + \". Alles auf gross: \" + teuer + \". Ersparnis: \" + (teuer - summe));' >> route6.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 Router-Prüfung schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' const r = await fragen([{ role: \"user\", content: \"Ordne zu: Abrechnung, Fehler oder anderes. Ich wurde zweimal belastet.\" }], \"Abrechnung\", 10);' ' console.log(\"Weitergeleitet an \" + weiterleiten(alle[0]) + \", Antwort: \" + r.text.slice(0, 40));' '}' 'main();' >> route6.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 Router-Prüfung ausführen
docker exec -w /home/node/project agent node route6.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Das Labor hat nur ein Modell
Im Labor antwortet ein einziges Modell, egal welche Stufe die Regel wählt, und die Plattform bestimmt es. Der Run zeigt also die Wahl und die Kosten, und der eine echte Aufruf zeigt nur, dass eine weitergeleitete Anfrage eine Antwort bekommt.
Die Preise und die acht Fälle sind erfunden und aufgezeichnet, daher geben alle Studierenden dieselben Zeilen aus.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| #1 klassifizieren: klein ok | Router und Person sind einig |
| #8 zusammenfassen: klein, erwartet mittel | Eine Abweichung, die man liest und entscheidet |
| Abweichungen: 1 von 8, Fälle 8 | Die Anzahl und die Fallnummern |
| Weitergeleitete Kosten: 60820. Alles auf gross: 85600. Ersparnis: 24780 | Die Summe in Mikro-Euro |
| Weitergeleitet an klein, Antwort: ... | Ein echter Aufruf. Die Worte ändern sich bei jedem Lauf |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.