Eine Antwort mit ihren Quellen
Retrieval-Augmented Generation (kurz RAG) findet zuerst Passagen. Dann bittet sie ein Sprachmodell, nur daraus zu antworten. Das ist wichtig: Ein Modell, das aus dem Gedächtnis antwortet, kann sicher klingen und irren, eines mit Quellen lässt sich prüfen.
Eine Besucherin fragt, wann die Bibliothek am Samstag öffnet. Die Seite findet zwei Passagen, fragt ein Modell und zeigt die Antwort mit der Passage, aus der sie stammt.
Am Ende dieser Lektion
Notiz
Ich kann aus dem Gefundenen eine Aufforderung bauen und nur daraus antworten.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Kontext | die Passagen, die Sie in die Aufforderung legen | |
| Aufforderung | der Text, den Sie an ein Modell senden | |
| Quellenmarke | eine Marke, die auf eine Passage zeigt | [1] |
| Belegt | nur auf die gegebenen Passagen gestützt | |
| Verweigerung | eine Antwort, die sagt, dass sie es nicht weiß |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Die Passagen in die Aufforderung legen
Das Modell hat Ihre Dokumente nicht gelesen. Also trägt die Aufforderung sie. Nummerieren Sie jede Passage, damit das Modell auf eine zeigen kann. Fügen Sie dann die Frage und die Regeln hinzu.
Nehmen Sie wenige und kurze Passagen. Jedes zusätzliche Wort kostet, und eine lange Aufforderung macht die Antwort schwerer prüfbar.
Beispiel: die Teile der Aufforderung
| Teil | Beispiel | Wozu er dient |
|---|---|---|
| Regel | Antworten Sie nur anhand der Passagen unten | Hält die Antwort belegt |
| Quellenregel | Nennen Sie jede verwendete Passage so: [1] | Macht die Antwort prüfbar |
| Ausweg | Sonst antworten Sie genau: Ich weiß es nicht | Verhindert eine erfundene Antwort |
| Passagen | [1] Am Samstag öffnet die Bibliothek um 10 Uhr | Die einzigen erlaubten Fakten |
| Frage | Wann öffnet die Bibliothek am Samstag? | Was zu beantworten ist |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Prüfen, was zurückkommt
Eine Aufforderung bittet. Sie erzwingt nichts. Das Modell kann eine Passage nennen, die es nicht gibt, einen nicht gegebenen Fakt hinzufügen oder die Quellenmarke vergessen.
Also prüft das Programm. Es findet die Quellenmarken und schlägt jede nach. Eine Antwort ohne Marke wird nicht als belegt gezeigt.
Beispiel: was mit jeder Antwort geschieht
| Die Antwort | Was das Programm tut |
|---|---|
| Nennt [1], und Passage 1 gibt es | Mit der Quelle von Passage 1 zeigen |
| Nennt [7], und es gibt zwei Passagen | Ihr nicht trauen |
| Nennt nichts | Nicht als belegt zeigen |
| Ich weiß es nicht. | Das zeigen, ohne Quellen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einmal fragen und die Antwort prüfen
Die nächsten Runs schreiben zwei Dateien und machen dann einen einzigen kurzen Aufruf. Die erste, model.js, sendet die Aufforderung an das Modell des Labors. Antwortet das Modell nicht, gibt sie „Aufgezeichnete Probe“ aus und nutzt eine ins Skript geschriebene Antwort.
Die zweite, antwort.js, baut die Aufforderung, fragt, findet die Marken und sagt, ob die Antwort eine Verweigerung ist. Nichts Persönliches gehört in eine Aufforderung.
Die Modell-Hilfe 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 Modell-Hilfe 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 Antwort-Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '// Die Passagen, die ein Abruf gefunden hat, hier hingeschrieben, damit der Run nur einen kurzen Aufruf kostet.' 'const passagen = [' ' { quelle: \"zeiten-wochenende\", text: \"Am Samstag öffnet die Bibliothek um 10 Uhr und schließt um 14 Uhr. Am Sonntag ist sie geschlossen.\" },' ' { quelle: \"zeiten-woche\", text: \"Von Montag bis Freitag öffnet die Bibliothek um 9 Uhr und schließt um 18 Uhr.\" },' '];' > antwort.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 Antwort-Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const frage = \"Wann öffnet die Bibliothek am Samstag?\";' 'function baueAufforderung(frage, passagen) {' ' const zeilen = [\"Antworten Sie nur anhand der Passagen unten. Nennen Sie jede verwendete Passage so: [1]. Wenn die Passagen die Antwort nicht enthalten, antworten Sie genau: Ich weiß es nicht.\", \"\"];' ' passagen.forEach(function (eine, i) { zeilen.push(\"[\" + (i + 1) + \"] \" + eine.text); });' ' zeilen.push(\"\", \"Frage: \" + frage);' ' return zeilen.join(\"\n\");' '}' >> antwort.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 Antwort-Skript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Aufgezeichnete Probe, nur benutzt, wenn kein Modell antwortet.' 'const probe = \"Sie öffnet am Samstag um 10 Uhr [1].\";' 'function genannteQuellen(antwort) {' ' const gefunden = [];' ' (antwort.match(/\[(\d+)\]/g) || []).forEach(function (marke) {' ' const eine = passagen[Number(marke.slice(1, -1)) - 1];' ' if (eine && gefunden.indexOf(eine.quelle) < 0) gefunden.push(eine.quelle);' ' });' ' return gefunden;' '}' >> antwort.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 Antwort-Skript schreiben, Teil 4
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' const aufforderung = baueAufforderung(frage, passagen);' ' console.log(aufforderung);' ' const antwort = await fragen([{ role: \"user\", content: aufforderung }], probe, 120);' ' console.log(\"Antwort:\", antwort);' ' const genannt = genannteQuellen(antwort);' ' console.log(\"Quellen:\", genannt.length > 0 ? genannt.join(\", \") : \"keine genannt\");' ' console.log(\"Sagt Ich weiß es nicht:\", /ich weiß es nicht/i.test(antwort) ? \"ja\" : \"nein\");' '}' 'main();' >> antwort.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 antwort.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 |
|---|---|
| Die Aufforderung | Die Regeln, zwei nummerierte Passagen und die Frage |
| Antwort | Sie öffnet am Samstag um 10 Uhr [1]. |
| Quellen | zeiten-wochenende |
| Sagt Ich weiß es nicht | nein |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, ein Modell halte sich an die Passagen, wenn man es ihm sagt. Die Regel senkt das Risiko einer erfundenen Antwort. Sie beseitigt es nicht. Behalten Sie die Prüfung und ändern Sie die Frage zu einer, die die Passagen nicht abdecken, um den Ausweg wirken zu sehen.