Wie man zwei KI-Versionen fair vergleicht
Ein A/B-Test gibt Version A einer Gruppe von Nutzern und Version B einer anderen und vergleicht dann, wie oft jede funktioniert. Ein Schattentest lässt die neue Version auf echten Anfragen laufen, aber niemand sieht ihre Antworten.
Beide können Sie täuschen. Eine Lücke von neun Punkten kann trotzdem Zufall sein.
Am Ende dieser Lektion
Notiz
Ich kann zwei Versionen vergleichen, ohne mich vom Zufall täuschen zu lassen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| A/B-Test | zwei Nutzergruppen, je eine Version |
| Schattentest | eine neue Version, die läuft, wo sie niemand sieht |
| Erfolgsquote | der Anteil der Anfragen, die funktionierten |
| Lücke | eine Quote minus die andere, in Punkten |
| Schwankung | wie weit sich eine Lücke durch Zufall verschiebt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Lücke muss die Schwankung übertreffen
Version B besteht 138 von 200 und A besteht 120 von 200. Die Lücke beträgt 9 Punkte. Aber auch zwei Gruppen mit je 200 Nutzern unterscheiden sich durch Zufall.
Die Schwankung sagt, wie weit sich eine Lücke durch Zufall verschiebt. Eine Faustregel: Trauen Sie einer Lücke nur, wenn sie mindestens das Doppelte der Schwankung beträgt.
Durchgerechnetes Beispiel: zwei Tests
| Test | Nutzer je Gruppe | Lücke | Schwankung | Doppelte Schwankung | Urteil |
|---|---|---|---|---|---|
| A gegen B | 200 | 9,0 | 4,8 | 9,6 | Nicht belegt |
| A gegen C | 1.000 | 5,0 | 2,2 | 4,3 | Belastbar |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, die höhere Punktzahl gewinne. Eine höhere Punktzahl aus einem kleinen Test kann Zufall sein. Nennen Sie nur dann einen Sieger, wenn die Lücke mindestens das Doppelte der Schwankung beträgt. Sonst schreiben Sie nicht belegt und sammeln mehr Daten.
Ein Schattentest findet neue Fehler ohne Risiko
Lassen Sie die neue Version auf denselben echten Anfragen laufen und halten Sie ihre Antworten verborgen. Für jede Anfrage haben Sie ein Paar: das alte und das neue Ergebnis.
Gleiche Summen können eine Veränderung verbergen. Zwei Fälle können schlechter werden, während zwei andere besser werden. Zählen Sie die schlechteren und lesen Sie jeden.
Durchgerechnetes Beispiel: zwölf Paare
| Paar (alt, neu) | Bedeutung | Anzahl |
|---|---|---|
| bestanden, bestanden | Gleich | 7 |
| durchgefallen, durchgefallen | Gleich | 1 |
| durchgefallen, bestanden | Neu besser | 2 |
| bestanden, durchgefallen | Neu schlechter, diese lesen | 2 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
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 Vergleichsskript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' 'function schwankung(a, an, b, bn) {' ' const p = (a + b) / (an + bn);' ' return Math.sqrt(p * (1 - p) * (1 / an + 1 / bn)) * 100;' '}' 'function luecke(a, an, b, bn) { return (b / bn - a / an) * 100; }' 'function urteil(a, an, b, bn) {' ' const ok = Math.abs(luecke(a, an, b, bn)) >= 2 * schwankung(a, an, b, bn);' ' return ok ? \"belastbar\" : \"nicht belegt\";' '}' 'function komma(zahl) { return zahl.toFixed(1).replace(\".\", \",\"); }' > ab.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 Vergleichsskript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const tests = [' ' { name: \"A gegen B\", a: 120, an: 200, b: 138, bn: 200 },' ' { name: \"A gegen C\", a: 600, an: 1000, b: 650, bn: 1000 },' '];' 'const paare = \"bb bb bf bb fb bb ff bb bf bb bb fb\".split(\" \");' 'function zaehlen(art) { return paare.filter(function (p) { return p === art; }).length; }' >> ab.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 Vergleichsskript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' tests.forEach(function (t) {' ' console.log(t.name + \": Lücke \" + komma(luecke(t.a, t.an, t.b, t.bn)) + \" Punkte, Schwankung \" + komma(schwankung(t.a, t.an, t.b, t.bn)) + \" -> \" + urteil(t.a, t.an, t.b, t.bn));' ' });' ' console.log(\"Schatten: gleich \" + (zaehlen(\"bb\") + zaehlen(\"ff\")) + \", neu besser \" + zaehlen(\"fb\") + \", neu schlechter \" + zaehlen(\"bf\"));' ' const f = \"Schreiben Sie in einem kurzen Satz, warum eine Lücke von 9 Punkten trotzdem Zufall sein kann.\";' ' const probe = \"Bei nur 200 Nutzern je Gruppe kann der Zufall allein eine Quote so weit verschieben.\";' ' const antwort = await fragen([{ role: \"user\", content: f }], probe, 60);' ' console.log(\"Das Modell sagte: \" + antwort.text);' '}' 'main();' >> ab.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 Vergleich ausführen
docker exec -w /home/node/project agent node ab.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 |
|---|---|
| A gegen B: Lücke 9,0 Punkte, Schwankung 4,8 -> nicht belegt | Eine große Lücke, ein kleiner Test |
| A gegen C: Lücke 5,0 Punkte, Schwankung 2,2 -> belastbar | Eine kleinere Lücke, ein größerer Test |
| Schatten: gleich 8, neu besser 2, neu schlechter 2 | Gezählt aus zwölf aufgezeichneten Paaren |
| 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.