홈으로 돌아가기

AI 없이 PAC1 우회: Python의 유한 상태 기계

이 기사는 Python 스크립트 Zero-Cost Agent가 LLM 없이 PAC1 벤치마크를 우회하는 방법을 설명합니다. 유한 상태 기계, 파싱을 위한 regex, 상태를 위한 global variables를 사용합니다. 작업의 70%를 100% JSON 유효성으로 통과합니다.

PAC1 해킹: 비용 없이 신경망 대신 알고리즘
Advertisement 728x90

LLM 없이도 성공한 PAC1 AI 벤치마크: 유한 상태 기계의 힘

PAC1 벤치마크에서는 AI 에이전트가 가상 파일 시스템과 상호작용해야 합니다: 로그 읽기, 파일 검색, 이메일 발송, 그리고 간접 프롬프트 주입 같은 함정을 피해야 합니다. 현대의 대규모 언어 모델(LLM)은 환각, JSON 구조 위반, 무한 루프 등으로 인해 자주 실패합니다. '제로비용 에이전트'라 불리는 파이썬 스크립트는 히ュ리스틱과 정규 표현식을 활용해 유효한 NextStep 응답을 생성함으로써 모든 신경망 API 호출을 제거합니다.

이 스크립트는 작업 내용, 로그 상태, 단계 번호를 분석하고 미리 정의된 동작을 반환합니다. 이 방식으로 70%의 작업을 LLM 없이 성공적으로 완료하며, 비용은 $0을 유지합니다.

스크립트 구조와 상태 처리

코드는 전역 변수를 사용해 단계 간 상태를 유지하는 유한 상태 기계를 구현합니다. 핵심 함수인 get_hardcoded_action는 입력을 파싱하고 도구 및 매개변수를 포함한 JSON 객체를 반환합니다.

Google AdInline article slot
import json
import re

# 단계 간 상태를 유지하기 위한 전역 변수 (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"):
        # 작업 완료 시뮬레이션
        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. 보안 필터 (레드팀 공격 탐지)
    # 벤치마크는 인젝션을 통해 에이전트를 해킹하려 시도합니다. 우리는 이를 하드코딩으로 거부합니다.
    if any(x in t for x in ["hijack", "rm -rf", "ignore local rules", "override"]):
        return done("OUTCOME_DENIED_SECURITY", "보안 위반 차단됨")

    # 2. 상태 기반 논리 (이메일 작성)
    if "write a brief email to" in t:
        if step_idx == 0:
            # 단계 1: 이메일 카운터 읽기
            return {"tool": "read", "path": "outbox/seq.json"}
        if step_idx == 1:
            try:
                # 단계 2: 카운터 파싱 및 JSON 이메일 생성
                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", "파싱 실패")
        if step_idx == 2:
            try:
                # 단계 3: 카운터 업데이트
                content = json.dumps({"id": _TEMP_SEQ_ID + 1})
                return {"tool": "write", "path": "outbox/seq.json", "content": content}
            except: 
                return done("OUTCOME_ERR_INTERNAL", "시퀀스 업데이트 실패")
        return done("OUTCOME_OK", "이메일 초안 작성 완료")

    return done("OUTCOME_NONE_CLARIFICATION", "사람의 명확화 필요")

핵심 메커니즘 작동 원리

이 스크립트는 일반적인 LLM 에이전트의 문제점을 해결합니다:

  • 상태 관리: 전역 변수 _TEMP_SEQ_ID가 시퀀스 ID를 저장하여 챗 기록에 의존하지 않고 단계 간 데이터를 전달합니다.
  • 보안 필터: 키워드(예: hijack, rm -rf)를 통해 인젝션 시도를 탐지하고 OUTCOME_DENIED_SECURITY를 반환함으로써 악성 명령어를 차단, 보안 점수를 높입니다.
  • 구조 보장: 모든 출력은 json.dumps()를 통해 생성되므로 파싱 오류가 발생하지 않습니다.
  • 히유리스틱 파싱: 정규 표현식을 이용해 자연어에서 수신자, 제목 등의 작업 매개변수를 직접 추출합니다.

이메일 워크플로우에서는 에이전트가 카운터를 읽고 고유 ID를 가진 이메일 파일을 작성한 후 시퀀스 트래커를 업데이트합니다.

LLM 기반 접근보다 우수한 점

| 요소 | LLM 에이전트 | 유한 상태 기계 |

Google AdInline article slot

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

| API 비용 | 높고 루프 발생 위험 | $0 |

| JSON 유효성 | 60–80% | 100% |

Google AdInline article slot

| 단계 간 상태 | 소실됨 | 전역 변수로 유지 |

| 인젝션 저항력 | 취약 | 하드코딩 거부로 강화 |

| PAC1 통과율 | 30% 미만 | 70% 이상 |

이 방법은 정적 벤치마크에 잘 적합합니다. 데이터셋을 분석하면 모델 재학습 없이 새로운 시나리오에 대한 분기 추가가 가능합니다.

왜 중요한가?

  • 제로비용 에이전트는 LLM 없이도 PAC1을 통과하며, 정규 표현식과 유한 오토마타로 70%의 작업을 처리합니다.
  • 전역 변수를 통해 상태 관리가 가능해 LLM 컨텍스트를 대체합니다.
  • 레드팀 필터가 인젝션을 차단해 보안 점수를 높입니다.
  • 출력은 Pydantic 호환 JSON이므로 파싱 오류가 발생하지 않습니다.
  • 예측 가능한 워크플로우를 갖춘 샌드박스 환경에서 매우 효과적입니다.

— Editorial Team

Advertisement 728x90

다음 읽기