Dem Modell sagen, was nicht stimmte
Eine Reparaturschleife fragt nach einer schlechten Antwort erneut und schickt dem Modell die Fehler zurück, damit es sie behebt. Das ist wichtig, weil ein zweiter Versuch, der das Problem kennt, oft gelingt, wo ein blinder Versuch scheitern würde.
Ein Formular-Werkzeug erhält eine Antwort mit einem Wort, das das Schema nicht erlaubt. Sie abzulehnen vernichtet die Arbeit. Erneut zu fragen, mit dem Fehler in der Nachricht, rettet sie meistens.
Am Ende dieser Lektion
Notiz
Ich kann eine schlechte Antwort mit dem Fehler als Rückmeldung wiederholen, einige Male und nicht öfter.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Reparaturschleife | nach einer schlechten Antwort erneut fragen, mit Rückmeldung |
| Rückmeldung | die Fehler, in einer neuen Nachricht zurückgeschickt |
| Wiederholungsgrenze | die größte Zahl zusätzlicher Versuche |
| Notausgang | was man tut, wenn die Grenze erreicht ist |
| Nachrichtenliste | das Gespräch, das bei jedem Aufruf mitgeschickt wird |
| Aufgeben | anhalten und den Notausgang nehmen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Fehler zurückschicken
Um eine Antwort zu reparieren, fragen Sie erneut mit dem ganzen bisherigen Gespräch. Hängen Sie die schlechte Antwort als Nachricht des Assistenten an. Hängen Sie dann eine Nachricht des Benutzers an, die die Fehler auflistet und die Regel wiederholt: nur mit dem JSON antworten.
Die Nachrichtenliste wächst jedes Mal um zwei. Das Modell sieht, was es sagte und was daran nicht stimmte.
Beispiel: drei Versuche
| Versuch | Antwort | Gefundener Fehler | Danach gesendet |
|---|---|---|---|
| 1 | Wahrscheinlich ja, Weizen enthält es. | Kein JSON-Objekt | Der Fehler und die Regel, nur mit dem JSON zu antworten |
| 2 | {"antwort": "vielleicht"} | antwort muss ja oder nein sein | Der Fehler und die Regel noch einmal |
| 3 | {"antwort": "ja"} | Keiner | Nichts: Sie wird angenommen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Grenze und ein Notausgang
Jede Wiederholung kostet Zeit und Guthaben. Setzen Sie deshalb eine Wiederholungsgrenze: den ersten Versuch und höchstens zwei weitere. Ist die Grenze erreicht, geben Sie auf und nehmen den Notausgang.
Ein Notausgang ist ein sicherer Wert wie „unbekannt“ oder ein Fehler, den eine Person sieht. Notieren Sie, dass es geschah, um zu sehen, wie oft.
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\";' '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 || 200 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' return (await res.json()).choices[0].message.content;' > 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' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' const liste = [].concat(probe);' ' const runde = nachrichten.filter(function (m) { return m.role === \"assistant\"; }).length;' ' return liste[Math.min(runde, liste.length - 1)];' ' }' '}' '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 Reparaturschleife schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' 'const erlaubt = [\"ja\", \"nein\"];' 'const MAX_VERSUCHE = 3; // der erste Versuch und höchstens zwei weitere' '' 'function jsonHerausziehen(text) {' ' const anfang = text.indexOf(\"{\");' ' const ende = text.lastIndexOf(\"}\");' ' if (anfang === -1 || ende < anfang) return null;' ' try { return JSON.parse(text.slice(anfang, ende + 1)); } catch (fehler) { return null; }' '}' > reparatur3.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 Reparaturschleife schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function problemeVon(text) {' ' const antwort = jsonHerausziehen(text);' ' if (antwort === null) return [\"die Antwort ist kein JSON-Objekt\"];' ' if (Object.prototype.hasOwnProperty.call(antwort, \"antwort\") === false) return [\"der Schlüssel antwort fehlt\"];' ' if (erlaubt.includes(antwort.antwort) === false) return [\"antwort muss ja oder nein sein\"];' ' return [];' '}' >> reparatur3.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 Reparaturschleife schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function reparaturSchleife(frage, proben) {' ' const nachrichten = [{ role: \"user\", content: frage }];' ' for (let versuch = 1; versuch <= MAX_VERSUCHE; versuch = versuch + 1) {' ' const antwort = await fragen(nachrichten, proben, 60);' ' const gefunden = problemeVon(antwort);' ' console.log(\"Versuch \" + versuch + \": \" + (gefunden.length === 0 ? \"ok\" : gefunden.join(\"; \")));' ' if (gefunden.length === 0) return { ok: true, antwort: jsonHerausziehen(antwort), versuche: versuch };' ' nachrichten.push({ role: \"assistant\", content: antwort });' ' nachrichten.push({ role: \"user\", content: \"Beheben Sie diese Probleme und antworten Sie nur mit dem JSON: \" + gefunden.join(\"; \") });' ' }' ' return { ok: false, antwort: null, versuche: MAX_VERSUCHE };' '}' >> reparatur3.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 Reparaturschleife schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const frage = \"Enthält Weizenmehl Gluten? Antworten Sie mit einem JSON-Objekt mit dem Schlüssel antwort, der ja oder nein ist. Antworten Sie nur mit dem JSON.\";' ' // Aufgezeichnete Proben, nur benutzt, wenn kein Modell antwortet: zwei schlechte Antworten, dann eine gute.' ' const proben = [\"Wahrscheinlich ja, Weizen enthält es.\", JSON.stringify({ antwort: \"vielleicht\" }), JSON.stringify({ antwort: \"ja\" })];' ' const ergebnis = await reparaturSchleife(frage, proben);' ' const notausgang = { antwort: \"unbekannt\" };' ' console.log(\"Benutzte Versuche:\", ergebnis.versuche);' ' console.log(\"Ergebnis:\", JSON.stringify(ergebnis.ok ? { antwort: ergebnis.antwort.antwort } : notausgang));' '}' 'main();' >> reparatur3.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 Schleife ausführen
docker exec -w /home/node/project agent node reparatur3.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 zeigen kann |
|---|---|
| Versuch 1 | ok, wenn das Modell gleich sauberes JSON antwortete |
| Versuch 2 und Versuch 3 | Nur wenn Versuch 1 scheiterte: der Fehler oder ok |
| Benutzte Versuche | Eine Zahl von 1 bis 3 |
| Ergebnis | Die Antwort oder der Notausgang {"antwort":"unbekannt"} |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, Wiederholen bis es klappt sei unbedenklich. Trifft das Modell nie die richtige Form, endet eine Schleife ohne Grenze nie, und jeder Versuch kostet Zeit und Guthaben. Setzen Sie immer eine Grenze und legen Sie zuerst den Notausgang fest.