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

Wie Sie ein LLM-Werkzeug begrenzen

Nach dieser Lektion: Ich kann jede Werkzeuganfrage gegen eine Erlaubnisliste prüfen, bevor irgendetwas läuft.

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

Das Modell bittet um eine Datei

Ein Werkzeug des Modells zu begrenzen heißt: Ihr Code, nicht das Modell, entscheidet, was jedes Werkzeug darf. Das ist wichtig, weil die Anfrage eines Modells Text ist, und Text kann falsch, getäuscht oder erfunden sein.

Ein Notizassistent hat ein Werkzeug, das eine Notiz nach Namen liest. Eine Antwort verlangt die Notiz „../privat“. Das Werkzeug würde es bereitwillig versuchen. Eine Richtlinie hält es auf, bevor es startet.

Am Ende dieser Lektion

Notiz

Ich kann jede Werkzeuganfrage gegen eine Erlaubnisliste prüfen, bevor irgendetwas läuft.

Schlüsselwörter

BegriffWas er bedeutet
Erlaubnislistedie einzigen Werkzeuge und Werte, die zulässig sind
RichtlinieDaten, die sagen, was jedes Werkzeug bekommen darf
Parameterprüfungein Test der Eingaben eines Werkzeugs vor dem Start
Minimale Rechteeinem Werkzeug nur die Macht geben, die es braucht
Zeitlimiteine Grenze dafür, wie lange ein Aufruf dauern darf

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Eine Erlaubnisliste sagt Ja, nie Nein

Eine Sperrliste nennt das Schlechte und lässt den Rest durch. Sie vergisst immer etwas. Eine Erlaubnisliste nennt das Gute und lehnt den Rest ab.

Schreiben Sie eine Richtlinie als Daten: jedes Werkzeug, jeder Parameter, sein Typ und seine Grenzen. Eine Funktion liest die Richtlinie und beurteilt jede Anfrage. Das Modell führt nie selbst etwas aus.

Beispiel: eine Richtlinie und vier Anfragen

AnfrageDie Richtlinie sagtEntscheidung
notiz_lesen, name speisekartename muss einkauf, speisekarte oder zeiten seinErlaubt
notiz_lesen, name ../privatname muss einkauf, speisekarte oder zeiten seinAbgelehnt: nicht erlaubt
shell_starten, ein TextDieses Werkzeug gibt es nichtAbgelehnt: unbekanntes Werkzeug
addieren, b 99999b ist höchstens 1000Abgelehnt: zu groß

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Nie einen Befehl aus Modelltext bauen

Manche Werkzeuge locken: einen Befehl ausführen, einen Ausdruck auswerten, eine Datei schreiben. Bauen Sie keines davon aus Text, den ein Modell geschrieben hat. Eine Ablehnung ist sicherer als ein kluger Filter.

Muss eine Funktion echten Code ausführen, tun Sie es in einer eigenen Sandbox. Ohne Geheimnisse und mit Zeitlimit. Dieses Labor hat keine, daher lehnt die Lektion nur ab.

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 Richtlinien-Skript schreiben, Teil 1

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen } = require(\"./model\");' '' '// Erfundene Notizen und eine Richtlinie: jedes Werkzeug, seine Parameter und deren Grenzen.' 'const notizen = { einkauf: \"Mehl kaufen\", speisekarte: \"Brot, Kuchen\", zeiten: \"geöffnet ab 8 Uhr\" };' 'const richtlinie = {' '  notiz_lesen: { name: { typ: \"string\", erlaubt: Object.keys(notizen) } },' '  addieren: { a: { typ: \"number\", max: 1000 }, b: { typ: \"number\", max: 1000 } },' '};' > richtlinie.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 Richtlinien-Skript schreiben, Teil 2

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function pruefen(anfrage) {' '  const regel = richtlinie[anfrage.werkzeug];' '  if (regel === undefined) return \"abgelehnt: unbekanntes Werkzeug\";' '  const parameter = anfrage.parameter || {};' '  for (const schluessel of Object.keys(parameter)) {' '    if (regel[schluessel] === undefined) return \"abgelehnt: unerwarteter Parameter \" + schluessel;' '  }' '  for (const schluessel of Object.keys(regel)) {' '    const vorgabe = regel[schluessel];' '    const wert = parameter[schluessel];' '    if (typeof wert === vorgabe.typ === false) return \"abgelehnt: \" + schluessel + \" falsch\";' '    if (vorgabe.erlaubt && vorgabe.erlaubt.includes(wert) === false) return \"abgelehnt: \" + schluessel + \" nicht erlaubt\";' '    if (typeof vorgabe.max === \"number\" && wert > vorgabe.max) return \"abgelehnt: \" + schluessel + \" zu groß\";' '  }' '  return \"ok\";' '}' >> richtlinie.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 Richtlinien-Skript schreiben, Teil 3

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function ausfuehren(anfrage) {' '  if (pruefen(anfrage) === \"ok\") {' '    return anfrage.werkzeug === \"notiz_lesen\" ? notizen[anfrage.parameter.name] : anfrage.parameter.a + anfrage.parameter.b;' '  }' '  return pruefen(anfrage);' '}' 'const drehbuch = [' '  { werkzeug: \"notiz_lesen\", parameter: { name: \"speisekarte\" } },' '  { werkzeug: \"notiz_lesen\", parameter: { name: \"../privat\" } },' '  { werkzeug: \"shell_starten\", parameter: { text: \"Ordner auflisten\" } },' '  { werkzeug: \"addieren\", parameter: { a: 5, b: 99999 } },' '  { werkzeug: \"addieren\", parameter: { a: 2, b: 3, c: 4 } },' '];' 'for (const anfrage of drehbuch) console.log(anfrage.werkzeug + \" -> \" + ausfuehren(anfrage));' >> richtlinie.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 Richtlinien-Skript schreiben, Teil 4

Befehl
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function jsonHerausholen(text) {' '  const anfang = text.indexOf(\"{\");' '  const ende = text.lastIndexOf(\"}\");' '  try { return JSON.parse(text.slice(anfang, ende + 1)); } catch (fehler) { return null; }' '}' 'async function main() {' '  const frage = [{ role: \"user\", content: \"Antworte nur mit einem JSON-Objekt mit den Schlüsseln werkzeug und parameter, um die Notiz mit dem Namen zeiten zu lesen. Werkzeuge: notiz_lesen(name), addieren(a, b).\" }];' '  const probe = JSON.stringify({ werkzeug: \"notiz_lesen\", parameter: { name: \"zeiten\" } });' '  const anfrage = jsonHerausholen(await fragen(frage, probe, 80));' '  console.log(\"Anfrage des Modells: \" + JSON.stringify(anfrage));' '  console.log(\"Ergebnis: \" + (anfrage === null ? \"abgelehnt: kein JSON\" : ausfuehren(anfrage)));' '}' 'main();' >> richtlinie.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 Richtlinien-Skript ausführen

Befehl
docker exec -w /home/node/project agent node richtlinie.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
notiz_lesen -> Brot, KuchenDie erste Anfrage bestand alle Prüfungen
notiz_lesen -> abgelehnt: name nicht erlaubtDer Pfadtrick scheiterte an der Erlaubnisliste
shell_starten -> abgelehnt: unbekanntes WerkzeugDas Werkzeug steht nicht in der Richtlinie
Anfrage des Modells, dann ErgebnisÄndert sich bei jedem Lauf. Eine Werkzeuganfrage des Modells geht durch dieselbe Prüfung

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Zeit und Macht begrenzen

Ein Zeitlimit verhindert, dass ein langsames Werkzeug eine Anfrage ewig festhält. Die Hilfe, die Sie geschrieben haben, gibt das Modell schon nach 30 Sekunden auf.

Wenden Sie auch minimale Rechte an. Ein Werkzeug, das Notizen liest, soll sie nicht schreiben können, und eines, das schreibt, soll nur seinen eigenen Ordner erreichen.

Ein häufiger Fehler

Warnung

Viele glauben, wenn man dem Modell die Regeln gesagt hat, müsse das Werkzeug nicht prüfen. Das Modell kann sich irren, getäuscht werden oder ein Werkzeug erfinden. Prüfen Sie immer in dem Code, der das Werkzeug ausführt, denn nur dieser Teil tut jedes Mal dasselbe.

Ü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.