Powrót do strony głównej

Obejście PAC1 bez AI: automat skończony w Pythonie

Artykuł opisuje skrypt Python Zero-Cost Agent, omijający benchmark PAC1 bez LLM. Używa automatu skończonego, regex do parsowania i globalne zmienne dla stanów. Przechodzi 70% zadań z 100% poprawnością JSON.

Hak PAC1: algorytm zamiast sieci neuronowych bez kosztów
Advertisement 728x90

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.

Google AdInline article slot
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_ID przechowuje 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 |

Google AdInline article slot

|--------|------------|------------------|

| Koszt API | Wysoki, zapętlenia | $0 |

| Walidacja JSON | 60–80% | 100% |

Google AdInline article slot

| 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

Advertisement 728x90

Czytaj dalej