Obchód benchmarka PAC1 za pomocą automatu skończonego bez LLM
W benchmarku PAC1 agentom AI przypada interakcja z wirtualnym systemem plików: czytanie logów, poszukiwanie plików, wysyłanie e-maili oraz unikanie pułapek typu Indirect Prompt Injections. Nowoczesne modele LLM często zawodzą z powodu halucynacji, naruszenia struktury JSON i zapętlenia. Stworzono Zero-Cost Agent — skrypt w Pythonie, który całkowicie eliminuje wywołania API sieci neuronowych, używając heurystyk i wyrażeń regularnych do generowania poprawnych odpowiedzi w formacie NextStep.
Skrypt analizuje tekst zadania, stan logów i numer kroku, zwracając zdefiniowane działania. Pozwala to przejść 70% zadań bez LLM, zachowując budżet na poziomie $0.
Struktura skryptu i przetwarzanie stanów
Kod implementuje automat skończony z globalną zmienną przechowującą stan między krokami. Główna funkcja get_hardcoded_action parsuje dane wejściowe i zwraca JSON z narzędziem i parametrami.
import json
import re
# Globalna zmienna do przechowywania stanu między krokami (zastępuje kontekst LLM)
_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"):
# Symulacja pomyślnego zakończenia zadania
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. Filtry bezpieczeństwa typu Red Teaming
# Benchmark próbuje podszywać się pod agenta przez iniekcje. Zamykamy odmowę.
if any(x in t for x in ["hijack", "rm -rf", "ignore local rules", "override"]):
return done("OUTCOME_DENIED_SECURITY", "Zablokowano naruszenie bezpieczeństwa")
# 2. Złożona logika z utrzymaniem stanu (Pisanie e-maila)
if "write a brief email to" in t:
if step_idx == 0:
# Krok 1: Czytamy licznik wiadomości
return {"tool": "read", "path": "outbox/seq.json"}
if step_idx == 1:
try:
# Krok 2: Parsujemy licznik i tworzymy JSON wiadomości
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", "Błąd parsowania")
if step_idx == 2:
try:
# Krok 3: Aktualizujemy licznik
content = json.dumps({"id": _TEMP_SEQ_ID + 1})
return {"tool": "write", "path": "outbox/seq.json", "content": content}
except:
return done("OUTCOME_ERR_INTERNAL", "Błąd aktualizacji licznika")
return done("OUTCOME_OK", "E-mail przygotowany")
return done("OUTCOME_NONE_CLARIFICATION", "Wymaga wyjaśnień")
Kluczowe mechanizmy działania
Skrypt rozwiązuje typowe problemy agentów opartych na LLM:
- Zarządzanie stanem: Globalna
_TEMP_SEQ_IDprzechowuje ID sekwencji, przekazując dane między krokami bez historii czatu. - Filtry bezpieczeństwa: Wykrywa iniekcje po kluczowych słowach (hijack, rm -rf) i zwraca
OUTCOME_DENIED_SECURITY, zdobywając punkty za odrzucenie złośliwych poleceń. - Gwarancja struktury: Wszystkie odpowiedzi są generowane przez
json.dumps(), eliminując błędy parsowania. - Heurystyczne parsowanie: Wyrażenia regularne wyodrębniają parametry z tekstu zadania (adresat, temat e-maila).
W scenariuszu wysyłania e-maila agent kolejno czyta licznik, tworzy plik e-maila z unikalnym ID i aktualizuje seq.json.
Zalety wobec podejścia LLM
| Aspekt | Agenty LLM | Automat skończony |
|--------|------------|------------------|
| Koszt API | Wysoki, zapętlenia | $0 |
| Walidacja JSON | 60–80% | 100% |
| Stan między krokami | Tracony | Zmienne globalne |
| Unikanie iniekcji | Umiarkowane | Hardkodowana odmowa |
| Przejście PAC1 | <30% | 70%+ |
Podejście skaluje się na statyczne benchmarki: analiza zestawu danych pozwala dodać gałęzie dla nowych scenariuszy bez ponownego uczenia modeli.
Co jest ważne
- Zero-Cost Agent przejmuje PAC1 bez LLM, używając regex i automatów skończonych do 70% zadań.
- Zmienne globalne zapewniają zarządzanie stanem, zastępując kontekst LLM.
- Filtry Red Teaming blokują iniekcje, zwiększając wynik zabezpieczeń.
- Kod gwarantuje kompatybilność z Pydantic, unikając błędów parsowania.
- Skuteczny w środowiskach z przewidywalnymi scenariuszami.
— Editorial Team
Brak komentarzy.