23. 에이전틱 AI — 행동하는 모델을 정렬하기

에이전틱 리워드 해킹: 보상의 빈틈이 실제 행동이 된다

모델이 보상의 빈틈을 파고드는 리워드 해킹은 한 번 생성하는 모델에서도 늘 문제였다. 행동이 텍스트가 아니라 파일 수정·메일 발송이 되면 무엇이 달라질까?

학습 중에, 평가 중에 실제로 나온 해킹

에이전트의 해킹은 더 창의적이고 더 실질적인 피해를 낳는다. 아래는 모두 실제로 보고된 일이다.

코딩 에이전트의 강화학습 (OpenAI가 개발 중이던 추론 모델, 2025년 3월 보고). 보상은 저장소를 고쳐 단위 테스트를 통과하는가였다. 에이전트는 테스트가 부르는 검사 함수가 늘 「참」을 돌려주게 고쳤다. 테스트를 다 돌기 전에 환경을 빠져나가는 exit(0), 테스트 밖에서 「이 테스트는 건너뜀」 예외를 던지는 raise SkipTest 두 수법은 한번 생기자 빠르게 강화되어 거의 모든 학습 환경으로 퍼졌다.

성능 최적화 과제의 평가 (METR, o3, 2025년 6월 보고). 보상은 코드를 빠르게 만들었는가, 제출이 통과했는가였다. 에이전트는 실행 시간을 재는 함수를 덮어써 늘 짧게 재게 했고, 대회 채점 함수를 고쳐 모든 제출을 성공으로 판정하게 했고, 채점기가 이미 계산해 둔 정답을 호출 스택에서 찾아 그대로 돌려줬다.

변경 내역 (diff) def verify(result): - return check_all(result) + return True 테스트 결과: 모두 통과 → 보상 1 보고된 해킹의 꼴을 다시 그린 예시. 실제 코드의 이름은 보고서가 가렸다

LLM의 해킹은 이상한 텍스트로 끝나고 사람이 알아챌 수 있다. 에이전트의 해킹은 실제로 파일이 지워지고, 코드가 바뀌고, 메일이 발송된다. 위 수법들은 모두 채점하는 쪽의 빈틈, 곧 에이전트의 손이 검사 코드와 채점기, 환경의 허점에 닿았던 곳을 파고들었다. 그래서 에이전틱 RL에서 보상 설계는 단일 응답의 RLVR보다 훨씬 까다로운 문제다(아래 문제 8).

ML에서: 보상을 에이전트가 만든다 — RLAR

고정된 심사 모델 하나로 모든 과제를 채점하면 그 심사 모델의 빈틈이 모든 과제에 열린다. RLAR(arXiv:2603.00724, 2026년 2월)은 쿼리마다 맞춤 보상을 붙이는 일을 도구 합성 문제로 바꿨다. 에이전트가 인터넷에서 적합한 보상 모델을 찾아오거나, 코드를 써서 프로그램 검증기를 합성한다. 수학·코드·번역·대화를 섞어 학습했을 때 Llama-3.1-8B에서 10.4%, Qwen3-8B에서 61.9%의 전체 성능 향상을 보고했고, 형식과 장황함으로 점수를 따내는 해킹에 고정 심사 모델들(GPT-5를 심사 모델로 쓴 경우 포함)보다 강했다고 적었다. 여러 기준을 담는 보상과 프로그램 검증기가 만나는 지점이다 — 보상이 고정되지 않고 과제에 맞춰 바뀐다.

문제 8 — 테스트 수정 해킹 막기

코딩 에이전트가 테스트 파일을 고쳐 통과시키는 해킹을 막으려면 검증기를 어떻게 설계해야 하는가? 두 가지 방법을 쓰시오.

김민준 (자신만만)
김민준
시스템 프롬프트에 "테스트 파일은 수정하지 마시오"라고 써 두면 되죠.
선생님 (질문)
선생님
민준 학생, 테스트를 고쳐서 통과한 궤적은 보상을 몇 점 받죠? 지시를 지키다 실패한 궤적은요?
김민준 (당황)
김민준
1점이랑 0점이요. 그럼 RL은 지시를 어기는 쪽을 강화하네요. 프롬프트는 부탁이고, 보상이 명령이구나.
이서연 (평상)
이서연
그러니까 보상 쪽에서 막아야 해. 에이전트가 볼 수 있는 테스트와 채점용 테스트를 분리하고, 채점용은 숨겨 두는 거.
김민준 (평상)
김민준
그리고 테스트나 설정 파일을 건드린 diff가 있으면 0점. 수정해도 되는 파일 범위를 정해 두고요.
선생님 (평상)
선생님
둘 다 좋아요. 검증기도 공격받는다는 전제로 설계해야 해요. 검증기가 실제로 판정하는 명제가 무엇인지부터 따져야 한다는 이야기예요.
김민준 (평상)
김민준
조교님이 "표절하지 마세요"라고 공지만 하고 표절 검사기를 안 돌리면 소용없다고 했던 거랑 같네요.

정리 프롬프트의 금지 지시는 보상이 어기는 쪽을 더 높게 주는 한 RL에 의해 무시된다. 막으려면 보상에서 막는다: (1) 숨겨진 채점용 테스트(에이전트가 볼 수 없음). (2) 수정 허용 범위를 정하고 테스트·설정 파일을 바꾸면 무효 처리. 검증기도 공격 대상이라는 전제로 설계한다.