happy_various AI 실전 기록

LLM 중계기 개발기 6부 · 32편 / 전체 33편

2026년 10월 2일 기준

이 글에는 제휴 링크가 없고 글에 나오는 제품을 만든 곳들(OpenAI·앤트로픽·NVIDIA·fal·마이크로소프트)과 아무 관계가 없습니다. 제가 직접 만든 중계기의 개발 기록을 바탕으로 썼습니다. 삽화는 GPT 이미지 생성, 도식은 직접 제작했습니다.

가짜는 진짜를 대신 못 한다 — 모의고사와 실전 (LLM 중계기 개발기)

시험을 앞둔 학생에게 모의고사는 고마운 도구예요. 아무 때나 볼 수 있고, 채점이 바로 나오고, 틀린 문제는 다음 회차에서 다시 확인할 수 있으니까요. 모의고사가 없으면 실력이 늘었는지 알 길이 없죠.

그런데 모의고사에는 한계가 하나 있어요. 출제자가 떠올린 문제만 나온다는 거예요. 처음 가 보는 고사장, 손에 익지 않은 답안지, 생각보다 빨리 가는 시험장 시계는 모의고사 문제지에 없어요. 모의고사 만점이 실전 만점을 약속하지 못하는 이유예요.

제가 만든 LLM 중계기에도 모의고사가 있어요. 9월 말 기준 834개인 자동 시험이에요. 그리고 그 대부분은 진짜 AI 대신 흉내만 내는 가짜를 상대로 풀어요. 이번 편은 그 모의고사를 다 통과하고도 진짜 앞에서 넘어진 날들, 그리고 그 뒤에 만든 ‘실전’ 이야기예요.

이 글은 LLM 중계기 개발기의 32편입니다. 지난 31편 「검사는 지우지 않는다」에서는 버그 하나가 나올 때마다 검사를 하나 붙이고 지우지 않는 이야기를 했어요. 오늘은 그 검사와 시험들이 대부분 ‘가짜’를 상대로 한다는 데서 시작해, 20편에서 “32편에서 더 할게요”라고 미뤄 둔 가짜 시험과 진짜 점검 이야기를 합니다.

책상에서 동그라미가 가득한 모의고사 답안지를 자랑스럽게 들어 보이는 로봇 학생, 창밖에는 커다란 시험장 건물이 기다리고 있다 (GPT 이미지 생성)

결론 요약

🎭 1. 진짜 대신 가짜 — 목, 가짜 서버, 스모크 테스트

시험 이야기에 자주 나오는 말부터 정리할게요.

가짜를 쓰는 이유는 분명해요.

① 빠르다 — 진짜 AI는 한 번 대답하는 데 몇 초씩 걸리기도 해요. 가짜는 순식간이에요. 중계기의 검사 문서에는 자동 시험 전체가 ‘수 초’면 끝난다고 적혀 있어요. 그래서 저장할 때마다 돌릴 수 있어요

② 결과가 늘 같다 — 진짜 AI는 같은 질문에도 답이 달라지고, 서버 사정에 따라 느려지기도 해요. 가짜는 정해 둔 대로만 움직여서, 시험이 실패하면 그건 중계기 쪽 문제라는 뜻이 돼요

③ 고장을 일부러 만들 수 있다 — 중간에 끊긴 연결(11편), 잘린 답(16편), 1,000자짜리 거절 이유(18편), 영원히 대답하지 않는 모델(22편). 진짜 AI에게 “지금 잘린 답 하나만 보내 줘”라고 부탁할 수는 없잖아요

④ 로그인도 요금도 필요 없다 — 계정 한도를 쓰지 않고, 인터넷이 끊겨도 돌아요

모의고사가 그렇듯 가짜 시험은 훌륭한 도구예요. 문제는 그 모의고사를 누가 출제했느냐예요.

📝 2. 출제자는 나였다 — 옛 판 Codex가 거절한 꼬리표 하나 (7월 18일)

6편에서 이야기했듯 중계기는 Codex를 ‘켜 둔 채’ 써요. Codex 안에 든 앱 서버라는 기능을 띄워 두고, 그 프로그램과 계속 말을 주고받는 방식이에요. 앱 서버를 띄울 때 중계기는 명령 끝에 --listen stdio://라는 꼬리표를 붙였어요. “프로그램끼리 직접 이어진 통로(표준 입출력)로 대화하자”는 뜻이에요.

가짜 Codex는 당연히 이 꼬리표를 알아들었어요. 최신 Codex를 보고 만든 흉내꾼이었으니까요. 오히려 시험은 중계기가 이 꼬리표를 빠뜨리지 않았는지 꼼꼼히 확인하고 있었어요. 꼬리표가 없으면 실패하는 시험이었죠.

그런데 7월 18일 밤의 수정 기록에는 이런 오류 보고가 남아 있어요.

error: unexpected argument ‘—listen’ found

“모르는 꼬리표 ‘—listen’이 붙어 있다”는 뜻이에요. 그 컴퓨터에 깔린 Codex는 옛 판이었고, 옛 판의 앱 서버는 이 꼬리표를 몰랐어요. 원래 그 통로로만 대화하는 판이라 꼬리표 자체가 없었거든요. 모르는 꼬리표를 받은 옛 판은 곧바로 꺼졌고, 중계기는 Codex에 연결하지 못했어요.

그보다 더 오래된 판은 사정이 더 고약했어요. 앱 서버 기능 자체가 없는 판에서는 ‘app-server’라는 단어가 질문으로 읽혀서 같은 오류가 났어요. 이때 꼬리표만 떼고 다시 띄우면 앱 서버가 아니라 엉뚱한 대화가 시작돼 버려요.

그날 밤 9시 48분에 저장된 수정은 이렇게 움직여요.

① 이 오류가 나면 먼저 Codex에게 앱 서버 기능이 있는 판인지 물어봐요(codex app-server --help)

② 있으면 꼬리표를 떼고 다시 띄워요. 그 판단을 기억해 두었다가 다음부터는 처음부터 꼬리표 없이 띄우고요

③ 없으면 다시 띄우지 않고, 설치된 판 번호와 함께 “Codex를 업데이트한 뒤 다시 연결하라”는 안내로 끝내요

④ 최신 판(0.144대)은 원래 길 그대로예요. 이건 가짜가 아니라 진짜 Codex로 다시 확인했어요

그리고 가짜 Codex에게 새 성격 둘이 생겼어요. 보고된 오류 문장을 그대로 뱉고 꺼지는 ‘옛 판 가짜’, 그리고 앱 서버 기능이 아예 없는 ‘더 옛 판 가짜’예요. 이 시험 파일 머리에는 “실제 버그 리포트 재현”이라고 적혀 있어요.

돌아보면 모의고사 출제자는 저였어요. 가짜 Codex는 제가 아는 Codex, 그것도 최신 판만 흉내 냈어요. 제가 모르는 옛 판의 버릇은 문제지에 실릴 수가 없었죠. 18편에서도 Codex의 판 차이가 말썽이었어요. 그때는 깔린 Codex가 너무 옛 판이라 새 모델을 쓰지 못했고, 이번에는 중계기가 최신 판의 말투만 알고 있었던 거예요.

돋보기를 든 작은 로봇이 막대에 기대 선 납작한 종이 로봇과 은은하게 빛나는 진짜 로봇을 나란히 비교한다 (GPT 이미지 생성)

📦 3. 개발 폴더는 배포판이 아니다 — 늘 비어 있던 변경 이력 (9월 24일~10월 1일)

이번에는 가짜 AI가 아니라, 시험을 치른 장소가 문제였어요.

9월 24일 판(v0.1.101)부터 중계기에는 변경 이력 창구가 생겼어요. 중계기를 쓰는 다른 프로그램이 “내가 마지막으로 본 판 이후로 뭐가 바뀌었지?”를 물어볼 수 있는 곳이에요. 판마다 바뀐 내용을 파일 하나로 적어 두면, 창구가 그 파일들을 읽어 대답해요.

모의고사도 있었어요. 새 판을 낼 때 그 판의 변경 이력 파일을 빠뜨리면 자동 시험이 실패해요. 실제 AI를 붙여 단계별로 확인하는 실전 점검(5절에서 다시 나와요)에도 ‘변경 이력’ 단계가 있었고, 첫 운행에서 모든 단계를 통과했어요.

그런데 10월 1일, 중계기를 쓰는 다른 도구 쪽에서 보고가 왔어요. 설치한 중계기의 변경 이력이 늘 빈 목록이라는 거예요.

원인은 배포판을 싸는 단계에 있었어요. 배포판을 만드는 스크립트는 문서 폴더에서 안내서 두 개만 골라 담았고, 변경 이력 폴더는 담지 않았어요. 판정 창구 안내서도 같은 이유로 빠져 있었고요. 설치한 중계기에는 읽을 이력이 아예 없었던 거예요.

그럼 시험들은 왜 몰랐을까요? 모두 개발 폴더에서 띄운 중계기를 상대로 했기 때문이에요. 개발 폴더에는 변경 이력 파일이 멀쩡히 있어요. 실전 점검도 AI는 진짜를 붙였지만, 중계기 자체는 개발 폴더에서 띄웠어요. 고친 날의 기록은 이렇게 적었어요. 저장소에서 띄운 서버는 변경 이력을 저장소에서 읽으니 배포판의 누락을 못 본다.

이사로 치면 이래요. 이삿짐을 싸면서 책장 한 칸을 빠뜨렸는데, 확인은 옛집에서 했어요. 옛집 책장에는 책이 다 꽂혀 있으니 “다 있네” 하고 넘어간 거예요.

더 곤란했던 건 이 고장이 조용했다는 점이에요. 이력 파일이 없으면 창구는 오류를 내지 않고 빈 목록을 돌려줬어요. 쓰는 쪽에서는 ‘아무것도 안 바뀌었다’와 구별할 방법이 없었죠. 17편의 ‘성공 봉투에 든 실패’처럼, 빈 목록이 정상인 척한 셈이에요. 9월 24일 판부터 10월 1일 판이 나오기 전까지, 약 일주일 동안 그랬어요.

10월 1일 판(v0.1.109)에서 이렇게 고쳤어요.

20편의 ‘맥에서 싼 윈도용 짐’과 같은 갈래의 고장이에요. 만든 곳에서는 멀쩡한데, 싸서 보낸 짐에서만 빠져 있는 것이요.

🧾 4. 위험 점검 문서의 ‘상시 주의’ — 가짜는 진짜를 대신 못 한다

중계기에는 구조적인 위험을 모아 둔 위험 점검 문서가 있어요. 항목마다 상태가 붙어 있는데, 16편의 ‘끝난 이유 위장’처럼 ‘해소’로 닫힌 항목도 있고, 상시 주의라는 딱지가 붙은 항목이 둘 있어요.

R7을 우리말로 옮기면 이래요.

목은 진짜 명령어 도구와 진짜 AI 서버를 대신하지 못한다. 윈도에서 프로그램 띄우기, 판마다 다른 진짜 Codex 앱 서버의 대화 방식, Claude 로그인 만료, 윈도용 실행 파일, 압축 배포판은 작은 단위 시험으로 잡을 수 없다. 전체 검사 묶음이 일부를 확인하지만, 새 판을 내기 전 실제 환경 점검 1회는 무엇으로도 대신할 수 없다.

둘 다 한 번 고쳐서 닫는 문제가 아니라, 새 AI를 붙이고 새 판을 낼 때마다 다시 봐야 하는 문제라는 뜻이에요.

R7의 목록은 이 연재의 사고 기록과 거의 그대로 겹쳐요.

20편과 21편에서 소개한 검사들(윈도용 부품 검사, 실행 통로 검사, 끄기 검사)이 이 중 일부를 막아 주지만, 문서의 결론은 같아요. 내놓기 전에 진짜로 한 번은 돌려 봐야 한다.

이 규칙은 문서에만 있지 않아요. 중계기 저장소에서 AI 작업 도우미가 일을 시작할 때 먼저 읽는 안내 파일(7편에서 말한 그 안내 파일이에요)에도 같은 내용이 한 줄로 들어 있어요. “목은 진짜를 대신 못 한다. 새 판 전 실제 환경 점검 1회 필수.” 함께 일하는 AI도 매번 이 줄을 읽고 시작하는 거예요.

🏁 5. 실전 점검을 만들다 — 윈도 점검 둘, 실제 AI 점검 하나

그래서 실전 점검을 만들었어요. 진짜 물건을 쓰되, 아무 날이나 운에 맡기지 않고 조건은 점검이 정하는 방식이에요.

① 업데이트 실전 점검 (8월 8일)

트레이 프로그램과 자동 업데이트가 들어온 날(23편) 함께 생겼어요.

8월 8일부터 나온 새 판 안내문에는 ‘업데이트 적용’과 ‘건강 확인에 실패하면 되돌리기’ 점검을 둘 다 통과했다는 줄이 붙었어요.

② 첫 실행 실전 점검 (8월 10일)

23편에서 이야기한 ‘상자’(파일 수천 개를 담은 앱 묶음)가 생긴 날 낮에 만들어졌어요.

이 점검과 함께 나온 판(v0.1.64)의 첫 줄이 “깨끗한 압축판을 처음 켤 때도 트레이가 대답하게 했다”예요. 수천 개 파일을 준비하는 동안 메뉴가 먹통이 되지 않게 고친 판이죠.

③ 실제 AI 점검 (9월)

세 번째는 AI 쪽이에요. 개발에서는 이런 장치를 흔히 ‘라이브 하네스’(live harness)라고 불러요. 하는 일은 이래요.

처음 만든 건 9월 22일, 29편에 나오는 판정 창구를 위해서였어요. 계기가 된 일이 그날 낮에 있었어요.

판정 창구를 쓰는 법을 보여 주는 예제 프로그램이 있어요. 항목 여러 개를 AI에게 판정받고, 기준을 넘는 것만 골라 글을 쓰게 하는 프로그램이에요. 이 예제는 가짜 중계기를 상대로 시험을 통과했어요. 판정 6번, 기준을 넘은 3건만 글쓰기. 그런데 진짜로 돌려 보니 NVIDIA 쪽 서버가 한 번 ‘지금은 잠시 못 받는다(503)‘고 답했고, 그 한 번에 예제 전체가 멈췄어요. 가짜 중계기는 503을 보낸 적이 없었죠.

예제를 저장하고 4분 뒤에 저장된 수정은 이래요. ‘잠깐 붐빔(429)‘이나 ‘서버 쪽 문제(5xx)‘면 한 번 다시 시도하고, 한 항목의 글쓰기가 실패해도 나머지는 계속하고, 판정을 받지 못한 항목은 버리지 않고 글쓰기 대상에 넣어요.

그날 오후 2시 9분, 판정 창구 점검 장치가 생겼어요. 첫 시험 운행에서도 NVIDIA는 또 503을 돌려줬어요. 보고서는 그 단계를 실패가 아니라 경고로 적고 전체를 통과로 마쳤어요. 진짜 서버는 그날그날 사정이 달라서, 중계기의 잘못과 상대 서버의 사정을 나눠 적을 칸이 필요했던 거예요.

같은 모양의 점검 장치는 그 뒤로 늘어났어요. 9월 24일에는 3절의 변경 이력 단계가 든 호환성 점검이, 9월 29일에는 여러 판에 걸친 새 기능을 한꺼번에 보는 점검이 생겼어요. 영상 기능 점검에서는 이런 일도 있었어요.

실험실 안 나무 모형 차에 앉은 충돌 시험 인형을 뒤로하고, 로봇 기술자가 바깥 시험 도로에서 원뿔 사이를 달리는 진짜 작은 차를 지켜본다 (GPT 이미지 생성)

⚖️ 6. 가짜는 매번, 진짜는 내놓기 전에

지금 중계기의 시험은 두 줄로 움직여요.

위 줄은 저장할 때마다 도는 가짜 시험(모의고사), 아래 줄은 새 판 전에 하는 실전 점검 셋, 맨 아래는 가짜 시험으로는 몰랐고 진짜 앞에서 드러난 것들 (직접 제작)

그동안 정한 원칙을 모으면 다섯 가지예요.

① 가짜 시험은 저장할 때마다 빠르고 결과가 같으니 매번 돌려요. 한 번 겪은 실수가 다시 들어오면 바로 걸려요.

② 진짜 점검은 새 판을 내기 전에 적어도 한 번 배포판을 실제로 풀어 켜고, 실제 AI를 붙여요. 개발 폴더가 아니라 쓰는 사람이 받는 바로 그 짐으로요.

③ 진짜가 알려 준 것은 가짜에게 가르친다 옛 판 Codex의 오류 문장, 잔액이 0일 때 fal.ai가 보낸 문장, 17편의 로그인 만료 문장, 18편의 ‘requires a newer version’. 진짜에게서 받은 문장들이 지금은 그대로 가짜 시험 안에 들어 있어요. 진짜 한 번이 찾아낸 것을 가짜가 매번 지키는 거예요.

④ 확인하지 못한 것은 확인하지 못했다고 적는다 8월 8일부터 12일까지 나온 새 판 열두 개의 안내문에는 같은 문장이 붙어 있었어요. 맥판과 리눅스판은 윈도에서 짐의 구조만 확인했고, 그 운영체제에서 실제로 켜 보는 확인은 아직 필요하다(25편). fal.ai도 ‘열쇠가 준비되면’이라고 적었고요. 가짜로 확인한 것과 진짜로 확인한 것을 섞어 적지 않아요.

⑤ 진짜 한 번은 최소한이지, 충분하다는 보증이 아니다 업데이트 실전 점검은 8월 초 새 판마다 통과했어요. 그래도 8월 20일, 첫 실행이 몇 분씩 걸리는 어떤 컴퓨터에서는 업데이트가 계속 되돌아갔어요(23편). 점검을 돌린 컴퓨터에서는 새 판이 금방 깨어났으니까요. 진짜 한 번은 ‘한 대의 진짜’예요. 그래서 실전 점검에 나쁜 조건을 일부러 넣고, 그래도 남는 것은 쓰는 사람의 보고에서 배워요.

모의고사로 치면 이래요. 모의고사는 매일 풀고, 실전 전에 한 번은 진짜 고사장에 가 봐요. 거기서 낯선 것을 만나면 다음 모의고사 문제로 만들어 두고요.

정리

① 중계기의 자동 시험은 대부분 진짜 AI 대신 가짜를 상대로 해요. 빠르고, 결과가 늘 같고, 진짜에게는 부탁할 수 없는 고장을 일부러 만들 수 있어서예요 ② 하지만 가짜는 내가 아는 만큼만 진짜를 닮아요. 최신 Codex만 흉내 낸 가짜는 옛 판의 거절을 몰랐고, 개발 폴더에서 띄운 중계기는 배포판에서 빠진 변경 이력을 몰랐어요. 위험 점검 문서는 이걸 ‘상시 주의’로 남겨 두었어요 ③ 그래서 가짜 시험은 저장할 때마다, 진짜 점검은 새 판을 내기 전에 적어도 한 번 해요. 윈도에서 배포판을 실제로 풀어 켜 보고, 실제 AI를 붙여 단계별로 확인하고, 진짜가 알려 준 것은 다시 가짜 시험에 넣어요

다음 33편은 연재의 마지막 편, 「사람이 판단하고 AI가 만들었다」예요. AI와 함께 중계기를 만든 11주를 돌아보며, 무엇을 사람이 정하고 무엇을 AI에게 맡겼는지 이야기하고 연재를 마칠게요.


2026년 10월 2일 기준입니다. 제가 만든 중계기의 개발 기록(저장 기록의 시각과 메모, 위험 점검 문서, 새 판 안내문, 시험·점검 스크립트)을 바탕으로 썼고, 특정 기업·서비스의 공식 입장이 아닙니다.