ClawMux 요청 분류기
이날은 두 시스템을 동시에 만졌다.
ClawMux라는 LLM 프록시에 요청 분류기를 붙였고 QA Agent를 처음으로 AWS에 배포했다.
인프라와 애플리케이션 양쪽을 하루에 다
잡은 날이었다.
ClawMux는 LLM 프록시 플러그인이다.
세 가지 일을 한다.
요청을 분류하고 프로바이더를 넘나 라우팅하고 컨텍스트를 압축한다.
이날은 그중 요청 분류기를 새로 만들었다.
그 전까지는 14개 차원의 키워드 점수 계산기로 요청을 분류했다.
근데 정확도가 낮았다.
키워드 매칭으로는 요청의 복잡도를 제대로 파악하기 어려웠다.
그래서 LLM 기반 분류기로 바꿨다.
한 글자로 분류하기
핵심 결정은 분류기를 싼 LLM으로 돌리되 응답을 한 글자로만 받는 거였다.
요청을 네 단계로 분류한다.
L은 단순, M은 보통, H는 복잡, Q는 컨텍스트 부족이다.
이 네 글자 중 하나만 반환한다.
추론은 끄고 최대 토큰 수를 1로 잡았다.
분류에 쓰는 토큰을 최소화한 거다.
비용을 최소화하면서도 키워드 매칭보다 정확한 분류를 얻어냈다.
단순한 요청은 싼 모델로, 복잡한 요청은 비싼 모델로 라우팅하는 게 ClawMux의 목표인데 이 분류기가 그 라우팅의 기준이 된다.
컨텍스트 부족일 때
Q, 즉 컨텍스트 부족 판정이 나오면 재분류를 돌린다.
이때 이전 메시지 몇 개를 같이 넣어서 맥락을 보충한다.
그래도 Q가 나오면 보통 단계로 폴백한다.
포맷 에러가 나면 피드백을 주고 최대 두 번 재시도한다.
그래도 실패하면 503 에러를 반환한다.
조용히 폴백하지 않는 게 중요했다.
분류를 못 하면 명시적으로 실패해야 잘못된 라우팅이 조용히 일어나는 걸 막을 수 있다.
이 분류기는 세 번에 걸쳐 진화했다. 처음엔 키워드 점수 계산기였고 이날 LLM 분류기로 바꿨다.
다음 날에는 로컬 임베딩 분류기를 시도했다가 한계에 부딪혀서 결국 다시 싼 LLM 한 글자 방식으로 돌아왔다.
가벼운 LLM이 내놓는 한 글자가 키워드 규칙이랑 로컬 임베딩 둘 다
이겼다.
QA Agent 첫 배포
QA Agent를 처음으로 AWS에 배포했다.
실제 환경에서 돌아가는 걸 검증하는 첫 번째 단계였다.
Graviton2로 ARM64 마이그레이션
인프라는 몇 단계를 거쳤다.
처음엔 t3.medium으로 시작했다가 리소스가 부족해서 t3.xlarge로 올렸다.
그리고 최종적으로 Graviton2 기반 ARM64 인스턴스인 t4g.xlarge로 옮겼다.
비용 절감이 목적이었다.
근데 ARM64로 옮기니까 도커 이미지도 ARM64로 빌드해야 했다.
서버의 빌드 도구 버전이 낮아서 빌드킷 대신 레거시 빌더를 쓰는 우회 방법이 필요했다.
이런 자잘한 호환성 문제가 꽤 걸렸다.
배포는 SSH가 아니라 AWS SSM Run Command로 돌린다.
VPN이랑 AWS SSO를 통해서 접근한다.
ECR에 이미지를 푸시하고 EC2에서 당겨서 도커 컴포즈로 띄우는 파이프라인이다.
크래시 방어
배포하면서 크래시도 잡았다.
디렉토리 조작할 때 EISDIR이나 EEXIST 에러가 나면 프로세스가 죽었다.
디렉토리 연산에 방어 코드를 넣어서 이런 에러가 나도 크래시하지 않게 만들었다.
크래시가 나면 전체 QA 실행이 멈추니까 개별 에러가 전파되지 않게 막는 게 중요했다.
그리고 큐 동시 실행 버그도 잡았다.
병렬로 실행하다
보니 큐 처리에서 경쟁 상태가 생겼던 거다.
첫 실측: 통과율 55%에서 76%로
배포하고 처음으로 실제 QA 시트를 끝까지 돌렸다.
통과율이 55%에서 76%로 올랐다.
며칠 전에 통과율이 50%대였을 때는 결과를 믿을 수 없었다.
동전 던지기 수준이었으니까. 그런데 크래시 방어랑 큐 버그 수정을 거치니까
통과율이 확 올랐다.
76%면 처음으로 “결과를 보고 판단에 쓸 수 있다”는 느낌이 들었다.
낮은 통과율의 원인이 구조 문제가 아니라 크래시랑 동시성 버그였다는 것도 중요한 발견이었다.
케이스 자체를 틀리게 검증한 게 아니라, 실행이 중간에 죽어서 결과가 누락된 거였다.
그러니까 안정성을 잡으니까
통과율이 올랐다.
마무리
하루에 인프라와 애플리케이션을 같이 잡았다.
ClawMux는 LLM 한 글자 분류기로 라우팅의 기준을 만들었고 QA Agent는 첫 배포와 안정화로 통과율 76%를 찍었다.
ClawMux 분류기의 핵심 교훈은 가벼운 LLM이 내놓는 한 글자가 생각보다 정확하다는 거였다.
복잡한 규칙이나 로컬 임베딩을 쓰는 대신, 그냥 싼 모델에게 “한 글자로 답해”라고 하는 게 더 나은 결과를 냈다.
QA Agent는 처음으로 실측 데이터를 냈다는 게 의미 있다.
로컬에서 잘 돌아가는 거랑 실제 환경에서 안정적으로 돌아가는 건 다른 문제인데 배포하고 크래시를 잡으니까 진짜 통과율이 드러났다.