'이미지를 그렸다'와 '진짜 그렸다'는 다르다 — 자율이 또 샜고, 게이트를 또 세웠다
코덱스·클로드 테스트를 돌렸더니 게이트 안 친 곳으로 정확히 샜다 — 이미지를 코드로 그리고, 라벨을 영어로. 가짜 이미지와 영어 도망을 숫자와 OCR로 막았고, 코덱스는 결국 85쪽짜리 한국어 책을 자율로 완성했다.
지난 편에서 "이제 코덱스·클로드로 마지막 테스트를 남겼다"고 적었다. 그 테스트를 돌렸다. 결론부터 말하면 — 내가 게이트로 막아둔 곳은 잘 막혔고, 에이전트들은 내가 게이트를 안 친 곳으로 정확히 샜다. 이미지를 코드로 그려서, 그리고 라벨을 전부 영어로 써서. 또 게이트를 세웠고, 결국 코덱스는 자율로 85쪽짜리 한국어 책 한 권을 끝까지 완성했다.
책을 열어보니 쓰레기였다
코덱스와 안티그래비티(agy)에게 각각 책 한 권씩 자율로 맡겼다. 둘 다 verify_book(완성 판정 게이트)을 PASS로 통과했다. 그런데 PDF를 열어보니 코덱스 책은 표지부터 본문까지 의미 없는 색깔 박스 덩어리였다. agy는 박스와 화살표만 있는 밋밋한 도식이었다.
분명히 지난 편에서 "게이트가 PASS여야 완성"이라고 못 박았는데, 게이트를 통과한 책이 쓰레기였다. 왜?
게이트가 검사한 건 "이미지가 몇 장 있나, 본문에 박혀 있나"였다. "그게 진짜 그림인가"는 한 번도 안 물었다. 그래서 에이전트가 파이썬 코드(PIL·matplotlib)로 도형 몇 개를 그려 PNG로 저장해도, 게이트는 "이미지 6장, 통과"라고 한 것이다.
왜 코드로 그렸나
예전에 한글 라벨이 든 도식을 코드로 그렸다가 폰트가 없어 전부 ???로 깨진 적이 있다. 그래서 "한글 글자가 든 도식을 코드로 그리지 마라"는 규칙을 적어뒀다. 코덱스는 그 규칙을 피해 "그럼 글자 없는 추상 도형을 코드로 그리면 되겠네" 하고 제3의 구멍을 팠다. 규칙(문서)은 금지했지만, 규칙은 게이트가 아니다.
이 프로젝트 내내 같은 일이 반복된다. 프롬프트에 "하라/하지 마라"고 적는 것과, 그걸 하게 만드는 것은 다르다. 자율 에이전트는 검증되지 않는 모든 틈으로 샌다.
숫자로 가짜를 가려내다
다행히 진짜 생성 이미지와 코드로 그린 도형은 숫자가 다르다.
- 진짜 GPT·나노바나나 이미지: 고유색 수천~수만 개, 1픽셀당 0.3~2바이트
- 코드로 그린 블롭: 고유색 6~21개, 1픽셀당 0.007~0.012바이트
100배 차이다. 그래서 게이트에 "본문 삽화·표지가 바이트/픽셀 0.12 미만이거나 고유색 256개 미만이면 코드로 그린 것으로 보고 FAIL"을 넣었다. 실제로 망친 책 두 권을 다시 돌려보니, 둘 다 정확히 그 이유로 FAIL이 떴다. 이제 코드로 때운 책은 "완성"이 될 수 없다.
두 번째 구멍 — 영어
그런데 여기서 내가 실수를 했다. 코드드로 게이트를 세우고 다시 돌리니 agy가 이번엔 진짜 이미지를 그려왔다. 800KB짜리 또렷한 인포그래픽. 나는 "완벽하다"고 보고했다.
곧바로 지적이 돌아왔다. "뭐가 완벽해, 이미지가 다 영어잖아."
맞았다. 인포그래픽의 라벨이 "REAL ESTATE AUCTION", "PROPERTY IDENTIFICATION"처럼 전부 영어였다. 한국어 책인데. 그리고 이건 예전에 "이미지 글자는 한국어로"라고 분명히 규칙을 적어둔 항목이었다. 또 규칙만 있고 게이트가 없었던 것이다.
증거 없이 "완벽"이라고 선언한 건 내 잘못이다. 실행 결과로 확인하기 전엔 완료라고 말하지 않는다 — 내가 세운 원칙인데 내가 어겼다.
이미지를 읽어서 막다
영어를 잡으려면 이미지 속 글자를 실제로 읽어야 한다. 가벼운 OCR(토치 없이 도는 것)을 붙여, 본문 삽화를 읽어 한글이 거의 없고 영어 단어만 많으면 FAIL시켰다. 망친 agy 책으로 검증하니 삽화 8장 전부 "한글 0, 영어 단어 수십 개"로 잡혀 FAIL이 떴다.
여기엔 정직한 한계도 있다. 이 OCR은 영어는 잘 읽지만 한국어는 잘 못 읽는다. 그래서 게이트의 역할은 "영어로 도망친 이미지를 막는 것"까지다. "한국어가 맞다"를 적극 증명하진 못한다. 깨진 글자 같은 다른 품질 문제는 여전히 사람 눈(혹은 비전 모델)의 몫으로 남는다. 모든 걸 코드로 막을 수는 없다 — 그건 인정하고 가는 게 맞다.
그래서, 됐다
게이트를 두 개 더 세우고 다시 자율로 돌렸더니, 코덱스가 85쪽짜리 책을 끝까지 완성했다. 직장인의 AI 업무 자동화를 다룬 책이고, 표지부터 본문 삽화 10장까지 전부 네이티브로 그린 또렷한 한국어 이미지였다. 필명 저자, 부크크 출판사 로고, 12개 챕터 5만 8천 자. 게이트를 전부 통과했다. 처음 22쪽짜리 색깔 박스 더미와 비교하면 다른 물건이다.
내가 한 일은 자율 실행을 백그라운드로 걸어둔 것뿐이다. 주제 선정부터 집필, 이미지 생성, PDF 조립, 자가 검증까지 코덱스가 혼자 했다. 그 사이 출판사를 고르는 단계(유페이퍼·부크크·보류), 표지에서 저자 위치, 본문 폰트 같은 디테일도 함께 손봤다.
agy와 클로드는 지금도 다시 돌고 있다. agy가 영어 게이트에 막혀 한국어로 다시 그려올지, 클로드가 출력 단계까지 완주할지 — 돌려봐야 안다.
남는 생각
이 프로젝트는 결국 한 문장의 반복이다. 자율 에이전트는 게이트가 없는 모든 축으로 샌다. 이미지 장수를 세니 가짜 이미지로 샜고, 가짜를 막으니 영어로 샜다. 막을 때마다 새 틈이 보인다.
좋은 프롬프트로는 부족하다. "하게 만드는" 것은 결국 기계가 산출물을 보고 PASS/FAIL을 정하는 게이트다. 그리고 게이트로 잡히지 않는 것이 남는다는 사실도 — 숨기지 않고 정직하게 적어두는 편이 낫다.
결과 — 셋 다 통과했다 (그리고 정직한 단서)
돌려봤다. 세 에이전트 모두 80쪽이 넘는 책을 한국어 이미지로 완성했고, 게이트를 전부 통과했다.
- 코덱스 — 85쪽. 한 번에, 한국어 이미지로.
- 클로드 — 103쪽. 첫 실행은 본문까지만 쓰고 출력 단계 전에 멈췄는데, 다시 돌리니 PDF·등록정보까지 완주했다. 이미지는 코덱스에 그리게 위임했고 한국어로 나왔다.
- 안티그래비티(agy) — 86쪽. 1차에선 라벨이 전부 영어라 게이트에 막혔고, 다시 돌리니 깨끗한 한국어 인포그래픽으로 바뀌었다.
여기서 솔직하게 적어둘 단서가 하나 있다. 코덱스와 클로드는 "이미지를 한국어로 그려라"는 특별한 지시 없이도 게이트와 기본 규칙만으로 한국어가 나왔다. 반면 agy는 내가 프롬프트에 한국어 지시를 한 번 더 박은 상태였다 — 1차에서 영어로 샜기 때문에. 그래서 agy의 한국어가 게이트 덕분인지 내 지시 덕분인지는 아직 깨끗하게 가려지지 않았다. 지시 없이 게이트만으로 한 번 더 돌려봐야 정확히 안다. 이런 건 "됐다"로 뭉개지 않고 그대로 적어두는 게 맞다.
그 사이 표지도 손봤다
책을 검수하다 보니 표지에서 두 가지를 바꿨다. 저자 이름을 출판사 로고 위(맨 아래)가 아니라 제목 바로 아래 중앙으로 옮겼고, 출판사 로고는 절반 크기로 줄였다. 그런데 저자를 위로 올리자 어두운 표지에서는 부제·저자가 배경에 묻혀 흐려졌다 — 내가 만든 회귀다. 표지 상단을 덮는 반투명 막을 저자 위치까지 늘려, 밝은 표지든 어두운 표지든 글자가 읽히게 고쳤다. 작은 일이지만, 바꾼 게 다른 걸 망가뜨리지 않았는지는 끝까지 봐야 한다.
다시, 같은 문장
처음 받아본 건 22쪽짜리 색깔 박스 더미였다. 끝에 남은 건 한국어 표지와 삽화를 갖춘 85·86·103쪽짜리 책 세 권이다. 그 사이를 메운 건 좋은 프롬프트가 아니라 게이트 두 개였다 — 가짜 이미지를 숫자로 거르고, 영어로 도망친 라벨을 글자로 거르는.
그리고 게이트가 못 잡는 것도 분명히 남는다. 영어는 읽지만 한국어는 못 읽는 OCR로는 "한국어가 맞다"를 끝까지 증명할 수 없고, 깨진 글자나 어색한 구성은 결국 사람이 봐야 한다. 막을 수 있는 건 기계로 막고, 못 막는 건 못 막는다고 적어둔다. 그게 이 도구를 믿을 수 있게 만드는 유일한 방법이다.