ClawMux 임베딩 분류기와 자동화 불가 케이스 표시

26년 04월 03일

키워드에서 임베딩으로

나는 어제 ClawMux에 LLM 분류기를 붙이고 QA Agent를 처음 배포했다.

오늘은 두 시스템을 더 다듬는 날이었다.

ClawMux는 분류기를 한 단계 더 발전시켰고, QA Agent는 “자동화할 수 없는 케이스”를 명시적으로 표시하는 체계를 만들기 시작했다.

어제는 ClawMux 요청 분류기를 14차원 키워드 점수 계산기에서 LLM 한 글자 분류기로 바꿨다.

오늘은 또 다른 접근을 시도했다.

로컬 임베딩 모델 기반 분류기다.

키워드 매칭의 한계는 명확했다.

단어가 같아야 점수가 오르니까, 비슷한 의미지만 다른 단어를 쓴 요청을 놓친다.

“이거 도와줘”랑 “질문 있어”는 비슷한 복잡도지만 키워드가 달라서 다른 점수가 나온다.

그래서 의미 기반으로 분류하려고 했다.

요청 텍스트를 임베딩 벡터로 바꿔서 각 복잡도 등급의 중심 벡터와 거리를 비교하는 방식이다.

가장 가까운 중심 벡터의 등급으로 분류한다.

로컬 임베딩 모델

다국어를 지원하는 가벼운 임베딩 모델을 골랐다.

118메가바이트짜리 양자화 모델이다.

로컬에서 돌리니까 분류에 API 비용이 들지 않는다.

초기화는 느리지만 한 번 뜨면 빠르게 동작한다.

단문 쿼리는 가벼운 요청으로 강제 분류하는 보조 규칙도 붙였다.

임베딩 거리만 믿기보다는, 확실히 단순한 요청은 규칙으로 잡는 게 안정적이어서다.

검증은 깔끔하게 통과했다.

타입체크 에러 0개, 테스트 564개 전부 통과, 외부 의존성도 없었다.

동적 컨텍스트 창 해석

분류기 외에 컨텍스트 창 해석도 구현했다.

모델마다 컨텍스트 윈도우 크기가 다른데, 이걸 어디서 신뢰할지 우선순위를 정했다.

설정 파일, 플랫폼 설정, 내장 카탈로그, 기본값 순서로 확인한다.

더 구체적인 설정이 우선한다.

그리고 컨텍스트가 초과하면 오래된 메시지부터 제거하는 식으로 다듬었다.

모델 ID에 프로바이더명을 강제해서 어느 프로바이더의 어느 모델인지 명확하게 만들었다.

모호하면 컨텍스트 창 크기를 잘못 가져올 수 있어서.

이 임베딩 분류기는 사실 잠깐 쓰였다. 며칠 뒤에 한계가 드러나서 결국 더 싼 LLM 한 글자 방식으로 다시 돌아갔다.

로컬 임베딩은 빠르고 공짜지만 분류 품질이 LLM만큼 정확하지 않았다.

다만 “의미 기반으로 요청을 바라보기 시작한” 전환점이었던 건 맞다.

키워드를 넘어선 시도였으니까.

자동화할 수 없는 케이스 표시

QA Agent 쪽에서는 시트 작성 에이전트를 다듬었다.

핵심은 “자동화할 수 없는 케이스”를 명시적으로 표시하는 체계를 만든 거다.

QA Agent는 모든 테스트 케이스를 자동으로 돌리려고 한다.

근데 현실적으로 자동화가 불가능한 케이스가 있다.

시각적으로 확인해야 하는 케이스, 실행기가 물리적으로 수행할 수 없는 케이스. 이런 걸 그냥 실행하면 무조건 실패로 나온다.

그러면 실패가 진짜 버그인지, 그냥 자동화 불가 케이스인지 구분이 안 된다.

에이전트 테스트 건너뛰기 판단 기준

그래서 자동 테스트를 건너뛰어야 하는 케이스를 식별하는 기준을 정했다.

시각 검증이 필요한지, 실행기가 수행 불가한지 판단하는 기준이다.

이 기준에 맞으면 케이스에 건너뛰기 표시를 한다.

이 표시가 있으면 QA Agent가 굳이 실행을 시도하지 않는다.

그리고 결과 리포트에서도 “이 케이스는 자동화 대상이 아니다”라고 명시적으로 나온다.

무조건 실패로 나오는 게 아니라, 애초에 자동화 범위 밖이라고 표시되는 거다.

memo 작성 기준

건너뛰기 케이스랑 함께 memo 필드에 뭘 남길지 지침도 정했다.

memo 필드는 케이스에 대한 부가 설명을 적는 곳인데, 이전에는 뭘 적어야 할지가 불분명했다.

무엇을 기록하면 downstream에서 도움이 되는지를 기준으로 잡았다.

왜 이 케이스가 자동화 불가인지, 사람이 확인하려면 뭘 봐야 하는지. 그런 정보를 남기는 걸 지침으로 정했다.

마무리

두 작업 모두 “분류”에 대한 것이었다.

ClawMux는 요청의 복잡도를 분류하는 방식을 키워드에서 임베딩으로 바꿨고 QA Agent는 케이스를 자동화 가능과 불가능으로 분류하는 체계를 만들었다.

임베딩 분류기는 결국 LLM 방식으로 다시 바뀌었지만 의미 기반 분류라는 방향을 시도해본 게 의미 있었다.

키워드를 넘어서는 첫 걸음이었으니까. 그리고 로컬 모델을 쓰면 API 비용이 들지 않는다는 장점도 확인했다.

비용과 정확도 사이의 트레이드오프를 직접 겪어본 셈이다.

QA Agent의 자동화 불가 표시는 이후 며칠간 계속 다듬어졌다.

시트를 읽는 사람이 이해할 수 있는 산출물로 발전했는데, 그 출발점이 오늘이었다.

모든 걸 자동화하려는 게 아니라, 자동화할 수 있는 것과 없는 것을 명확히 구분하는 게 더 나은 시스템이라는 걸 깨달았다.