Die Telefonnummer, die niemand nannte
Einen Datensatz aus einem Text zu extrahieren heißt, ein Modell einen Absatz lesen und einen festen Satz von Feldern füllen zu lassen. Das ist wichtig, weil das Modell eine Lücke mit einer Vermutung füllt, wenn Sie ihm das nicht verbieten.
Das Sekretariat einer Hochschule erhält eine Raumanfrage mit Name, Raum und Datum, aber ohne Telefonnummer. Das Werkzeug zeigt trotzdem eine Nummer. Niemand hat sie genannt: Das Modell hat sie erfunden.
Am Ende dieser Lektion
Notiz
Ich kann einen Absatz in einen Datensatz verwandeln, ohne einen Wert zu erfinden.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Extrahieren | benannte Fakten aus einem Text ziehen | |
| Feld | ein benannter Fakt in einem Datensatz | datum |
| Null | der Wert, der sagt, dass ein Feld fehlt | |
| Quelltext | der Absatz, aus dem die Fakten stammen müssen | |
| Verankert | im Quelltext gefunden, nicht geraten | |
| Vollständigkeit | der Anteil der Felder, die einen Wert haben |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Felder nennen und null erlauben
Sagen Sie genau, welche Felder Sie wollen und welchen Typ jedes hat. Sagen Sie dann, was zu tun ist, wenn ein Fakt nicht im Text steht: null verwenden und nie raten.
Ohne diese Regel kann ein Modell alle Felder füllen, weil ein voller Datensatz nach einer guten Antwort aussieht. Geben Sie ihm die Erlaubnis, eine Lücke zu lassen.
Beispiel: eine Nachricht, fünf Felder
| Feld | In der Nachricht? | Der richtige Wert |
|---|---|---|
| name | Ja: „mein Name ist Lena Schneider“ | Lena Schneider |
| raum | Ja: „den Raum B12“ | B12 |
| datum | Ja: „2026-11-20“ | 2026-11-20 |
| studierende | Ja: „24 Studierende“ | 24 |
| telefon | Nein | null |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Prüfen, ob jeder Wert verankert ist
Verlassen Sie sich nicht allein auf die Aufforderung. Vergleichen Sie nach der Antwort jeden Wert mit dem Quelltext. Steht der Wert nicht darin, behandeln Sie ihn als erfunden und setzen null.
Diese Prüfung ist einfach und hat eine Schwäche: Die Zahl 2 steht auch in 2026-11-20, eine falsche Angabe 2 würde also trotzdem bestehen. Eine feinere Prüfung vergleicht ganze Wörter. Die erfundene Telefonnummer fängt sie trotzdem.
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.
Den Extraktor schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' 'const quelle = \"Guten Tag, mein Name ist Lena Schneider. Ich möchte den Raum B12 am 2026-11-20 reservieren. Wir sind 24 Studierende und 3 Lehrende. Bitte antworten Sie per E-Mail.\";' 'const felder = [\"name\", \"raum\", \"datum\", \"studierende\", \"telefon\"];' '' '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; }' '}' > extraktion4.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 Extraktor schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Einen Wert nur behalten, wenn er wirklich im Quelltext steht.' 'function verankern(datensatz, quelle, felder) {' ' const ergebnis = {};' ' for (const name of felder) {' ' const wert = datensatz === null ? null : datensatz[name];' ' if (wert === null || wert === undefined || wert === \"\") {' ' ergebnis[name] = null;' ' console.log(name + \": null (fehlt)\");' ' } else if (quelle.toLowerCase().includes(String(wert).toLowerCase())) {' ' ergebnis[name] = wert;' ' console.log(name + \": \" + wert + \" (behalten)\");' ' } else {' ' ergebnis[name] = null;' ' console.log(name + \": \" + wert + \" (nicht im Text, verworfen)\");' ' }' ' }' ' return ergebnis;' '}' >> extraktion4.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 Extraktor schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const aufforderung = \"Entnehmen Sie der Nachricht diese Felder als JSON-Objekt: name (Text), raum (Text), datum (Text, Jahr-Monat-Tag), studierende (eine ganze Zahl), telefon (Text). Steht ein Feld nicht in der Nachricht, verwenden Sie null. Raten Sie nie. Antworten Sie nur mit dem JSON.\n\nNachricht: \" + quelle;' '// Aufgezeichnete Probe, nur benutzt, wenn kein Modell antwortet. Sie erfindet absichtlich eine Telefonnummer.' 'const probe = JSON.stringify({ name: \"Lena Schneider\", raum: \"B12\", datum: \"2026-11-20\", studierende: 24, telefon: \"0172 1234567\" });' >> extraktion4.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 Extraktor schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const antwort = await fragen([{ role: \"user\", content: aufforderung }], probe, 150);' ' const datensatz = verankern(jsonHerausziehen(antwort), quelle, felder);' ' let gefuellt = 0;' ' for (const name of felder) {' ' if (datensatz[name] === null) continue;' ' gefuellt = gefuellt + 1;' ' }' ' console.log(\"Gefüllt: \" + gefuellt + \" von \" + felder.length);' '}' 'main();' >> extraktion4.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 Extraktor ausführen
docker exec -w /home/node/project agent node extraktion4.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 |
|---|---|
| name, raum, datum, studierende | Jeweils ein Wert und (behalten) |
| telefon | null (fehlt) oder ein Wert mit (nicht im Text, verworfen) |
| Gefüllt | Gefüllt: 4 von 5, wenn das Modell nur die vier Fakten fand |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, ein gefülltes Feld sei besser als ein leeres. Ein erfundener Wert sieht aus wie ein echter, und niemand denkt daran, ihn zu prüfen. Ein null sagt klar, dass eine Person nachsehen muss.