Der Zyklus hat sich nicht geändert, es gibt nur mehr Werkzeuge
„Die Schleife hat sich überhaupt nicht geändert, ich habe nur Dinge zum TOOLS-Array hinzugefügt.“ - s02_tool_use.py Ursprüngliche Wörter.
Wie viele Orte müssen Sie verschieben, um ein Werkzeug hinzuzufügen?
Der Agent von S01 kennt nur bash. Wie würden Sie es ändern, um auch read_file / write_file / edit_file zu aktivieren?
Die erste Reaktion vieler Menschen ist: Schleife ändern. falsch. Berühren Sie keine einzige Zeile der Schleife. Es sind nur drei Dinge erforderlich:
- Schreiben Sie eine Python-Handler-Funktion (
run_read(path, limit)). - Registrieren Sie es in der Zuordnungstabelle
TOOL_HANDLERS("read_file": lambda **kw: run_read(...)). - Fügen Sie dem Array
TOOLSeine JSON-Schemaanweisung hinzu (die dem Modell mitteilt, wie das Tool heißt und welche Parameter es akzeptiert).
Wenn die Schleife einen tool_use-Block sieht, drücken Sie block.name, um die Funktion in der Dispatch-Map zu suchen, sie auszuführen und die Ausgabe zurück in tool_result zu stopfen. Es folgt genau dem gleichen Pfad wie Bash.
# Dispatch-Map: Name → Handler-Lambda TOOL_HANDLERS = { "bash": lambda **kw: run_bash(kw["command"]), "read_file": lambda **kw: run_read(kw["path"], kw.get("limit")), "write_file": lambda **kw: run_write(kw["path"], kw["content"]), "edit_file": lambda **kw: run_edit(kw["path"], kw["old_text"], kw["new_text"]),
Sehen Sie, wie der Versand weitergeleitet wird
Mit dem folgenden Widget können Sie auf eine tool_use-Anfrage klicken, die möglicherweise von einem Modell gesendet wird, um zu sehen, wie sie an eine bestimmte Python-Funktion weitergeleitet wird. Hinweis: block.name bestimmt, welche Zeile verwendet werden soll.
safe_path: eine Verteidigungslinie, die nicht weggelassen werden darf
Erteilen Sie dem Agent Dateizugriffsrechte. Der wahrscheinlichste Sicherheitsfehler ist Path Escape: Das Modell hätte in /home/user/project/ funktionieren sollen, aber am Ende hat es ein read_file("../../etc/passwd") gesendet.
Es gibt eine kleine Funktion in s02, die sich damit befasst:
def safe_path(p: str) -> Pfad: path = (WORKDIR / p).resolve() # Normalisieren, auflösen .. und Softlinks if not path.is_relative_to(WORKDIR): raise ValueError(f"Path escapes workspace: {p}") Rückkehrpfad
Der Schlüssel liegt in den beiden Schritten .resolve() + .is_relative_to() – auf den absoluten Pfad analysieren und dann prüfen, ob er sich noch in der Sandbox befindet. Ohne Ersteres kann foo/../../etc passieren; ohne Letzteres findet überhaupt keine Kontrolle statt.
Identifizieren Sie die Pfadsicherheit
Die folgenden 5 Pfade sind alle read_file-Parameter, die vom Modell gesendet werden können. Welche werden von safe_path zugelassen und welche werden abgelehnt? Angenommen, WORKDIR = /home/user/project.
Fügen Sie dem Mittel keine gefährlichen Werkzeuge hinzu
Es ist einfach, Werkzeuge hinzuzufügen, aber denken Sie daran: Jedes Werkzeug, das Sie hinzufügen, stellt eine neue Fähigkeitsgrenze des Modells dar. In s02 hat bash bereits eine Blacklist (rm -rf /, sudo, shutdown) und write_file hat safe_path-Einschränkungen. Stellen Sie sich drei Fragen, bevor Sie Werkzeuge zur Produktion hinzufügen:
- Kann dieses Tool es dem Modell ermöglichen, unumkehrbare Dinge zu tun? (rm, E-Mail senden, Git Push)
- Was kann da auslaufen? (Umgebungsvariablen, .ssh, Cookies)
- Wird die Fehlerausgabe als Befehlsrückmeldung behandelt? (zeitnahe Injektion über Werkzeugausgabe)
Vorlesung s07 wird eine „Berechtigungsschicht“ hinzufügen, um diese Entscheidungen aus dem Code zu ziehen und sie deklarativ zu machen.