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
| Begriff | Was er bedeutet |
|---|---|
| Erlaubnisliste | die einzigen Werkzeuge und Werte, die zulässig sind |
| Richtlinie | Daten, die sagen, was jedes Werkzeug bekommen darf |
| Parameterprüfung | ein Test der Eingaben eines Werkzeugs vor dem Start |
| Minimale Rechte | einem Werkzeug nur die Macht geben, die es braucht |
| Zeitlimit | eine 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
| Anfrage | Die Richtlinie sagt | Entscheidung |
|---|---|---|
| notiz_lesen, name speisekarte | name muss einkauf, speisekarte oder zeiten sein | Erlaubt |
| notiz_lesen, name ../privat | name muss einkauf, speisekarte oder zeiten sein | Abgelehnt: nicht erlaubt |
| shell_starten, ein Text | Dieses Werkzeug gibt es nicht | Abgelehnt: unbekanntes Werkzeug |
| addieren, b 99999 | b ist höchstens 1000 | Abgelehnt: 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
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 Richtlinien-Skript schreiben, Teil 1
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
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
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
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
docker exec -w /home/node/project agent node richtlinie.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 |
|---|---|
| notiz_lesen -> Brot, Kuchen | Die erste Anfrage bestand alle Prüfungen |
| notiz_lesen -> abgelehnt: name nicht erlaubt | Der Pfadtrick scheiterte an der Erlaubnisliste |
| shell_starten -> abgelehnt: unbekanntes Werkzeug | Das 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.