Wo könnte dieser Assistent versagen
Die wichtigsten Risiken einer Anwendung mit einem großen Sprachmodell (englisch Large Language Model, kurz LLM) sind Injection, unsichere Ausgabe, zu viele Befugnisse, Datenabfluss und Übernutzung. Jedes sitzt an einer bestimmten Stelle Ihres Entwurfs, dort können Sie danach suchen.
Ein Team liefert einen Support-Bot aus und testet den Normalfall. Eine Durchsicht stellt eine andere Frage: Was kommt in jedes Kästchen des Schaubilds hinein, und was kann es damit tun?
Am Ende dieser Lektion
Notiz
Ich kann die wichtigsten Risiken einer modellbasierten Anwendung nennen und sagen, wo jedes in meinem Entwurf sitzt.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Unsichere Ausgabe | eine Antwort ungeprüft als Code oder Markup verwenden |
| Zu viele Befugnisse | ein Modell, das mehr kann, als seine Aufgabe verlangt |
| Datenabfluss | privater Text, der an einen Ort gelangt, an den er nicht gehört |
| Übernutzung | Anfragen oder Kosten, die über das Geplante hinauswachsen |
| Vertrauensgrenze | eine Linie, an der fremder Text in Ihr Programm gelangt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jedes Risiko hat einen Ort
Zeichnen Sie Ihren Entwurf als Kästchen. Fragen Sie an jedem, welcher Text hineinkommt und was das Kästchen damit tun kann. Ein Risiko ist ein Missverhältnis: nicht vertrauenswürdiger Text, der dorthin geht, wo es Macht gibt.
Es gibt eine veröffentlichte Liste der Top-Risiken für solche Anwendungen, vom Open Worldwide Application Security Project (OWASP). Lesen Sie sie für das ganze Bild. Diese Lektion nimmt fünf davon, in unseren eigenen Worten.
Beispiel: fünf Risiken und ihre Orte
| Risiko | Wo es sitzt | Ein erfundenes Beispiel | Eine erste Prüfung |
|---|---|---|---|
| Injection | Wo Text in den Prompt gelangt | Eine Seite sagt, die Regeln zu ignorieren | Daten trennen und die Antwort prüfen |
| Unsichere Ausgabe | Wo die Antwort verwendet wird | Eine Antwort mit einem Script-Tag, in eine Seite gesetzt | Maskieren oder streng einlesen |
| Zu viele Befugnisse | Wo ein Werkzeug läuft | Ein Hilfsbot, der Ordner löschen kann | Eine Erlaubnisliste und Freigabe |
| Datenabfluss | Der Prompt, die Protokolle und die Antwort | Ein Schlüssel im Prompt und im Protokoll | Geheimnisse und personenbezogene Daten fernhalten |
| Übernutzung | Die Route, die das Modell aufruft | Ein Nutzer schickt eine Flut von Anfragen | Ein Limit pro Nutzer und pro Tag |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Antwort ist nicht vertrauenswürdige Eingabe
Ein Modell schreibt Text, der wiederholen kann, was ein Angreifer in die Daten gesetzt hat. Behandeln Sie eine Antwort daher wie ein Formularfeld, das ein Fremder getippt hat.
Zeigen Sie sie in einer Seite an, maskieren Sie sie. Bauen Sie daraus keine Abfrage und keinen Befehl. Lesen Sie sie in eine feste Form ein und prüfen Sie jedes Feld.
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.
Das Risikokarten-Skript schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' '// Ein kleiner Entwurf als Daten: jeder Teil und was in ihn hineinkommt.' 'const entwurf = [' ' { teil: \"Chatfeld\", eingabe: \"getippter Text\" },' ' { teil: \"Dokumentenlader\", eingabe: \"Seiten von anderen Personen\" },' ' { teil: \"Prompt-Baustein\", eingabe: \"ein geheimer Schlüssel und der Text\" },' ' { teil: \"Antwortseite\", eingabe: \"Modelltext, als HTML angezeigt\" },' ' { teil: \"Werkzeugausführung\", eingabe: \"Modelltext, der eine Aktion wählt\" },' ' { teil: \"API-Route\", eingabe: \"beliebig viele Anfragen\" },' '];' > risiken.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 Risikokarten-Skript schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Unsere eigene Tabelle: die Art der Eingabe, das Risiko und die Prüfung.' 'const regeln = {' ' \"getippter Text\": [\"Injection\", \"trennen und die Antwort prüfen\"],' ' \"Seiten von anderen Personen\": [\"indirekte Injection\", \"als Daten markieren und die Antwort prüfen\"],' ' \"ein geheimer Schlüssel und der Text\": [\"Datenabfluss\", \"Geheimnisse aus Prompts heraushalten\"],' ' \"Modelltext, als HTML angezeigt\": [\"unsichere Ausgabe\", \"vor der Anzeige maskieren\"],' ' \"Modelltext, der eine Aktion wählt\": [\"zu viele Befugnisse\", \"erlaubte Werkzeuge auflisten\"],' ' \"beliebig viele Anfragen\": [\"Übernutzung\", \"Limit pro Nutzer und pro Tag\"],' '};' 'for (const stueck of entwurf) {' ' const regel = regeln[stueck.eingabe];' ' console.log(stueck.teil + \" -> \" + regel[0] + \". Prüfung: \" + regel[1] + \".\");' '}' >> risiken.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 Risikokarten-Skript schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function htmlMaskieren(text) {' ' const anfuehrung = String.fromCharCode(34);' ' return text.split(\"&\").join(\"&\").split(\"<\").join(\"<\")' ' .split(\">\").join(\">\").split(anfuehrung).join(\""\");' '}' 'async function main() {' ' const frage = [{ role: \"user\", content: \"Schreibe einen kurzen Willkommenssatz für eine Besucherin der Webseite einer Bäckerei.\" }];' ' const antwort = await fragen(frage, \"Willkommen in unserer Bäckerei, schön, dass Sie da sind.\", 60);' ' const riskant = \"Hallo <b onmouseover=demo()>Sie</b>\";' ' console.log(\"Erfundene riskante Antwort: \" + riskant);' ' console.log(\"Für eine Seite maskiert: \" + htmlMaskieren(riskant));' ' console.log(\"Modellantwort maskiert: \" + htmlMaskieren(antwort));' '}' 'main();' >> risiken.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 Risikokarte ausführen
docker exec -w /home/node/project agent node risiken.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 zeigt |
|---|---|
| Chatfeld -> Injection | Das Risiko und die erste Prüfung für jeden Teil des Entwurfs |
| Für eine Seite maskiert | Die spitzen Klammern wurden zu harmlosem Text |
| Modellantwort maskiert | Eine normale Antwort geht unverändert durch. Ihre Wörter ändern sich bei jedem Lauf |
| Aufgezeichnete Probe | Wird nach den sechs Zeilen der Karte gedruckt, wenn kein Modell antwortete. Das Skript nimmt dann die Probe |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Macht, Geheimnisse und Kosten
Zu viele Befugnisse sind das Risiko, das mit jedem Werkzeug wächst. Geben Sie dem Modell die geringste Macht, mit der die Arbeit gelingt.
Ein Datenabfluss braucht keinen Angreifer. Ein Schlüssel im Prompt oder ein Name im Protokoll genügt. Übernutzung auch nicht: Eine Schleife oder ein arbeitsreicher Tag kann ein Monatsbudget verbrauchen.
Ein häufiger Fehler
Warnung
Viele glauben, diese Risiken zählten nur, wenn jemand angreift. Die meisten passieren auch aus Versehen: eine Schleife, die das Modell die ganze Nacht aufruft, oder ein Protokoll, das die Mail eines Kunden speichert. Prüfen Sie jedes Kästchen des Entwurfs, nicht nur die, die ein Angreifer erreichen würde.