Einen Prompt wie auszulieferenden Code behandeln
Ein Prompt ändert, was eine Funktion tut, und braucht deshalb die Sorgfalt, die Code bekommt. Das heißt: eine Datei, eine Version, ein Review, ein schrittweiser Rollout und ein Weg zurück. Das ist wichtig, weil ein geändertes Wort einen Fall verbessern und einen anderen brechen kann, ohne dass ein Test es zeigt.
Ein Team ändert am Freitagnachmittag einen Prompt in einem Dashboard. Am Montag kommen die Beschwerden. Niemand weiß, was sich geändert hat, und niemand kann es zurücknehmen.
Am Ende dieser Lektion
Notiz
Ich kann einen Prompt wie Code versionieren, prüfen und ausrollen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Prompt-Version | ein benannter, gespeicherter Stand eines Prompts | v2 |
| Bewertungsfall | eine Eingabe mit einer Bestehensregel | |
| Rückschritt | ein Fall, der vorher bestand und jetzt scheitert | |
| Gestufter Rollout | eine Änderung an einen Teil der Nutzer ausliefern | |
| Eimer | eine Zahl von 0 bis 99 für einen Nutzer |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Prompt lebt in einer versionierten Datei
Legen Sie jeden Prompt in einer Datei im Repository ab, mit Namen und Version. Eine Änderung wird dann zu einem Commit, einem Review und einem Unterschied. Der Code verweist auf einen Prompt über Name und Version, nie über eine eingefügte Zeichenkette.
Die Version steht in jedem Protokolleintrag. Ist eine Antwort schlecht, können Sie sagen, welcher Prompt sie erzeugt hat.
Eine Änderung an aufgezeichneten Ergebnissen beurteilen
Lassen Sie dieselben Bewertungsfälle mit dem alten und dem neuen Prompt laufen. Vergleichen Sie die Bestehensquote und listen Sie die Rückschritte auf: Fälle, die bestanden und jetzt scheitern. Zwei Prompts mit gleicher Quote können in verschiedenen Fällen bestehen.
Markieren Sie manche Fälle als Pflicht, etwa eine Ablehnung, die einen Nutzer schützt. Eine Änderung, die einen davon verfehlt, geht nicht raus, egal wie die Quote ist.
Beispiel: v1 gegen v2
| Fall | v1 | v2 | Hinweis |
|---|---|---|---|
| f1 (Pflicht) | besteht | besteht | Bleibt |
| f2 (Pflicht) | besteht | besteht | Bleibt |
| f3 | scheitert | besteht | Behoben |
| f4 | besteht | besteht | Bleibt |
| f5 | besteht | scheitert | Rückschritt: Ein Mensch muss hinsehen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Über einen deterministischen Eimer ausrollen
Stellen Sie nicht alle Nutzer auf einmal um. Machen Sie aus einer Nutzer-ID mit einer festen Funktion einen Eimer von 0 bis 99. Ein Nutzer bekommt den neuen Prompt, wenn sein Eimer unter dem Rollout-Prozentsatz liegt.
Derselbe Nutzer bekommt immer dieselbe Version, und ein höherer Prozentsatz fügt nur Nutzer hinzu. Nehmen Sie nie eine Zufallszahl pro Anfrage: Eine Person sähe beide Versionen.
Einen Weg zurück behalten
Behalten Sie die alte Version im Repository und den Prozentsatz in einer einzigen Einstellung. Um zurückzugehen, setzen Sie den Prozentsatz auf null. Kein Deployment, keine Bearbeitung, kein Streit.
Erhöhen Sie den Prozentsatz in Stufen und beobachten Sie auf jeder Stufe dieselben Messwerte: Quote auf echten Stichproben, Kosten und Beschwerden.
Ein häufiger Fehler
Warnung
Viele glauben, eine höhere Bestehensquote heiße eine sichere Änderung. Sie kann einen Tausch verbergen: ein Fall behoben, ein anderer gebrochen. Lesen Sie die Liste der Rückschritte und prüfen Sie die Pflichtfälle, nicht nur die Quote.
Das Modell-Hilfsskript 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.
Das Modell-Hilfsskript 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 Prompt-Auslieferung schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const fs = require(\"fs\");' 'const { fragen } = require(\"./model\");' '// Ein Prompt lebt in einer Datei mit Version, so ist eine Änderung ein Unterschied.' 'const datei = { name: \"zusammenfassung\", version: \"v2\", text: \"Fassen Sie das Ticket in einem Satz zusammen. Nennen Sie das Produkt.\" };' 'fs.writeFileSync(\"prompt-zusammenfassung.json\", JSON.stringify(datei, null, 1));' '// Aufgezeichnete Bewertungsergebnisse: Hat jeder Fall bestanden? Für die Lektion erfunden.' 'const alt = { f1: true, f2: true, f3: false, f4: true, f5: true };' 'const neu = { f1: true, f2: true, f3: true, f4: true, f5: false };' 'const PFLICHT = [\"f1\", \"f2\"]; // Fälle, die nie scheitern dürfen' > prompts.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 Prompt-Auslieferung schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function quote(lauf) {' ' const namen = Object.keys(lauf);' ' const bestanden = namen.filter(function (n) { return lauf[n]; });' ' return Math.floor(bestanden.length * 100 / namen.length);' '}' 'function gruende(a, b) {' ' const ausgabe = [];' ' if (quote(b) < quote(a)) ausgabe.push(\"Quote niedriger\");' ' PFLICHT.forEach(function (n) { if (b[n] === false) ausgabe.push(\"Pflichtfall scheitert: \" + n); });' ' return ausgabe;' '}' 'const gerutscht = Object.keys(alt).filter(function (n) { return alt[n] && neu[n] === false; });' 'console.log(\"alt\", quote(alt), \"neu\", quote(neu));' 'console.log(\"darf raus:\", gruende(alt, neu).length === 0, \"Rückschritte:\", gerutscht.join(\",\"));' >> prompts.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 Prompt-Auslieferung schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function eimer(nutzer) {' ' let h = 0;' ' for (const z of nutzer) h = (h * 31 + z.charCodeAt(0)) % 1000003;' ' return h % 100;' '}' 'const rollout = { prompt: \"v2\", rueckfall: \"v1\", prozent: 20 };' 'function version(n) { return eimer(n) < rollout.prozent ? rollout.prompt : rollout.rueckfall; }' '[\"felix\", \"eva\", \"ben\", \"anna\", \"paul\", \"clara\"].forEach(function (n) { console.log(n, eimer(n), version(n)); });' 'rollout.prozent = 0; // der Weg zurück ist eine Zahl' 'console.log(\"nach dem Zurückrollen:\", version(\"felix\"), version(\"eva\"));' >> prompts.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 Prompt-Auslieferung schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const text = datei.text + \" Ticket: Das Orbit-Telefon lädt seit Montag nicht mehr.\";' ' const probe = \"Das Orbit-Telefon lädt seit Montag nicht mehr.\";' ' console.log(\"Echter Aufruf mit v2:\", await fragen([{ role: \"user\", content: text }], probe, 40));' '}' 'main();' >> prompts.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.
Einen Prompt beurteilen und ausrollen
docker exec -w /home/node/project agent node prompts.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 aufgezeichnet ist und was echt
Die Bewertungsergebnisse sind aufgezeichnet und erfunden. Ein echtes Team lässt eigene Fälle laufen und legt die Ergebnisse neben der Prompt-Version ab. Die Eimer-Funktion und die Rollout-Einstellung sind die echte Technik.
Der Run schreibt prompt-zusammenfassung.json. Öffnen Sie sie und lesen Sie die Version.
Eine mögliche Ausgabe
| Zeile | Was sie zeigt |
|---|---|
| alt 80 neu 80 | Die Bestehensquote ist gleich |
| darf raus: true Rückschritte: f5 | Die Regel erlaubt es, und ein Mensch liest trotzdem f5 |
| felix 5 v2 und die anderen Nutzer | Jeder Nutzer hat einen festen Eimer und eine feste Version |
| nach dem Zurückrollen: v1 v1 | Der Prozentsatz null schickt alle zu v1 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.