happy_various AI 실전 기록

LLM 중계기 개발기 3부 · 11편 / 전체 33편

2026년 10월 1일 기준

이 글에는 제휴 링크가 없고 OpenAI·앤트로픽·LM Studio와 아무 관계가 없습니다. 제가 직접 만든 중계기의 개발 기록을 바탕으로 썼습니다. 삽화는 GPT 이미지 생성, 도식은 직접 제작했습니다.

전화를 끊었는데 상담원은 계속 대기 중 — 취소 신호를 끝까지 전하는 법 (LLM 중계기 개발기)

상담원이 세 명인 고객센터를 떠올려 볼게요. 한 고객이 상담을 기다리다 급한 일이 생겨 전화를 끊었어요. 그런데 상담원의 수화기에는 ‘통화 종료’ 소식이 오지 않았어요. 상담원은 “여보세요? 고객님?” 하며 계속 수화기를 들고 있고, 안내 시스템은 그 상담원을 여전히 ‘통화 중’으로 표시해요.

그사이 다음 고객은 그 상담원에게 연결되지 못해요. 이런 상담원이 셋이 되면, 고객센터는 전화가 계속 울리는데도 아무도 받지 못하는 곳이 됩니다. 상담원도 전화기도 멀쩡한데 말이에요.

이 글은 LLM 중계기 개발기의 11편입니다. 지난 10편 「중계기에 톨게이트가 필요한 이유」에서는 AI마다 한꺼번에 받을 수 있는 수만큼 차선을 정해 두고, 차선이 차면 줄을 세우는 교통정리를 이야기했어요. 오늘은 그 차선이 ‘아무도 기다리지 않는 일’에 막히는 이야기입니다.

끊어진 전화선이 달린 수화기를 계속 들고 있는 상담원 로봇과 그 앞에서 기다리는 손님들 (GPT 이미지 생성)

결론 요약

📞 1. 프로그램도 전화를 끊는다

프로그램이 중계기에 질문을 보내 놓고 답을 다 받기 전에 연결을 끊는 일은 생각보다 흔해요.

중계기 입장에서는 모두 ‘전화가 끊긴’ 상황이에요. 중계기는 질문을 받는 도중 연결이 끊기거나, 연결에 오류가 나거나, 답을 다 보내기 전에 연결이 닫히면 그 순간 ‘그만’ 신호를 하나 만들어요. 개발자들은 이걸 시그널(signal)이라고 불러요. 이름 그대로, 이 질문에 매달린 모든 일에 “이제 그만해도 돼”라고 알리는 신호예요.

중계기가 스스로 끊는 경우도 있어요. AI마다 한 질문에 쓸 수 있는 시간을 정해 두었거든요. 기본 설정에서 Codex와 Claude는 한 질문에 최대 5분, LM Studio는 3분이에요. 이 시간이 지나도 중계기는 같은 ‘그만’ 신호를 보내요. 프로그램이 끊든 시간이 다 되든, 멈추는 길은 하나인 셈이에요.

이 신호 전달은 첫 버전부터 있었어요. 개발 첫날 아침에 저장한 첫 기록에도 ‘취소 전달’이 기능 목록에 올라 있어요. 어려운 건 신호를 만드는 것보다 끝까지 전하는 것이었어요.

🔗 2. ‘그만’은 사슬처럼 끝까지 가야 한다

2편에서 질문 하나가 중계기 안에서 창구 → 교통정리(줄) → 어댑터를 지나 AI에 닿는다고 했어요. 이 길의 단계마다 무언가를 기다리는 곳이 있어요. 줄에서는 차례를 기다리고, 어댑터는 AI의 답을 기다리고, 흘려보내기 칸은 프로그램이 답 조각을 받아 가기를 기다려요. 개발자 말로는 이렇게 멈춰 서서 기다리는 지점을 ‘어웨이트’(await)라고 해요.

‘그만’ 신호는 이 기다리는 곳 모두에 닿아야 해요. 질문이 지금 어디에 있느냐에 따라 멈추는 모양이 달라요.

빨간 손바닥 표지판을 바통처럼 넘기며 달리는 로봇들과, 마지막에 손을 들어 일을 멈추는 커다란 AI 기계 (GPT 이미지 생성)

이어달리기에 빗대면 ‘그만’ 표지판이 바통이에요. 주자 중 한 명이라도 바통을 받지 않고 딴 데를 보고 있으면, 그 뒤의 주자는 경기가 끝난 줄 모르고 계속 달려요.

답이 돌아오는 길에도 기다림이 있어요. 답을 흘려보내는 동안 중계기는 2편에서 말한 대로 15초마다 “아직 연결돼 있어요”라는 신호를 따로 보내요. AI가 오래 생각하느라 한동안 글자가 없어도 연결이 끊긴 것처럼 보이지 않게요. 답 조각이든 이 안부 신호든 프로그램에 쓰기 전에는, 연결이 이미 닫혔는지와 ‘그만’ 신호가 왔는지를 먼저 확인해요. 반대로 프로그램이 답 조각을 느리게 받아 가면 중계기는 받는 쪽이 따라잡을 때까지 잠깐 기다리는데, 이 기다림도 ‘그만’ 신호를 듣고 있고 5초 넘게 진척이 없으면 그만둬요.

🪑 3. 고리 하나가 끊기면 — 영원히 비지 않는 자리

여기서 교통정리 칸이 일하는 방식을 하나 알아야 해요. 교통정리 칸은 ‘그만’ 신호를 보낸 순간 자리를 비우지 않아요. AI 쪽 일이 실제로 끝난 뒤에야 그 차선을 돌려줘요.

신호만 보내고 자리를 바로 비우면, AI 쪽에서는 이전 일이 아직 돌고 있는데 다음 질문이 들어갈 수 있어요. 그러면 “Codex에는 동시에 3건까지”라는 약속이 겉으로만 지켜지고 실제로는 깨지겠죠. 중계기의 시험 항목에도 “시간이 다 됐어도, 정리가 끝나지 않은 일의 자리는 내주지 않는다”는 확인이 들어 있어요.

이 방식은 정직한 대신 한 가지를 전제로 해요. 어댑터는 신호를 들으면 반드시 멈춘다는 것이에요. 만약 어떤 어댑터가 AI의 답을 기다리면서 ‘그만’ 신호에는 귀를 막고 있다면 어떻게 될까요?

프로그램 → 창구 → 줄 → 어댑터 → AI로 '그만' 신호가 전해지는 경우와 어댑터에서 끊기는 경우 — 위는 자리가 돌아오고, 아래는 차선이 안 끝난 일로 막힌다 (직접 제작)

한 건이면 차선 하나가 줄어든 채로 버틸 수 있어요. 그런데 이런 일이 차선 수만큼 쌓이면 이야기가 달라져요. 기본 설정에서 Codex와 Claude는 차선이 3개, LM Studio는 1개예요. Codex의 차선 3개가 모두 이런 일로 차면, 그다음부터 Codex로 가는 질문은 줄에서 기다리다 “너무 오래 기다렸다”는 답을 받거나, 줄이 꽉 차서 “지금은 붐빈다”는 답을 받고 돌아가요. 그 줄은 이 중계기를 쓰는 모든 프로그램이 함께 서는 줄이에요.

밖에서 보면 “Codex가 고장 났다”처럼 보여요. 하지만 Codex는 멀쩡하고, 중계기의 차선이 아무도 기다리지 않는 일로 막혀 있는 거예요. 첫 장면의 고객센터와 똑같죠. 중계기 개발 문서에는 이 상황을 “자리를 영구히 차지해 그 AI 전체가 굳는다”고 적어 두었어요.

그래서 중계기 기록에는 AI에게 넘어간 뒤 취소된 요청마다 멈추라고 알린 때와 실제로 멈춰 자리를 돌려준 때가 따로 한 줄씩 남아요. 앞줄만 있고 뒷줄이 없다면, 그게 바로 빈 수화기를 든 상담원이에요.

👻 4. 내 컴퓨터에서 도는 AI와 ‘유령 줄’

LM Studio는 내 컴퓨터에서 AI를 직접 돌리는 프로그램이에요. 중계기는 LM Studio에 한 번에 1건만 보내요. 컴퓨터의 그래픽카드 하나를 모든 질문이 함께 쓰기 때문이에요.

이런 AI에서는 ‘그만’ 신호가 특히 중요해요. 프로그램은 떠났는데 LM Studio에 간 요청이 그대로 살아 있으면, LM Studio는 아무도 읽지 않을 답을 끝까지 써요. 그동안 다음 질문은 그 뒤에서 기다려야 하죠. 맨 앞에 유령이 서 있는 줄이에요. 중계기 연동 안내서에서는 이걸 ‘유령 큐’라고 불렀어요.

기다리는 손님들 앞에서 의자에 앉아 있던 유령을 들어 올려 자리를 비우고, 다음 손님을 손짓해 부르는 로봇 안내원 (GPT 이미지 생성)

그래서 중계기는 LM Studio로 보내는 요청에도 같은 ‘그만’ 신호를 묶어 둬요. 프로그램이 끊으면 LM Studio로 가는 연결도 바로 끊기고, 답을 한 조각씩 읽던 중이라면 그 읽기도 멈춰요. 개발 첫날 저녁에 쓴 연동 안내서에도 이렇게 적었어요. “사용자가 취소하면 연결을 끊으세요. 그러면 중계기가 AI 쪽 생성까지 바로 멈춥니다(LM Studio 유령 큐 방지 등).”

이 문장은 중계기를 쓰는 프로그램에게 주는 부탁이기도 해요. 프로그램이 “이제 필요 없다”는 걸 연결을 끊어서 알려 줘야, 중계기가 그 뒤를 끝까지 정리할 수 있으니까요.

📋 5. 남긴 규칙 — 시작하는 법만큼 그만두는 법

중계기의 개발 문서에는 이 문장이 ‘상시 주의’ 항목으로 올라가 있어요.

어댑터는 기다리는 모든 단계에 ‘그만’ 신호를 끝까지 전한다. 무시하면 자리를 영구히 차지해 그 AI 전체가 굳는다.

AI와 함께 코드를 쓸 때 주는 작업 안내서에도 같은 문장이 들어 있고, 새 어댑터를 붙이거나 기존 어댑터를 고칠 때 가장 먼저 확인하는 항목으로 정해 두었어요. AI가 하나 늘 때마다 어댑터도 하나 늘고, 그때마다 이 약속을 다시 확인해요.

말로만 정한 게 아니라 시험도 있어요.

개발자가 아닌 분께도 쓸모 있는 교훈이 하나 있다면 이거예요. 일을 시작하는 법만큼 ‘그만두는 법’을 설계해야 한다.

예약은 쉬운데 취소해도 자리가 바로 풀리지 않는 회의실 예약, 줄을 떠난 손님이 명단에 계속 남는 식당 대기표를 떠올려 보세요. 시작하는 길만 잘 만든 시스템은 평소에는 멀쩡하다가, 취소가 몇 번 쌓인 어느 날 조용히 멈춰요. 무언가를 새로 만들거나 업무 절차를 짤 때 “중간에 그만두면 누가, 무엇을, 어디까지 되돌려 놓지?”를 한 번 물어보세요. 그 질문 하나가 ‘통화 중’으로 굳은 상담원을 막아 줍니다.

정리

① 프로그램은 생각보다 자주 전화를 끊어요. 중계기는 연결이 끊기거나 정해 둔 시간이 다 되면 ‘그만’ 신호를 만들어요 ② 이 신호는 창구 → 줄 → 어댑터 → AI, 그리고 답이 돌아오는 길까지 기다리는 모든 곳에 닿아야 해요. 중계기는 일이 실제로 멈춰야 자리를 돌려주기 때문에, 한 곳만 놓쳐도 그 AI의 차선이 영원히 막혀요 ③ 그래서 ‘기다리는 모든 단계에 그만 신호를 끝까지 전한다’를 어댑터 공통 규칙으로 두고, 끊김을 섞은 10분 시험으로 확인해요 — 3부 교통정리 이야기가 이어집니다

차선과 줄이 왜 필요한지는 10편에, 질문이 중계기 안에서 지나는 길은 2편에 있어요.


2026년 10월 1일 기준입니다. 제가 만든 중계기의 개발 기록을 바탕으로 썼고, 특정 기업·서비스의 공식 입장이 아닙니다.