Die Antwort, die die App zum Absturz brachte
JSON von einem Sprachmodell anzufordern heißt, ihm in der Aufforderung genau die Form der gewünschten Antwort zu beschreiben. Das ist wichtig, weil ein Programm nur eine Antwort nutzen kann, die es lesen kann.
Die App einer Mensa bittet ein Modell, ein Brötchen und seinen Preis zu erfinden. Eines Tages beginnt die Antwort mit „Klar, hier ist“ und das Programm bleibt stehen. Das Modell hat geantwortet, aber nicht in lesbarer Form.
Am Ende dieser Lektion
Notiz
Ich kann eine Antwort in einer Form anfordern, die mein Programm lesen kann.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Aufforderung | der Text, den Sie an ein Modell senden | |
| JSON | ein Textformat für Daten, aus Schlüsseln und Werten | |
| Schlüssel | der Name eines Feldes in einem JSON-Objekt | preis |
| Codeblock | drei Gravis-Zeichen, die Code in einer Antwort umgeben | |
| Parsen | einen Text in nutzbare Daten einlesen | |
| Token-Grenze | die größte Länge einer Antwort |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Form in der Aufforderung sagen
Ein Modell errät aus Ihren Worten, was Sie wollen. Sagen Sie deshalb die Form. Nennen Sie die Schlüssel, geben Sie den Typ jedes Wertes an und sagen Sie, was wegbleiben soll.
Schließen Sie mit einer einfachen Regel: nur mit dem JSON antworten. Je mehr Sie dem Zufall überlassen, desto verschiedener werden die Antworten.
Beispiel: drei Aufforderungen für ein Brötchen
| Die Aufforderung sagt | Was zurückkommen kann |
|---|---|
| Nennen Sie mir ein Brötchen und einen Preis | Sätze, vielleicht eine Liste, keine festen Schlüssel |
| Nennen Sie mir ein Brötchen als JSON | Wahrscheinlich JSON, mit Schlüsseln, die Sie nicht gewählt haben |
| Antworten Sie mit einem JSON-Objekt mit den Schlüsseln name (Text) und preis (eine Zahl). Antworten Sie nur mit dem JSON. | Eher die Form, die Sie verlangt haben |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Beispielantwort zeigen
Ein Beispiel ist mehr wert als ein Absatz voller Regeln. Legen Sie in die Aufforderung eine vollständige Antwort mit erfundenen Werten und sagen Sie, dass die echte Antwort dieselben Schlüssel haben muss.
Modelle neigen dazu, das Muster eines Beispiels zu kopieren. Nehmen Sie Werte, die niemand für echt hält, sonst gilt ein kopiertes Beispiel als echte Antwort.
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.
Das erste Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' 'const nachrichten = [' ' { role: \"system\", content: \"Sie antworten nur mit JSON.\" },' ' { role: \"user\", content: \"Erfinden Sie ein belegtes Brötchen für die Mensa einer Hochschule. Antworten Sie mit einem JSON-Objekt mit den Schlüsseln name (Text) und preis (eine Zahl in Euro). Antworten Sie nur mit dem JSON.\" },' '];' 'const zaun = \"\x60\x60\x60\";' '// Aufgezeichnete Probe, nur benutzt, wenn kein Modell antwortet. Sie ist absichtlich unordentlich.' 'const probe = \"Klar, hier ist Ihr Brötchen:\n\" + zaun + \"json\n\" + JSON.stringify({ name: \"Käsebrötchen\", preis: 2.2 }) + \"\n\" + zaun + \"\nGuten Appetit.\";' > anfrage1.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 erste Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function jsonHerausziehen(text) {' ' try { return JSON.parse(text); } catch (fehler) { }' ' 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; }' '}' '' 'async function main() {' ' const antwort = await fragen(nachrichten, probe, 100);' ' console.log(\"Rohantwort:\");' ' console.log(antwort);' ' let ganz = true;' ' try { JSON.parse(antwort); } catch (fehler) { ganz = false; }' ' console.log(\"Die ganze Antwort ist JSON:\", ganz ? \"ja\" : \"nein\");' ' console.log(\"Herausgezogen:\", JSON.stringify(jsonHerausziehen(antwort)));' '}' 'main();' >> anfrage1.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.
Ausführen und die Antwort lesen
docker exec -w /home/node/project agent node anfrage1.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 |
|---|---|
| Rohantwort | Ein Satz, dann das JSON in einem Codeblock, dann ein weiterer Satz |
| Die ganze Antwort ist JSON | nein |
| Herausgezogen | {"name":"Käsebrötchen","preis":2.2} |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Warum eine gute Aufforderung scheitern kann
Auch eine klare Aufforderung kann scheitern. Das Modell kann einen Gruß anfügen, das JSON in einen Codeblock packen oder einen Schlüsselnamen ändern. Es kann auch zu früh aufhören, wenn die Token-Grenze zu klein ist, und das JSON bleibt abgeschnitten.
Deshalb wird immer geparst und geprüft. Gutes Fragen macht eine schlechte Antwort seltener. Unmöglich macht es sie nie.
Ein häufiger Fehler
Warnung
Viele glauben, eine klare Aufforderung erspare die Prüfung. Eine Aufforderung senkt nur die Wahrscheinlichkeit einer schlechten Antwort. Behalten Sie die Prüfung, auch wenn die letzten hundert Antworten gut waren.