오늘 오후, 두 개의 소식이 거의 동시에 눈에 들어왔다.
하나는 Claude Code를 쓰던 개발자들의 토큰이 갑자기 사라졌다는 이야기. 다른 하나는 음성 인식 AI를 C++로 다시 짰더니 96배 빨라졌다는 이야기.
얼핏 보면 별개의 사건이다. 하지만 나란히 놓고 보면, 둘은 정반대 방향에서 똑같은 진실을 가리키고 있었다.
아무도 몰랐던 충돌
이정민이 올린 글의 제목은 도발적이었다.
"여러분의 Claude Code 주간 한도 전부 0으로 초기화됐습니다."
무슨 일이 있었나. Claude Code에는 두 가지 메커니즘이 함께 작동하고 있었다. 대화 맥락이 길어지면 자동으로 압축하는 시스템, 그리고 최근 추가된 Auto Memory 기능. 각각은 잘 작동했다. 문제는 둘이 만났을 때였다.
두 시스템이 충돌하면서 프롬프트 캐싱이 조용히 깨졌다. 사용자는 아무것도 몰랐다. Claude Code는 평소처럼 응답을 내놓았다. 하지만 보이지 않는 곳에서, 매 요청마다 전체 컨텍스트를 새로 계산하고 있었다. 캐시는 없었다. 결과는 토큰 폭발이었다.
Anthropic은 이후 담담하게 인정했다.
"캐싱은 쉽게 퇴보한다."
그 문장이 마음에 걸렸다. 쉽게 퇴보한다. 우리가 당연하게 여기는 것들이, 사실 얼마나 불안정한 균형 위에 서 있는지를 말하는 것처럼 들렸다.
반대편에서 온 답
같은 날, 전혀 다른 이야기가 올라왔다.
Parakeet.cpp. NVIDIA의 음성 인식 모델을 순수 C++로 처음부터 다시 구현한 프로젝트다. Metal GPU 가속을 붙였더니, Apple Silicon에서 10초짜리 오디오를 처리하는 데 27밀리초가 걸렸다. CPU보다 96배 빠르다. PyTorch로 돌리는 것보다도 빠르다.
어떻게 이게 가능했을까.
비결은 덜어내기였다. Python 생태계도 없다. PyTorch 런타임도 없다. Hugging Face 라이브러리도 없다. 경량 텐서 라이브러리 하나만 남겼다. 편리한 레이어들을 전부 걷어내고, 하드웨어에 가능한 한 가까이 내려갔다.
그랬더니 96배가 나왔다.
추상화가 숨기는 것들
두 이야기를 나란히 놓으면 하나의 질문이 떠오른다.
우리가 쓰는 편리한 도구들 안에는 무엇이 들어있을까?
Claude Code는 강력하다. 자동 압축, 자동 메모리, 자동 캐싱 — 개발자가 신경 쓰지 않아도 되게끔 설계되었다. 그게 강점이다. 하지만 그 자동화들이 충돌했을 때, 사용자는 아무 신호도 받지 못했다. 무언가 잘못됐다는 걸 토큰이 다 사라진 다음에야 알았다.
Parakeet.cpp는 반대로 갔다. 자동화를 포기했다. 편리함을 포기했다. 그 대신 시스템이 무엇을 하고 있는지를 완전히 파악할 수 있게 됐다. 그리고 거기서 96배의 성능이 나왔다.
추상화는 복잡성을 숨겨준다. 그게 추상화의 존재 이유다. 덕분에 우리는 더 빠르게 만들 수 있고, 더 많은 것을 할 수 있다. 하지만 숨겨진 복잡성은 사라지는 게 아니다. 어딘가에 쌓여 있다. 그리고 때때로 — 캐싱이 깨지는 것처럼 — 예상치 못한 순간에 터져 나온다.
에이전트 설계에 주는 시사점
이 이야기는 단순히 "도구를 조심하라"는 교훈이 아니다.
Claude Code 버그가 알려준 건, AI 에이전트를 설계할 때 캐싱 구조를 처음부터 의도적으로 고려해야 한다는 것이다. 캐싱이 깨지면 성능이 떨어지는 게 아니라, 비용이 폭발한다. 그리고 그게 깨졌다는 사실을 겉으로는 알 수 없다.
Parakeet.cpp가 알려준 건, 추상화 아래를 이해하는 사람이 진짜 성능을 만들어낸다는 것이다. 27밀리초는 C++을 쓴 결과가 아니다. 시스템이 어디서 시간을 낭비하는지를 정확히 파악한 결과다.
둘 다 결국 같은 말을 하고 있다.
편리함은 공짜가 아니다. 그 편리함이 무엇을 숨기고 있는지 알 때, 우리는 비로소 그것을 제대로 쓸 수 있다.