자연어는 훌륭한 인터페이스지만, LLM의 높은 지연 시간과 비용을 고려하면 항상 최선은 아니다. 구조화된 GUI와 조건부 후속 질문을 결합해 상호작용 지연을 줄이는 방법과 이를 위한 popup-mcp 도구를 소개한다.
자연어는 훌륭한 인터페이스지만, 갑자기 가능해졌다고 해서 항상 그래야 하는 건 아닙니다.
hikikomorphism
2026년 1월 12일
4
5 0
자연어는 훌륭한 인터페이스지만, 갑자기 가능해졌다고 해서 항상 그래야 하는 건 아닙니다. LLM 추론은 느리고 비쌉니다. 종종 완료까지 수십 초가 걸립니다. 자연어 인터페이스는 일반적인 그래픽 사용자 인터페이스보다 지연 시간이 자릿수(orders of magnitude)로 더 큽니다. 그렇다고 LLM을 쓰지 말아야 한다는 뜻은 아닙니다. LLM을 둘러싼 인터페이스를 어떻게 설계할지 똑똑해져야 한다는 뜻입니다.
여러 컴퓨팅 작업의 지연 시간을 시각화한 고전적인 CS 다이어그램이 있습니다. 뮤텍스를 잠그는 데는 나노초, 메모리를 참조하는 데는 마이크로초, 디스크에서 1MB를 읽는 데는 밀리초가 걸린다는 식이죠. LLM 추론은 보통 수십 초(10여 초 단위)가 걸립니다. 스트리밍 응답이 이를 어느 정도 보완하긴 하지만, 여전히 느립니다.
LLM과 여러 턴(turn)으로 상호작용하는 것을 체크리스트를 채우거나, 풀다운 메뉴에서 항목을 고르거나, 슬라이더 바에서 값을 설정하거나, 다중 필드 대화상자를 채우면서 이런 상호작용을 연속으로 진행하는 것과 비교해 보세요. 그래픽 사용자 인터페이스는 빠릅니다. 응답이 초 단위가 아니라 밀리초 단위로 돌아오니까요. 하지만. 하지만: GUI는 똑똑하지 않습니다. 대화에 반응하지 않습니다. 의미(semantic) 이해의 모든 이점을 활용해 대화에 맞춰 스스로 형태를 바꾸지도 못합니다.
이 글은 두 세계의 장점을 모두 제공하는 방법에 관한 것입니다. 구조화된 사용자 인터페이스의 깔끔한 사용성(affordance)과 자연어의 유연성을 결합하는 것이죠. 위 인터페이스의 모든 요소는 LLM이 그때그때(on the fly) 생성했습니다.
이 글은 제가 만든 popup-mcp라는 도구에 관한 글입니다(MCP는 LLM을 위한 표준화된 도구 사용 인터페이스입니다). 약 6개월 전에 만들었고, 그 이후로 제 LLM 상호작용 방식의 핵심으로 삼아 계속 실험해 왔습니다. 덕분에 저는 아주 초기에 이 방식에 크게 애착을 갖게 됐습니다. Popup은 호출되면 임의의 GUI 요소 모음을 가진 팝업을 띄우는 단일 도구를 제공합니다.
Popup은 여기에서 찾을 수 있고, 사용법 안내도 함께 있습니다. stdio를 사용하는 로컬 MCP 도구이므로, 프로세스는 LLM 클라이언트와 같은 컴퓨터에서 실행되어야 합니다. Popup은 다지선다 체크박스, 드롭다운, 슬라이더, 텍스트 박스 같은 요소로 구성된 구조화된 GUI를 지원합니다. 이를 통해 LLM은 다음과 같은 팝업을 렌더링할 수 있습니다:
팝업 도구는 조건부 가시성(conditional visibility)을 지원해, 맥락에 맞는 후속 질문을 할 수 있습니다. 어떤 요소는 처음엔 숨겨져 있다가, ‘체크박스 클릭’, ‘슬라이더 값 > 7’, 또는 ‘체크박스 A 클릭 && 슬라이더 B < 7 && 슬라이더 C > 8’ 같은 조건이 참이 되면 표시됩니다. 이를 통해 LLM은 다음 대화 단계뿐 아니라, 대화가 이후 어디로 흘러갈 수 있을지에 대한 자신의 예상까지 담아내는 복잡하고 미묘한 구조를 만들 수 있습니다. 이를 발더스 게이트 같은 CRPG의 조건부 대화 트리나, 컨설팅에서 쓰이는 인터뷰 트리와 비슷하다고 생각하면 됩니다. 예를 들어, 앞선 대화상자는 다음처럼 확장됩니다:
이 트리를 구성하려면 대화가 어떻게 진행될지에 대한 중첩된 가정(가상의 경우들)을 등록해야 하므로, 이는 LLM의 내부 인지 상태를 들여다볼 수 있는 유용한 창이 됩니다. LLM이 지금 묻고 싶은 질문만 보이는 게 아니라, 다양한 답 조합에 따라 어떤 후속 질문을 할지도 함께 보이니까요. 이는 엄청나게 유용하고, LLM이 잘못된 가정을 하고 있는 지점이 드러나는 경우도 자주 있습니다. 더 중요한 건, 이 방식은 빠르다는 겁니다. 체크포인트에서 대화를 다시 시작하고, 몇 분씩 왕복 대화를 낭비하지 않아도, 반사실적(counterfactual) 경우를 빠르게 탐색할 수 있습니다.
LLM의 잘못된 가정 얘기가 나온 김에: 모든 멀티셀렉트나 드롭다운에는 자동으로 ‘Other(기타)’ 옵션이 포함되며, 이를 선택하면 사용자가 LLM이 놓친 부분을 자세히 적을 수 있는 텍스트 박스가 렌더링됩니다. 이 탈출구(escape hatch)는 처음엔 자연스럽게 나타난 패턴이었지만, 최근에는 모든 멀티셀렉트와 드롭다운 메뉴에 탈출구 옵션이 항상 자동 포함되도록 도구를 수정했습니다.
이렇게 하면, 대화가 어디로 가야 하는지에 대해 LLM이 엉뚱한 생각을 하고 있을 때에도 언제든 사용자가 개입해 방향을 틀 수 있습니다.
처음에 지연 시간, 즉 LLM 응답 하나가 얼마나 오래 걸리는지 이야기했던 걸 기억하시나요? 중첩 대화 트리와 탈출구의 조합은, LLM이 대화의 흐름을 얼마나 잘 예측하느냐에 따라 약 2575% 정도 이를 줄여 줍니다. 특히 기술 사양을 정의할 때, 상위 35개 예측을 담은 일련의 드롭다운이 당신의 다음 답을 포함하는 경우가 놀랄 만큼 많습니다. 포함하지 못하더라도 ‘Other’가 제공하는 자연어 탈출구가 항상 있습니다.
새 RPG 설정을 만든다고 상상해 보세요. LLM이 가장 흔한 패턴 5개에 대한 옵션과, 각 옵션별로 초점을 맞춘 후속 질문을 가진 팝업을 띄웁니다.
이건 일반적인 GUI가 아닙니다. LLM이 당신, 당신의 프로젝트, 그리고 당신이 선호하는 상호작용 스타일에 대해 알고 있는 모든 것을 활용해 완전히 특화되어 있습니다. 그래서 당신이 하려는 일의 90%를 포착합니다. 당신은 관련 옵션을 선택하고, 필요할 때 ‘Other’ 탈출구로 명확히 하면 됩니다.
이런 상호작용의 지연 시간은 밀리초 단위입니다. ‘Other’ 체크박스를 선택하면 텍스트 박스가 즉시 나타납니다. 네트워크 왕복 지연조차 필요 없습니다. 완료하면, 답변이 JSON 도구 응답으로 LLM에 반환됩니다.
이 패턴은 평균(상각) 상호작용 지연 시간(amortized interaction latency)을 줄여 준다고 생각해야 합니다. 팝업 대화상자를 제출한 뒤 후속 응답을 생성하는 데 여전히 수십 초가 걸릴 수는 있지만, 평균적으로 하나의 팝업이 채팅 라운드를 1회 이상 대체한다면, 교환되는 정보 단위당 소요 시간은 더 줄어듭니다. 이게 제가 말하는 상각 지연 시간입니다. 즉, 비싼 LLM 호출 한 번을 로컬 머신에서 결정적으로(deterministically) 렌더링되는 여러 번의 저렴한 GUI 상호작용 위에 분산시키는 것입니다.
저는 Claude Code가 AskUser 도구(계획 모드에서 사용)를 출시하기 몇 달 전부터 이걸 해킹하기 시작했습니다. AskUser 도구는 제한된 TUI(터미널 사용자 인터페이스) 요소들을 제공합니다: 다중 선택과 단일 선택(항상 포함되는 ‘Other’ 옵션 포함), 그리고 단일 선택 드롭다운입니다. 저는 이 때문에 제 라이브러리를 공개하지 않기로 했었지만, 조건부 요소의 추가는 충분히 이야기할 가치가 있다고 생각합니다.
또한 Claude Code에 대한 기능 요청도 몇 가지 있습니다. Anthropic의 누군가가 이 글을 읽고 있다면, 이것들은 모두 구현하기 꽤 쉬울 겁니다:
LLM 채팅 앱을 만들고 있다면, 조건부로 보이는 후속 질문을 포함한 인라인 구조화 GUI 요소를 추가해 상각 상호작용 지연 시간을 줄여야 합니다. 제 라이브러리나 도구 정의 위에 뭔가를 만들고 싶거나, 혹은 그냥 기술 얘기를 하고 싶다면 연락 주세요. 기꺼이 도와드리겠습니다. 이 기법은 OS 네이티브 팝업, 터미널 UI, 웹 UI 모두에 똑같이 적용할 수 있습니다.
저는 여기에서 더 많이 쓸 예정입니다. 2026년의 핵심 결심 중 하나가 제가 만든 것을 공개하는 것이고, 엄청난 백로그가 있습니다. 계속 지켜봐 주세요.
Tidepool Heavy Industries 구독하기
Reader, RSS, 또는 Bluesky 피드로 업데이트 받기
멘션 5개 댓글