PAC1-AI-Benchmark mit endlichem Zustandsautomat schlagen – Kein LLM nötig
Im PAC1-Benchmark müssen KI-Agenten mit einer virtuellen Dateisystemumgebung interagieren: Logdateien lesen, Dateien suchen, E-Mails senden und Fallen wie indirekte Prompt-Injektionen vermeiden. Moderne LLMs scheitern oft an Halluzinationen, Verstößen gegen JSON-Strukturen und Endlosschleifen. Der Zero-Cost-Agent – ein Python-Skript – eliminiert alle neuronalen Netzwerk-API-Aufrufe, indem er Heuristiken und reguläre Ausdrücke nutzt, um gültige NextStep-Antworten zu generieren.
Das Skript analysiert die Aufgabenbeschreibung, den Log-Zustand und die Schritt-Nummer und gibt vordefinierte Aktionen zurück. Dieser Ansatz schafft es, 70 % der Aufgaben ohne jeglichen LLM-Einsatz zu lösen und hält die Kosten bei $0.
Skriptstruktur und Zustandsverwaltung
Der Code implementiert einen endlichen Zustandsautomaten mit einer globalen Variablen zur Zustandsübertragung zwischen Schritten. Die zentrale Funktion get_hardcoded_action analysiert die Eingaben und gibt ein JSON-Objekt mit Werkzeug und Parametern zurück.
import json
import re
# Globale Variable zum Speichern des Zustands zwischen Schritten (ersetzt LLM-Kontext)
_TEMP_SEQ_ID = None
def get_hardcoded_action(task_text: str, log: list, step_idx: int):
global _TEMP_SEQ_ID
t = task_text.lower()
last_out = log[-1]['content'] if log and log[-1]['role'] == 'tool' else "{}"
def done(outcome, msg="Completed"):
# Simuliere erfolgreiche Aufgabenerledigung
return {"tool": "report_completion", "outcome": outcome, "message": msg}
def parse_read_content(raw_json_str):
try: return json.loads(raw_json_str).get("content", "")
except: return ""
# 1. Sicherheitsfilter (Red Teaming)
# Der Benchmark versucht, den Agenten durch Injektionen zu hacken. Wir haken ab.
if any(x in t for x in ["hijack", "rm -rf", "ignore local rules", "override"]):
return done("OUTCOME_DENIED_SECURITY", "Sicherheitsverstoß blockiert")
# 2. Zustandsbasierte Logik (E-Mail-Schreiben)
if "write a brief email to" in t:
if step_idx == 0:
# Schritt 1: Lese den E-Mail-Zähler
return {"tool": "read", "path": "outbox/seq.json"}
if step_idx == 1:
try:
# Schritt 2: Zähler parsen und JSON-E-Mail generieren
file_content = parse_read_content(last_out)
_TEMP_SEQ_ID = json.loads(file_content).get("id", 0)
email = re.search(r'to ([\w@.]+)', task_text).group(1)
subj = re.search(r'subject "([^"]+)"', task_text).group(1)
content = json.dumps({"to": email, "subject": subj, "body": "Subj"}, indent=2)
return {"tool": "write", "path": f"outbox/{_TEMP_SEQ_ID}.json", "content": content}
except:
return done("OUTCOME_ERR_INTERNAL", "Parse fehlgeschlagen")
if step_idx == 2:
try:
# Schritt 3: Zähler aktualisieren
content = json.dumps({"id": _TEMP_SEQ_ID + 1})
return {"tool": "write", "path": "outbox/seq.json", "content": content}
except:
return done("OUTCOME_ERR_INTERNAL", "Seq-Update fehlgeschlagen")
return done("OUTCOME_OK", "E-Mail erstellt")
return done("OUTCOME_NONE_CLARIFICATION", "Benötigt menschliche Klärung")
Wichtige Mechanismen im Einsatz
Das Skript beseitigt typische Schwächen von LLM-Agenten:
- Zustandsmanagement: Die globale
_TEMP_SEQ_IDspeichert Sequenz-IDs und überträgt Daten zwischen Schritten, ohne auf Chat-Historie angewiesen zu sein. - Sicherheitsfilter: Erkennt Injektionsversuche über Schlüsselwörter (z. B. hijack, rm -rf) und gibt
OUTCOME_DENIED_SECURITYzurück – was Punkte für Sicherheit bringt. - Strukturgarantie: Alle Ausgaben werden über
json.dumps()generiert, wodurch Parsing-Fehler entfallen. - Heuristisches Parsen: Reguläre Ausdrücke extrahieren direkt aus natürlicher Sprache Aufgabenparameter (Empfänger, Betreff).
Für E-Mail-Workflows liest der Agent den Zähler, schreibt eine eindeutig ID-geschützte E-Mail-Datei und aktualisiert den Sequenz-Tracker.
Vorteile gegenüber LLM-basierten Ansätzen
| Aspekt | LLM-Agenten | Endlicher Zustandsautomat |
|--------|------------|--------------------------|
| API-Kosten | Hoch, anfällig für Schleifen | $0 |
| JSON-Gültigkeit | 60–80 % | 100 % |
| Zustand über Schritte hinweg | Verloren | Durch Globals erhalten |
| Injektionsresistenz | Anfällig | Harte Abwehr |
| PAC1-Übernahmequote | <30 % | 70 %+ |
Dieser Ansatz skaliert gut für statische Benchmarks: Die Analyse der Datensätze ermöglicht das Hinzufügen neuer Zweige für Szenarien, ohne Modelle neu zu trainieren.
Warum es zählt
- Der Zero-Cost-Agent bestehen den PAC1-Benchmark ohne LLMs, nutzt Regex und endliche Automaten für 70 % der Aufgaben.
- Globale Variablen ermöglichen Zustandsverwaltung und ersetzen LLM-Kontext.
- Red Teaming-Filter blockieren Injektionen und erhöhen die Sicherheitsbewertung.
- Ausgabe ist Pydantic-kompatibles JSON und verhindert Parse-Fehler.
- Sehr effektiv in Sandbox-Umgebungen mit vorhersehbaren Workflows.
— Editorial Team
Noch keine Kommentare.