Wie ein Schutzschalter funktioniert
Ein Schutzschalter (englisch Circuit Breaker) ist eine kleine Regel, die keine Aufrufe mehr an einen Dienst schickt, der immer wieder ausfällt. Solange er offen ist, nutzt die Funktion eine Ausweichlösung, statt auf einen Aufruf zu warten, der scheitern wird.
Das Modul über Kosten, Tracing und Zuverlässigkeit listet die Ausweichlösungen auf. Diese Lektion geht weiter: wann man aufhört anzurufen, wann man es wieder versucht und einen Notschalter, den eine Person drücken kann.
Am Ende dieser Lektion
Notiz
Ich kann eine Funktion nützlich halten, während ihr Modell ausfällt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Schutzschalter | eine Regel, die Aufrufe an einen ausfallenden Dienst stoppt | |
| Geschlossen | der Normalzustand: Aufrufe gehen durch | |
| Offen | der Stopp-Zustand: kein Aufruf, eine Ausweichlösung antwortet | |
| Halboffen | ein Probeaufruf, ob der Dienst wieder da ist | |
| Abkühlung | Schritte, die man vor einer Probe wartet | 4 |
| Notschalter | ein Schalter, der eine Funktion sofort abstellt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Drei Zustände
Ein Schutzschalter ist geschlossen, wenn alles gut läuft. Aufrufe gehen durch. Er zählt Fehler hintereinander. Erreicht die Zahl die Schwelle, hier 3, öffnet er.
Solange er offen ist, macht er keinen Aufruf. Nach der Abkühlung, hier 4 Schritte, wird er halboffen und lässt einen Aufruf durch. Ein Erfolg schließt ihn. Ein Fehler öffnet ihn wieder.
Durchgerechnetes Beispiel: Schritte 3 bis 9
| Schritt | Aufruf würde | Zustand vorgefunden | Bedient | Warum |
|---|---|---|---|---|
| 3 | scheitern | Geschlossen | Gescheitert | Erster Fehler hintereinander, Zahl 1 |
| 4 | scheitern | Geschlossen | Gescheitert | Zahl 2 |
| 5 | scheitern | Geschlossen | Gescheitert | Zahl erreicht 3, also öffnet er |
| 6 | klappen | Offen | Übersprungen | Kein Aufruf. 1 Schritt seit dem Öffnen |
| 7 | klappen | Offen | Übersprungen | 2 Schritte seit dem Öffnen |
| 8 | klappen | Offen | Übersprungen | 3 Schritte seit dem Öffnen |
| 9 | klappen | Halboffen | Modell | 4 Schritte, die Probe klappt, also schließt er |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, ein Schutzschalter solle beim ersten Fehler öffnen. Ein einzelner Fehler ist oft nur ein Ausrutscher. Zählen Sie Fehler hintereinander und lassen Sie einen Erfolg die Zahl zurücksetzen, sonst schaltet ein einziger schlechter Aufruf einen gesunden Dienst ab.
Was die Ausweichlösung sagt
Eine Ausweichlösung soll ehrlich und nützlich sein. Am besten ist eine gespeicherte Antwort auf dieselbe Frage. Gibt es keine, sagen Sie klar, dass der Assistent ausgelastet ist und wann man es wieder versuchen kann.
Zeigen Sie nie eine erfundene Antwort, als hätte das Modell sie gegeben.
Ein Notschalter ist die Entscheidung einer Person
Ein Schutzschalter reagiert auf Fehler. Einen Notschalter drückt eine Person, wenn das Modell zwar arbeitet, aber nicht genutzt werden soll. Es könnte falsche Antworten geben oder zu viel kosten.
Solange er an ist, wird jeder Aufruf übersprungen. Er berührt den Schutzschalter nicht, der behält seine eigene Zahl und seinen Zustand.
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 Schalter-Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'function schritt(s, ausgang, i, schwelle, abkuehlung, notschalter) {' ' if (notschalter) return [s.zustand, \"übersprungen\"];' ' if (s.zustand === \"offen\" && i - s.geoeffnetBei >= abkuehlung) s.zustand = \"halboffen\";' ' const vorgefunden = s.zustand;' ' if (vorgefunden === \"offen\") return [vorgefunden, \"übersprungen\"];' ' if (ausgang === 1) { s.zustand = \"geschlossen\"; s.fehler = 0; return [vorgefunden, \"modell\"]; }' ' s.fehler = s.fehler + 1;' ' if (vorgefunden === \"halboffen\" || s.fehler >= schwelle) { s.zustand = \"offen\"; s.geoeffnetBei = i; s.fehler = 0; }' ' return [vorgefunden, \"gescheitert\"];' '}' > schalter.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 Schalter-Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const ausgaenge = [1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1];' 'function fahren(aus) {' ' const s = { zustand: \"geschlossen\", fehler: 0, geoeffnetBei: 0 };' ' return ausgaenge.map(function (o, k) {' ' const r = schritt(s, o, k + 1, 3, 4, aus.includes(k + 1));' ' return r[0] + \":\" + r[1];' ' });' '}' >> schalter.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 Schalter-Skript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const spur = fahren([]);' ' console.log(spur.slice(0, 10).join(\" \"));' ' console.log(spur.slice(10).join(\" \"));' ' const gemacht = spur.filter(function (t) { return t.endsWith(\"übersprungen\") === false; }).length;' ' console.log(\"Aufrufe gemacht \" + gemacht + \" von \" + spur.length);' ' console.log(\"Notschalter 9 und 10: \" + fahren([9, 10]).slice(8, 11).join(\" \"));' ' const f = \"Was sollte eine Funktion sagen, wenn ihr Modell nicht erreichbar ist? Antworten Sie in einem kurzen Satz.\";' ' const probe = \"Sagen Sie offen, dass der Assistent gerade ausgelastet ist, und bieten Sie eine gespeicherte Antwort oder einen anderen Weg an.\";' ' const antwort = await fragen([{ role: \"user\", content: f }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> schalter.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 Schutzschalter ausführen
docker exec -w /home/node/project agent node schalter.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 |
|---|---|
| geschlossen:modell geschlossen:modell geschlossen:gescheitert ... | Schritte 1 bis 10, der vorgefundene Zustand und wie bedient wurde |
| offen:übersprungen offen:übersprungen offen:übersprungen halboffen:modell | Der Schalter öffnet, wartet, und eine Probe klappt |
| Aufrufe gemacht 14 von 20 | Sechs Aufrufe wurden gespart |
| Notschalter 9 und 10: offen:übersprungen offen:übersprungen halboffen:modell | Der Schalter übersprang zwei Schritte, und die Abkühlung lief weiter |
| Das Modell sagte: ... | Ein Satz aus dem Labor. Eine Aufgezeichnete Probe, wenn kein Modell antwortet |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.