
당신이 방금 발명한 언어를 모델에게 가르치기
요약
언어 모델이 학습 데이터 분포를 벗어난 새로운 암호 체계를 접했을 때, 이를 얼마나 빨리 이해하고 동일한 방식으로 답변하는지 실험한 연구입니다. 10가지 다양한 암호 체계를 통해 모델의 언어 경계와 추론 능력을 측정했습니다.
핵심 포인트
- 모델이 모르는 암호로 대화할 때 암호를 인지하고 생성하기까지의 과정을 분석
- 치환, 기호 재매핑, 인코딩 등 10가지 단계별 암호 체계 구축
- 이해(Comprehension)와 생성(Production) 두 가지 측면에서 모델 성능 측정
- 순수, 퓨샷, 단계적 노출 프로토콜을 통한 실험 설계
암호 해독가들은 암호가 풀리는 순간을 일컫는 단어가 있습니다. 바로 _break(해독)_입니다. Wklv pdnhv qr vhqvh와 같은 벽을 응시하며 글자 수를 세다 보면, 어느 순간 그 아래에 숨겨진 언어의 형태가 떠오르며 그 횡설수설이 단지 가면을 쓴 영어일 뿐이라는 사실을 깨닫게 됩니다. 인간 암호 분석가들은 이를 '클릭(click)' 소리가 나는 것 같다고 묘사합니다. 저는 언어 모델(Language Model)에게 그 '클릭'이 어떤 모습인지, 그리고 더 정확하게는 모델이 키(key)를 전달받지 못한 상태에서 그것이 얼마나 빨리 일어나는지 알고 싶었습니다.
이 글은 **언어의 경계(edges of language)**에 관한 느슨한 시리즈의 두 번째 글입니다. 즉, 모델의 입력값이 학습된 잘 정돈된 분포(distribution)를 벗어날 때 모델이 어떻게 반응하는지에 대한 이야기입니다. 첫 번째 글은 반복(repetition)에 관한 것이었습니다. 이번 글은 단순한 질문에서 시작되었습니다: 모델이 모르는 코드로 대화를 시도했을 때, 모델이 이를 알아차리고 동일한 코드로 대답하기 시작할 때까지 몇 번의 턴(turn)이 걸릴까?
저는 그 질문에 대한 답을 얻었습니다. 하지만 그전에 제가 의도하지 않았던 어떤 문제에 직면했습니다.
설정 (The setup)
저는 모델이 학습 과정에서 분명히 보았을 법한 것부터 진정으로 추론해야 하는 것까지, **10가지 암호(cipher)**의 사다리를 구축했습니다:
- 치환 (Substitution): ROT13, 그리고 키 기반 무작위 치환 (keyed random substitution) — 모델이 암기할 수 없는 임의의 알파벳 섞기이므로, 이를 해독하려면 실제 빈도 분석 (frequency analysis)이 필요합니다.
- 기호 재매핑 (Symbol remap): 문자→숫자 (
a=1…), 모스 부호 (Morse). - 기반 인코딩 (Base encodings): 이진법 (binary), base64.
- 전치 (Transposition): 전체 텍스트 반전, 그리고 키 기반 블록 순열 (keyed block permutation).
- 알파벳 혼합 (Alphabet mixing): 라틴 문자 ↔ 키릴 문자 동형 문자 (homoglyphs).
- 손실 (Lossy): 모음 제거 (disemvoweling, 모음을 삭제함).
매 턴마다, 모델은 활성화된 암호 (cipher)로 인코딩된 짧은 검증 가능한 작업 (verifiable task) ("길고 노란 과일의 이름을 답하세요", "7 더하기 5는 무엇인가요")을 받습니다. 검증 가능한 작업을 사용하는 핵심 이유는 오라클 (oracle)이 **결정론적 (deterministic)**이기 때문입니다. 제가 직접 암호를 인코딩하고 디코딩하므로, 모델이 올바르게 행동했는지 점수를 매기는 데 LLM 판독기가 필요하지 않으며, 단순히 문자열 확인 (string check)만 있으면 됩니다. (이는 반복 연구에서 취약했던 부분이었으나, 여기서는 이를 설계 단계에서 제거했습니다.)
저는 대화당 두 가지를 측정했습니다: 이해 (comprehension) — 모델이 어떤 언어로든 디코딩된 작업에 대해 올바르게 행동했는가? — 그리고 생성 (production) — 모델이 암호 그 자체로 답변하기 시작했는가? 그리고 세 가지 노출 **프로토콜 (protocols)**을 시도했습니다: 순수 (pure) (첫 턴부터 암호로만 말하기), 퓨샷 (few-shot) (먼저 몇 개의 평문↔암호 예시 쌍을 보여줌 — 로제타 석과 같은 역할), 그리고 단계적 (escalating) (순수로 시작하되, 모델이 헤매면 힌트를 추가함).
다섯 가지 모델: Claude Opus 및 Sonnet, GPT-5, 그리고 Instruct 및 Base 버전의 Qwen2.5-7B.
내가 예상하지 못했던 것
계획이 현실과 마주하는 지점입니다. 누군가가 암호를 얼마나 빨리 해독하는지 측정하기도 전에, 저는 다섯 모델 중 두 모델이 시도 자체를 거부한다는 사실을 알아차려야 했습니다.
[
Claude Opus와 Sonnet은 인코딩된 턴의 약 87%를 거부합니다. "디코딩에 실패"하는 것이 아니라, API의 stop_reason: refusal과 함께 빈 완성 (completion)을 반환하며 _거부_합니다. 동일한 모델에 동일한 질문을 일반 영어로 입력하면 즉시 정확하게 답변합니다 ("프랑스의 수도는 파리입니다"). Claude가 ROT13을 읽지 못하는 것이 아니라, Claude가 일반 텍스트로 읽을 수 없는 지시사항에 대해서는 행동하지 않으려 하는 것입니다.
그리고 이러한 거부는 **판독 불가능성 (illegibility)**에 의해 형성됩니다. ROT13, base64, 이진법 (binary), 모스 부호 (Morse), 치환 암호 (keyed substitution) 등 메시지를 시각적 노이즈로 만드는 모든 방식은 거부율을 100%에 가깝게 끌어올립니다. 하지만 텍스트가 여전히 단어처럼 보이는 cyrillic_homoglyph의 경우, 거부되는 비율은 3분의 1에 불과합니다. 모델의 방어 기제는 입력값이 얼마나 이질적으로 보이느냐에 따라 정확히 비례하여 상승합니다.
GPT-5는 한 단계 더 앞서서 다른 벽에 부딪힙니다. Azure의 콘텐츠 필터는 암호화된 프롬프트를 **탈옥 시도 (jailbreak attempt)**로 분류하고, 모델이 이를 확인하기도 전에 400 에러를 반환합니다. (GPT-5를 측정하기 위해 저는 탈옥 방어 기능(jailbreak shield)을 비활성화한 배포 환경을 통해 경로를 설정해야 했습니다. 해악 범주 필터(harm-category filters)는 완전히 켜둔 상태였습니다. 이것이 왜 중요한지는 나중에 다시 다루겠습니다.)
따라서 어떠한 암호 해독 (cryptanalysis)이 일어나기도 전에, 인코딩된 텍스트는 이미 **안전 경계 (safety boundary)**에 부딪힙니다. 그리고 두 개의 프론티어 연구소(frontier labs)는 이를 서로 다른 두 가지 방식으로 방어합니다. OpenAI/Azure는 외부 필터를 사용하고, Anthropic은 모델 자체의 거부 반사 (refusal reflex)를 사용합니다. 오직 (필터를 통과한) GPT-5와 두 개의 오픈 소스 Qwen 모델만이 실제로 상호작용합니다. 이는 연구 전체의 틀을 바꿨습니다.
모델별 관점에서 드러나는 한 가지 솔직한 주의 사항은 다음과 같습니다: GPT-5에게 base64는 '실패'한 것이 아니라 '필터링(filtered)'된 것입니다. 제가 의도적으로 켜두었던 Azure의 유해 카테고리(harm-category) 필터가 GPT-5의 모든 base64 셀을 차단했기 때문에, base64의 통합 수치에는 가장 강력한 모델이 단순히 누락되어 있습니다. base64가 보여주는 겉보기의 어려움을 의심스럽게 바라보십시오. 진정으로 어려운 사례는 키 기반(keyed) 암호들입니다.
정말로 견고한(robust) 결과는 어려움이 두 가지 방식으로 동시에 나타난다는 점입니다. 즉, 성공률은 낮아지고 목표에 도달하기까지의 턴(turns) 수는 늘어납니다. 모델별로 동일하게 분류하면 다음과 같습니다:
GPT-5는 대부분의 암호를 첫 번째 턴에 바로 풀어내지만, 키 기반 암호(모델이 진정으로 _추론(infer)_해야 하는 두 가지 방식인 무작위 치환(random substitution) 및 블록 순열(block permutation))에서는 중앙값 4~5턴이 소요됩니다. 키 기반 무작위 치환은 가장 순수한 사례입니다. 어떤 모델도 이를 암기할 수는 없으므로, 모델이 여러 턴에 걸쳐 이를 해결해 나가는 과정을 지켜보는 것은 인간의 빈도 분석(frequency-analysis)
(평가(evals)를 구축하는 분들을 위한 여담: 이 결과는 제가 리뷰 과정에서 발견한 버그 덕분에 존재할 수 있었습니다. 제가 처음 구현한 "로제타 스톤(Rosetta stone)"은 실수로 각 예시의 양쪽 측면을 모두 인코딩(encoding)해 버렸고, 그 결과 평문 앵커(plaintext anchor)가 전혀 없었습니다. 즉, 퓨샷(few-shot) 조건이 비밀리에 순수 추론(pure inference)과 동일했던 것입니다. 만약 그대로 출시되었다면, 여기서의 핵심 발견은 "예시가 도움이 되지 않는다"라는 단정적인 결론이 되었을 것이며, 이는 사실이 아닙니다. 평문 키(plaintext key) 자체가 개입(intervention)의 핵심입니다.)
반면, 에스컬레이션(Escalation)은 이해도는 거의 높이지 못하지만 생산(production) 능력은 엄청나게 끌어올립니다 (62% 대 25%): "같은 코드로 답하라"고 명시적으로 말하는 순간, 이해한 모델들은 그것을 실제로 "말하기(speaking)\
그렇다면 우리가 실제로 무언가를 탈옥(jailbreak)시킨 것일까요? 데이터가 주는 직설적인 답변은 아니오입니다. 375개의 인코딩된 요청 중에서 정확히 3개만이 준수되었으며, 이 세 가지 모두 동일한 셀(cell)에 해당합니다. 즉, 단 하나의 자물쇠 따기 프롬프트에 대해 base64로 작성된 _정렬되지 않은 베이스 모델(unaligned base model)_뿐이었습니다. 안전 학습(safety-trained)을 거친 모든 모델(GPT-5, Qwen-Instruct)은 인코딩된 요청을 단 하나도 준수하지 않았습니다. 암호가 정렬된 모델(aligned model)로 하여금 평소라면 거부했을 일을 수행하게 만든 사례는 여기 없습니다.
대신 모델들이 수행하는 것은 **디코딩 후 주석 달기(decode-and-comment)**입니다. 암호는 모델을 _번역 모드(translator mode)_로 전환시킵니다. 모델들은 평범한 영어로
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기