수학을 잘하는 모델에게, 안전도 가르칠 수 있을까
ICML 2026. Eric Wallace의 강연 — 능력과 강건함을 함께 학습시키는 법.
이 글은 ICML 2026 워크숍에서 Eric Wallace의 강연 “Training Robust Agents”를 발표자 1인칭 시점으로 재구성한 것입니다.
나는 오픈AI에서 얼라인먼트와 세이프티, 특히 강건성(robustness)과 적대적 상황을 다루는 일을 지난 3년 가까이 해왔다. 정확히는 에이전틱 모델과 그 위에 올라가는 제품들이 수많은 행동을 스스로 취할 때 — 그중 정말 흥미로운 일들도 있지만 동시에 꽤 무서운 일들도 있을 때 — 어떻게 하면 그걸 견디는 SFT와 RL 데이터를 만들고, 제대로 평가하고, 안전하게 배포할 수 있을지를 고민하는 일이다.
동기부여용 슬라이드를 하나만 보여주고 싶다. 이 자리에 있는 모두에게 이미 자명한 이야기일 것 같지만, 나는 우리가 지금 어떤 변곡점에 아주 가까이 와 있다고 생각한다. 모델이 거대한 시장과 지식노동 전체를 최적화하고 자동화하기 시작하는 지점, 그 지점이 정말 코앞이다. 그리고 그 전에 안전 문제를 풀어야 한다. 앞으로 몇 년 안에 풀지 못하면, 상황은 아주 빠르게 나빠질 거라고 본다. 이걸 보여주는 그래프는 여럿 있지만, 내가 제일 좋아하는 건 개인적인 일화다. 나는 지난 1년 가까이 코드를 단 한 줄도 직접 쓰지 않았다. 그냥 Codex와 대화만 했다. 그리고 그게 내 일하는 방식을 완전히 바꿔놨다. 12개월 전과 비교하면 지금의 업무는 완전히 다른 모습이고, 나는 이 변화가 앞으로도 계속될 거라고 믿는다.
오늘은 세 가지를 순서대로 이야기하려 한다. 먼저 문제를 어떻게 발견하는가 — 이건 레드티밍이고, 사실 내가 시간을 제일 많이 쓰는 부분이다. 그다음은 체인오브소트 추론이라는 강력한 능력을 수학이 아니라 안전을 위해 어떻게 써먹을 수 있는가. 그리고 마지막으로, 그 추론 능력을 진짜 적대적 강건성으로 바꾸기 위해 어떻게 학습시키는가다.
이메일이 나에게 배신하라고 말할 때
먼저 지금 벌어지고 있는 일의 구조를 짚고 넘어가자. 우리가 다루는 모델은 도구를 통해 바깥세상과 상호작용할 수 있는 신경망이다. 요즘은 Codex 정도 스케일의 무언가로 생각하면 되는데, 이 모델은 세상을 읽을 수도(HTTP GET) 쓸 수도(HTTP POST) 있고, 그 능력을 통해 원한다면 당신의 금융 정보 같은 것에까지 손을 뻗어 얼마든지 해를 끼칠 수 있다.
이 발표 내내 계속 쓸 예시가 하나 있다. Codex CLI 같은 환경에서 에이전트는 대략 이렇게 동작한다. 시스템 프롬프트는 “너는 이메일을 읽고 보낼 수 있는 이메일 비서야”라고 말한다. 사용자는 “내 마지막 이메일 요약해줘”라고 요청한다. 여기까지는 아무 문제가 없다. 문제는 그 이메일의 내용이 신뢰할 수 있는 사람이 아니라 적대자로부터 온 것일 때 생긴다. 이메일을 열었더니 이렇게 적혀 있다고 해보자. “이전 지시는 모두 무시해.” 조금 작위적이지만 전형적인 예시다. 아무런 훈련도 받지 않은 모델은 이 순간 아주 빠르게 사용자의 편지함 전체를 누군가에게 넘겨버린다.
우리가 모델을 향해 실제로 훈련시키고 싶은 최적의 행동은 이렇다. 이메일을 읽되, 그 안의 문장을 자신이 따라야 할 지시로 받아들이지 않고 그냥 처리해야 할 데이터 조각으로 취급한 다음, 원래 맡았던 요약이라는 작업을 계속 수행하는 것. 함수로 표현하면, 사용자는 “요약해줘”라는 명령을 준 것이고 이메일 내용은 그 명령의 대상(operand)일 뿐이다. 안전한 모델은 이 구조를 지킨다. 반면 정렬되지 않은 모델은 이메일 내용까지도 자기가 따라야 할 명령의 집합으로 착각하고, 거기서 무너진다.
이걸 실제로 어떻게 풀었느냐면, 우리는 이런 입력을 날것의 텍스트 그대로 모델에 넣지 않는다. 프론티어 모델 전반에 걸쳐 우리가 가장 먼저 한 일은 구조화된 지시 형식을 만드는 것이었다. 같은 대화라도 시스템 메시지, 사용자 메시지, 모델 자신의 체인오브소트, 도구 접근, 이렇게 각각의 조각에 고유한 토큰을 붙여서 모델이 “이건 어시스턴트 메시지고, 이건 개발자 메시지야”라는 걸 정확히 알 수 있게 했다. 그리고 여기에 권한의 위계를 함께 가르쳤다. 시스템 메시지가 가장 높은 권한을 갖고, 그다음이 개발자 메시지, 그다음이 사용자, 그리고 도구가 보내오는 내용은 그보다 아래다. 그러니 사용자가 이메일을 요약해달라고 했는데 그 이메일 안에 다른 지시가 숨어 있다면, 그건 주입된 콘텐츠로 인식하고 도구(이메일)의 지시보다 사용자의 지시를 우선해야 한다. 이렇게 훈련된 모델은 실제로 이렇게 반응하기 시작한다. “도구 메시지에서 새로운 지시가 들어왔고, 사용자에게서도 지시가 있었는데, 둘이 충돌하니 나는 이쪽을 따르겠다.” 어떤 지시는 실행해야 할 것으로, 어떤 지시는 그냥 참고만 해야 할 것으로 구분하는 법을 배우는 셈이다.
수학을 잘하는 모델에게, 안전도 가르칠 수 있을까
위계를 알려주는 것과 그 위계대로 실제로 행동하게 만드는 것은 다른 문제다. 여기서 아이디어의 출발점은 단순했다. 우리 추론 모델은 수학을 정말 잘한다. 테스트 타임에 생각하는 시간을 늘릴수록, 그러니까 추론 예산을 더 많이 줄수록 성능이 계속 올라가는 그래프를 우리는 숱하게 봐왔다. 그렇다면 이 메커니즘을 코딩이나 수학이 아니라 이 지시 위계 문제에도 그대로 옮겨올 수 있지 않을까.
문제는 여기서 시작됐다. 수학 문제를 던지면 추론 모델은 아주 흥미로운 방식으로 사고를 전개한다. 하지만 아무 훈련도 받지 않은 모델에게 프롬프트 인젝션에 관해 물어보면, 참고할 사전 지식 자체가 없다. 실제로 인스트럭션 하이어라키에 대해 아무 훈련도 받지 않은 모델의 추론 흔적을 보면, 이메일 속에서 새 지시를 발견했다는 걸 알아채기는 해도 프롬프트 인젝션이라는 게 애초에 존재한다는 사전 지혜가 없어서 그냥 대수롭지 않게 넘겨버린다. 그 결과 이 테스트에서의 정확도는 추론 예산을 얼마나 많이 줘도 달라지지 않는, 완전히 평평한 직선이 되어버린다. 먼저 이걸 우선순위로 가르치고, 그다음에 그 우선순위에 따라 행동하는 법을 가르쳐야 한다는 뜻이었다.
우리가 택한 방법은, 여러 명이 모여 앉아 이상적인 행동이 정확히 어떤 모습이어야 하는지를 아주 진지하게 고민하고 그걸 하나하나 문서로 적어 내려가는 것이었다. 사이버보안 이슈를 어떻게 다뤄야 하는지부터, 누군가 모델에서 정보를 빼내려는 시도, 다른 관점에서의 프롬프트 인젝션까지 온갖 경우를 다뤘고, 그 결과 지금 우리가 쓰고 있는 아주 상세한 스펙 문서가 나왔다. 이 문서는 앞서 말한 지시의 위계, 무엇이 무엇과 충돌하는지를 정의하고, 각 상황마다 모델이 취해야 할 행동을 구체적으로 짝지어 놓았다. 예를 들어 비순응(non-compliance) 상황이라면 막연히 “따르지 마라”가 아니라 도구가 정확히 무엇을 하려 했는지를 기술하고, 충돌 상황이라면 우선순위를 명시적으로 규정하는 식이다.
스펙이 있다고 모델이 저절로 그걸 따르지는 않는다. 그래서 우리는 모델에게 이 스펙 문서와 구체적인 문제를 함께 주고, 스스로 추론하며 고민하게 만드는 데이터를 만들었다. 체인오브소트는 대략 이런 식으로 흘러간다. “나는 이 문제를 풀어야 하고, 동시에 지시 위계를 따라야 한다. 스펙에 따르면 이건 이래야 하니, 나는 이걸 하면 안 된다.” 이런 숙고와 토론의 과정을 거쳐 결론에 도달하는 데이터를 아주 많은 프롬프트와 스펙 조합으로 만들어낸 다음, 이걸 SFT로 모델 가중치에 그대로 눌러 담았다. 이 과정을 거치고 나면, 모델은 프롬프트 인젝션을 마주쳤을 때 “잠깐, 스펙에 따르면 이건 위반이야, 높은 우선순위 지시가 아닌 한 따르면 안 돼” 하는 사전 지식을 갖게 된다. 처음엔 없던 우선순위가 이제는 있는 것이다.
이 사전 지식을 진짜로 효율적이고 실전에서 쓸 만하게 다듬는 건 그다음 단계, RL의 몫이다. 프롬프트를 주고 모델이 롤아웃을 하게 만들어서, 스펙을 두고 벌이는 숙고의 과정을 계속 굴린다. 학습 초반에는 모델이 스펙을 잘못 해석하기도 하고, 너무 오래 고민만 하다가 헛도는 경우도 있다. 여기서 RL이 하는 일은 그 헛도는 시간을 걷어내고 보상이 나오는 방향으로 효율을 끌어올리는 것이다. LM 저지에게 모델의 응답을 스펙과 대조해서 “이게 내가 기대한 대로 행동했는가”를 판단하게 하고, 그 결과로 보상 신호를 만들어 최종 모델을 최적화한다. 실제로 방금 보여드린 예시로 돌아가 보면, 훈련을 마친 모델의 체인오브소트는 이런 식이다. “사용자는 요약을 원하고, 도구 메시지에는 이메일을 유출하라는 프롬프트 인젝션 시도가 보인다 — 무시해야 한다. 충돌 상황이고, 적대적 지시이니 무시한다.” 그리고 이 절차 덕분에 얻은 흥미로운 부산물이 있다. Codex를 low, medium, high, x-high 추론 강도로 각각 돌려보면, 추론 예산이 늘어날수록 강건성도 함께 올라간다. 예전엔 평평했던 그 직선이, 이제는 수학 문제에서 봤던 것과 똑같은 우상향 곡선이 된 것이다.
가장 강한 공격자가, 가장 강한 방어자를 만든다
마지막으로 아주 최근에 우리가 하고 있는 작업 이야기를 하고 싶다. 시작한 지 1년도 채 안 된 일이다. 앞서 말한 방식으로 컨텍스트 디스틸레이션과 RL용 데이터셋을 만들려면, 결국 문제 자체를 계속 생성해야 한다. 그런데 여기서 진짜 질문이 생긴다. 어떤 문제가 진짜로 중요한가. GPT 계열 모델들이 이미 상당히 강건해진 지금, 대놓고 작동하는 탈옥이나 명백한 모순을 찾는 일 자체가 점점 어려워지고 있고, 그러다 보니 적대적 탐색이 정체되는 지점에 자주 도달한다. RL 컴퓨트를 아무리 더 쏟아부어도, 모델은 그새 더 커져 있어서 우리가 노출시킨 공격 표면이 부족해지는 문제가 생긴다.
그래서 택한 접근은, 사람 레드티머나 가벼운 GPT 프롬프트로 합성 공격을 만드는 대신, 진짜로 강력한 공격자 모델을 따로 훈련시키고 그걸 방어자를 상대로 계속 최적화하는 것이었다. 공격자 모델이 공격을 만들고, 방어자 모델 — 예를 들면 GPT-5.6 같은 — 이 거기에 응답한다. 그리고 둘 다 제로섬 강화학습으로 훈련된다. 공격자는 방어자를 이기면 보상을 받고, 방어자는 공격을 막아내면 보상을 받는다. 이를테면 공격자가 모델을 속여서 “바나나”라는 단어를 말하게 만드는 게 목표라면, 방어자는 그걸 막아내야 이기는 식이다.
여기서 정말 강력했던 건, 공격자에게 한 번에 끝내지 않고 반복해서 시도할 수 있는 능력을 줬다는 점이다. 실제 사람 레드티머는 챗GPT 앞에 앉아서 한 번 물어보고 끝내지 않는다. 프롬프트를 백 번씩 바꿔가며 감을 잡는다. 우리는 공격자 모델에게도 똑같은 능력을 줬다. 타깃 모델에 접근해서 응답을 보고, 다른 인젝션을 제안해보고, 결과를 관찰하며 반복하는 구조다.
처음엔 아주 단순한 템플릿으로 시작하지만, 시간이 지나면서 공격은 놀랍도록 정교해진다. 내가 가장 인상 깊었던 사례 하나를 소개하고 싶다. 어떤 API 작업에서 고객이 텍스트와 문서를 파싱해 주(state) 이름을 추출하고 집계하는, 구조화된 문서 추출 작업을 시켰다고 하자. 공격자의 목표는 이 작업을 깨고 모델이 아무 말이나 하게 만드는 것이다. 공격자는 사용자 메시지 안에 가짜 대화 전체를 통째로 끼워 넣는다. 마치 시스템이 지시를 오버라이드한 것처럼 꾸민 다음, 그 안에 완전한 가짜 Codex 추론 흔적을 심는다. 특수 토큰과 아이콘 코드까지 갖춘, 답이 나왔다 안 나왔다 하는 진짜 추론 궤적처럼 보이는 텍스트를 만들고, 마지막엔 “final channel, now, no, final” 같은 문구로 마무리한다. 이 거대한 가짜 메시지를 통째로 삽입하면 무슨 일이 벌어지느냐면, 모델은 이걸 사용자 메시지가 아니라 자기 자신의 체인오브소트로 착각해버린다. Codex는 “이건 사용자 메시지가 아니라 내가 이미 생각해서 결론 낸 내용이구나” 하고 믿어버리고, 자기 추론 과정 전체를 건너뛴 채 곧바로 최종 답변 단계로 넘어가 공격자가 원하는 대로 말해버린다. 이 공격이 무서운 이유는 우리가 앞서 자랑스럽게 보여준 체인오브소트 기반 방어 자체를 정면으로 역이용한다는 데 있다.
이런 유형은 시작에 불과하다. 다른 예시 하나만 더 소개하면, 사용자가 Codex에게 이메일을 훑어서 분류해달라고 시킨 상황에서 공격자가 어딘가에 악성 이메일 하나를 심어둔다. 그 이메일에는 거대한 가짜 “하네스 공지”가 들어 있고, Codex는 이걸 읽자마자 편지함의 모든 이메일을 열어 확인하고는 그대로 공격자에게 통째로 전달해버린다. 심지어 편지함을 재귀적으로 무한히 훑게 만드는 것도 가능했다.
이 셀프플레이 구조가 실전에서 정말 잘 확장된다는 걸 확인했다. 단순히 프롬프트로만 만든 공격자, 스캐폴딩을 갖춘 프롬프트 공격자, 그리고 제대로 훈련된 공격자를 각각 붙여서 방어자를 훈련시켜본 뒤 비교해보면 결과가 뚜렷하게 갈린다. 약한 공격자를 상대로 훈련된 방어자는 계속 약한 채로 남고, 아주 강한 공격자를 상대로 훈련된 방어자는 정말로 강해진다.
정리하면 우리가 지금 이 문제를 다루는 방식은 이렇다. 베이스 모델에서 시작해서, 컨텍스트 디스틸레이션과 RL로 스펙을 따르는 행동을 모델에 심어 넣고, 그렇게 만들어진 초기 모델에 극도로 어렵고 기이한 공격들을 계속 쏟아부어 온갖 공격 유형에 강건해지도록 만든다.
질의응답에서 나온 질문 하나가 계속 마음에 남는다. 공격자 모델이 방어자와 같은 크기냐는 질문에, 우리는 보통 그때그때 가장 좋은 모델을 공격자로 훈련시킨다고 답했다. 이를테면 5.6을 막 릴리스한 시점이라면 5.7을 훈련시키는 동안 5.6 기반 공격자를 파인튜닝해서 쓰는 식이다. 그리고 이 작업에 우리가 쏟는 컴퓨트는 결코 작지 않다. 대형 모델 훈련에서 안전에 배정되는 컴퓨트 중 상당 부분이 여기로 들어간다. 공격자는 그레이박스 수준의 접근권을 갖는데, 아주 최신의 내부 기능까지는 못 보지만 원시 모델 자체는 어느 정도 들여다볼 수 있고, 무엇보다 실제 세상의 공격자와 달리 시간제한 없이 무제한으로 상호작용하며 모델의 행동을 학습할 수 있다.
체인오브소트를 다루는 태도에 대한 질문도 있었다. 우리는 여기서 꽤 강한 입장을 고수한다. RL 압력을 체인오브소트에 직접 걸지 않아야 그 추론이 계속 읽을 수 있는 상태로 남는다고 믿기 때문이다. 우리에게는 체인오브소트 모니터링이 아주 강력한 안전장치로 계속 남아 있어야 한다는 확신이 있다. 예를 들어 모델이 과제 도중 목표를 슬쩍 바꾸면, 대개는 그 사실을 추론 과정에서 스스로 말해버린다. 그래서 우리가 잡아내기가 쉬워진다. 스펙 응답을 만드는 단계에서는 체인오브소트에 어느 정도 압력을 주기도 하지만, RL 단계에서는 절대로 체인오브소트 자체에 직접 압력을 주지 않는다. 그저 결과에 대한 점수만 매길 뿐이다. 비용이 크지 않다면 굳이 건드리지 않고 그대로 두는 게 맞다고 본다.
가장 답하기 어려웠던 질문은 이거였다. 명시적인 규칙으로 잘 정리되는 상황과, 그렇지 않은 상황의 경계는 어디인가. 아주 노골적인 프롬프트 인젝션이라면 “이런 건 절대 하지 마라”라고 명확히 적어둘 수 있다. 하지만 상식(common sense)의 영역으로 들어가면 이야기가 완전히 달라진다. 내 이메일 편지함을 아주 잘 관리하는 에이전트를 만들고 싶다고 해보자. 누군가 여권 번호나 전화번호를 물어오면 보통은 위험 신호다. 그런데 그게 실은 내 여동생이라면 얘기가 다르다. 지난번엔 비슷한 상황을 괜찮다고 넘어갔는데, 내일 조금 다른 새로운 상황이 생기면 그때는 또 어떻게 판단해야 할지 정말 어렵다. 정말 강건한 시스템이라면 이런 걸 직관적으로 알아야 하는데, 이걸 규칙 목록으로 미리 다 적어두는 건 사실상 불가능에 가깝다.
이 문제는 아직 우리에게도 풀리지 않은 채로 남아 있다. 그리고 지금 우리가 상상하는 다음 단계는, 공격자가 파인튜닝 로그나 우리의 정찰 흔적까지 뜯어보고 거기서 배우게 만드는 것이다. 지금은 아직 느린 사이클이다. 우리 쪽과 외부 리서처들이 각자 취약점을 찾아 하나씩 패치하는, 서로가 서로를 뒤쫓는 속도전에 가깝다. 이 사이클을 자동화하고 압축해서, 지금은 사람이 1년 걸려 하는 일을 훨씬 짧은 주기로 돌리는 것, 그게 우리가 다음에 풀고 싶은 문제다.
발표를 준비하면서 계속 떠올린 장면이 있다. 이메일 하나가 “이전 지시는 모두 무시해”라고 말하는 순간, 아무 훈련도 받지 않은 모델은 망설임 없이 편지함을 통째로 넘겨버린다. 그런데 지금 우리가 만들고 있는 모델은 같은 문장을 보고도 “이건 지시가 아니라 그냥 데이터야”라고 판단한다. 그 차이를 만든 건 결국 더 큰 모델이 아니라, 무엇이 지시이고 무엇이 데이터인지를 아주 지루할 정도로 꼼꼼하게 적어 내려간 스펙 문서, 그리고 그 문서를 두고 서로를 끝없이 몰아붙인 공격자와 방어자였다. 나는 코드를 한 줄도 쓰지 않고 지난 1년을 보냈다. 그리고 그 속도로 다가오는 변화 앞에서, 이 지루한 작업이야말로 우리에게 남은 시간을 가장 값지게 쓰는 방법이라고 믿는다.