Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Die wichtigsten Risiken von LLM-Anwendungen

Nach dieser Lektion: Ich kann die wichtigsten Risiken einer modellbasierten Anwendung nennen und sagen, wo jedes in meinem Entwurf sitzt.

Lektion, 60 Min.6 BefehleLab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

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

BegriffWas er bedeutet
Unsichere Ausgabeeine Antwort ungeprüft als Code oder Markup verwenden
Zu viele Befugnisseein Modell, das mehr kann, als seine Aufgabe verlangt
Datenabflussprivater Text, der an einen Ort gelangt, an den er nicht gehört
ÜbernutzungAnfragen oder Kosten, die über das Geplante hinauswachsen
Vertrauensgrenzeeine 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

RisikoWo es sitztEin erfundenes BeispielEine erste Prüfung
InjectionWo Text in den Prompt gelangtEine Seite sagt, die Regeln zu ignorierenDaten trennen und die Antwort prüfen
Unsichere AusgabeWo die Antwort verwendet wirdEine Antwort mit einem Script-Tag, in eine Seite gesetztMaskieren oder streng einlesen
Zu viele BefugnisseWo ein Werkzeug läuftEin Hilfsbot, der Ordner löschen kannEine Erlaubnisliste und Freigabe
DatenabflussDer Prompt, die Protokolle und die AntwortEin Schlüssel im Prompt und im ProtokollGeheimnisse und personenbezogene Daten fernhalten
ÜbernutzungDie Route, die das Modell aufruftEin Nutzer schickt eine Flut von AnfragenEin 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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function htmlMaskieren(text) {' '  const anfuehrung = String.fromCharCode(34);' '  return text.split(\"&\").join(\"&amp;\").split(\"<\").join(\"&lt;\")' '    .split(\">\").join(\"&gt;\").split(anfuehrung).join(\"&quot;\");' '}' '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

Befehl
docker exec -w /home/node/project agent node 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.

Eine mögliche Ausgabe

ZeileWas sie zeigt
Chatfeld -> InjectionDas Risiko und die erste Prüfung für jeden Teil des Entwurfs
Für eine Seite maskiertDie spitzen Klammern wurden zu harmlosem Text
Modellantwort maskiertEine normale Antwort geht unverändert durch. Ihre Wörter ändern sich bei jedem Lauf
Aufgezeichnete ProbeWird 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.

Über dieses Lab und seinen Quellcode: Lab für KI-Coding-Agenten: mit opencode Code erklären und reparieren lassen und die Arbeit prüfen

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.