Die erste Version einer KI-Funktion
Die erste Version einer KI-Funktion ist die einfachste, die Sie messen können. Sie hat einen Prompt, ein Modell und eine kleine Menge Testfragen. Sie zählt, weil man nicht verbessern kann, was man nicht bewertet.
Die Stadtbibliothek Lindenhof hat jetzt ihren Auftrag. Das Team baut einen Assistenten, der aus einem Blatt mit neun Zeilen antwortet, und bewertet ihn an zehn Fragen.
Am Ende dieser Lektion
Notiz
Ich kann die einfachste Version bauen, die sich messen lässt.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Faktenblatt | die kurze Liste der Fakten, die der Assistent nutzen darf | |
| Testfall | eine Frage mit der Zahl, die die Antwort enthalten muss | c4 |
| Auswertung | Testfälle und eine Regel, die jeden bewertet | |
| Prüfung | die Regel, die eine Antwort mit bestanden oder nicht bewertet | |
| Ausgangswert | das erste Ergebnis, das spätere Versionen schlagen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Prompt, ein Modell, ein Blatt
Die einfachste Version hat vier Teile. Einen System-Prompt mit einer Regel. Ein Faktenblatt darin. Ein Modell. Eine Prüfung der Antwort.
Sie hat keine Suche, kein Gedächtnis und kein zweites Modell. Jeder fehlende Teil kann noch nicht versagen. Sie fügen einen erst hinzu, wenn ein Ergebnis es verlangt.
Beispiel: Version 1
| Teil | In der ersten Version |
|---|---|
| Prompt | In einem kurzen Satz antworten |
| Faktenblatt | Neun Fakten, in den Prompt kopiert |
| Modell | Eines, von der Plattform gewählt |
| Prüfung | Die richtige Zahl, keine andere, 40 Wörter |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Auswertung: Fälle und eine Regel
Ein Testfall ist eine Frage und die Zahl, die die Antwort enthalten muss. Die Prüfung bewertet jede Antwort mit derselben Regel.
Die Prüfung findet hier vier Arten von Fehlern. Eine Ablehnung. Eine erfundene Zahl, die nicht auf dem Blatt steht. Eine vage Antwort ohne die richtige Zahl. Eine zu lange Antwort über 40 Wörtern.
Beginnen Sie mit zehn Fällen
Zehn Fälle sind absichtlich wenig. Sie können jede Antwort lesen und sehen, warum jede scheitert.
Die Fälle stammen aus dem, was Leute fragen, nicht aus dem, was leicht ist. Taucht später ein echter Fehler auf, fügen Sie ihn als Fall 11 hinzu. Die Auswertung wächst mit den Belegen.
Ein häufiger Fehler
Warnung
Viele glauben, eine gute Vorführung sei eine Auswertung. Eine Vorführung ist ein Fall, den Sie gewählt haben. Eine Auswertung sind viele Fälle, die Sie nicht gewählt haben, mit derselben Regel bewertet. Eine Vorführung zeigt, was funktionieren kann. Eine Auswertung zeigt, wie oft es funktioniert.
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 Auswertung schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'const BLATT = \"Leihfrist 3 Wochen. Verlängern 2 Mal. Mahngebühr 20 Cent pro Tag. Geöffnet von 9 bis 17. Höchstens 8 Medien. Ersatzausweis 5 Euro. Raum 4 Stunden. Druck 10 Cent pro Seite. Unter 18 kostenlos.\";' 'const GRENZE = 40; // die größte Wortzahl einer Antwort' 'const BLATT_ZAHLEN = BLATT.match(/[0-9]+/g);' > eval.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 Auswertung schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const ROH = [' ' [\"c1\", \"Wie lange darf ich ein Buch behalten?\", \"3\", \"Sie dürfen ein Buch 3 Wochen behalten.\", 7, false],' ' [\"c2\", \"Kann ich ein Buch verlängern?\", \"2\", \"Ja, Sie können es 2 Mal verlängern.\", 7, false],' ' [\"c3\", \"Wie hoch ist die Mahngebühr?\", \"20\", \"Es sind 50 Cent pro Tag.\", 6, false],' ' [\"c4\", \"Wann öffnen Sie?\", \"9\", \"Wir öffnen jeden Tag um 9 Uhr.\", 7, false],' ' [\"c5\", \"Wann schließen Sie?\", \"17\", \"Wir schließen am Abend.\", 4, false],' >> eval.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 Auswertung schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' [\"c6\", \"Wie viele Medien darf ich ausleihen?\", \"8\", \"Sie dürfen 8 Medien gleichzeitig ausleihen.\", 6, false],' ' [\"c7\", \"Was kostet ein neuer Ausweis?\", \"5\", \"Ein neuer Ausweis kostet 7 Euro.\", 6, false],' ' [\"c8\", \"Kann ich einen Raum für den ganzen Tag buchen?\", \"4\", \"Dabei kann ich nicht helfen. Bitte fragen Sie die Auskunft.\", 10, true],' ' [\"c9\", \"Was kostet das Drucken?\", \"10\", \"Drucken kostet 10 Cent pro Seite. Schwarzweiß und Farbe kosten pro Seite gleich viel. Sie zahlen immer an der Auskunft, entweder mit Karte oder mit Münzen. Die Drucker und Kopierer stehen am Ostfenster neben den großen Tischen im Erdgeschoss, und die Scanner dort sind völlig kostenlos für alle, die einen Bibliotheksausweis oder eine Tageskarte haben.\", 55, false],' >> eval.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 Auswertung schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' ' [\"c10\", \"Dürfen Kinder beitreten?\", \"18\", \"Unter 18 ist der Ausweis kostenlos.\", 6, false],' '];' 'const FAELLE = ROH.map(function (r) {' ' return { id: r[0], frage: r[1], erwartet: r[2], antwort: r[3], laenge: r[4], abgelehnt: r[5] };' '});' >> eval.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 Auswertung schreiben, Teil 5
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function art(f) {' ' if (f.abgelehnt) return \"abgelehnt\";' ' const gefunden = f.antwort.match(/[0-9]+/g) || [];' ' for (const n of gefunden) {' ' if (BLATT_ZAHLEN.includes(n) === false) return \"erfunden\";' ' }' ' if (gefunden.includes(f.erwartet) === false) return \"vage\";' ' if (f.laenge > GRENZE) return \"zu_lang\";' ' return \"ok\";' '}' 'const zaehler = {};' 'for (const f of FAELLE) {' ' const a = art(f);' ' zaehler[a] = (zaehler[a] || 0) + 1;' ' console.log(f.id, a);' '}' 'console.log(\"Aufgezeichneter Lauf v1:\", zaehler.ok, \"von\", FAELLE.length, \"bestanden\");' 'console.log(JSON.stringify(zaehler));' 'require(\"fs\").writeFileSync(\"eval-v1.json\", JSON.stringify(FAELLE, null, 1));' >> eval.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 Auswertung schreiben, Teil 6
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function live() {' ' const system = \"Antworten Sie in einem kurzen Satz und nur mit diesem Blatt: \" + BLATT;' ' const nachrichten = [{ role: \"system\", content: system }, { role: \"user\", content: \"Wann öffnen Sie?\" }];' ' const antwort = await fragen(nachrichten, \"Wir öffnen jeden Tag um 9 Uhr.\", 40);' ' const gefunden = antwort.match(/[0-9]+/g) || [];' ' console.log(\"Live-Frage:\", antwort);' ' console.log(\"Enthält die Zahl 9:\", gefunden.includes(\"9\"), \"(zählt nicht zum Ergebnis)\");' '}' 'live();' >> eval.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.
Version 1 bewerten
docker exec -w /home/node/project agent node eval.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 sagt |
|---|---|
| c1 bis c10 | Je eine Art: ok, erfunden, vage, abgelehnt oder zu_lang |
| Aufgezeichneter Lauf v1 | 5 von 10 bestanden |
| JSON-Zeile | 5 ok, 2 erfunden, 1 vage, 1 abgelehnt, 1 zu_lang |
| Live-Frage | Ein kurzer Aufruf, nie im Ergebnis |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.