Lektion 02 · Base

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.

⏱ ~10 Min · 📝 3 interaktive Widgets · 🧑‍💻 Basiert auf shareAI-lab · s02_tool_use.py

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:

  1. Schreiben Sie eine Python-Handler-Funktion (run_read(path, limit)).
  2. Registrieren Sie es in der Zuordnungstabelle TOOL_HANDLERS ("read_file": lambda **kw: run_read(...)).
  3. Fügen Sie dem Array TOOLS eine 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.

Interaktiv

Widget 1 · Werkzeugversand · Wie tool_use an den Handler weitergeleitet wird

Klicken Sie auf eine „tool_use“-Anfrage und sehen Sie, wie „block.name“ in der Schleife die entsprechende Funktion findet, sie ausführt und die Ausgabe wieder in den „tool_result“-Block einfügt.

模型发来的 tool_use 块
TOOL_HANDLERS 映射表

        
执行结果 · tool_result 块
(点上面任意一条 tool_use 触发路由)
Interaktiv

Widget 2 · Sicherer Pfad · Fluchterkennung für 5 Pfade

Jeder Pfad wird von safe_path() verarbeitet. Angenommen, WORKDIR = /home/user/project, klicken Sie auf „Freigeben“ oder „Ablehnen“ – es hängt davon ab, ob Ihre Intuition bezüglich der Pfadflucht korrekt ist.

答对 0 / 5
Interaktiv

Widget 3 · Ein Tool hinzufügen · Was muss geändert werden, um dem Agenten ein Glob-Tool hinzuzufügen?

Angenommen, Sie möchten ein neues Tool glob(pattern) hinzufügen, damit der Agent Dateien stapelweise finden kann. Füllen Sie die Lücken aus: Alle drei müssen geändert werden, keines davon darf fehlen.

第 1 处 · 写一个 handler 函数
def run_glob(pattern: str) -> str:
    import glob
    return "\n".join(glob.glob(pattern))
第 2 处 · 注册到 dispatch map(选正确一行)
第 3 处 · 在 TOOLS 数组里加 schema(选正确一组)