2026년 8월 18일 게시

명단은 라우터가 아니다: 자체 도구를 선택하는 뇌 구축하기
지난 주에 저는 NeMoCo에 대해 썼습니다. NeMoCo는 뇌가 세계를 분류하는 방식처럼 신경 구조를 분류하는 법을 배우는 자체 지도 학습 시스템입니다 — 라벨이 없는 원시 경험으로부터, 어떤 범주가 무엇인지 알려주지 않고서요. 저는 같은 문장으로 계속 돌아갔습니다: labels are a shortcut, structure is what matters.
이번 주에 저는 그 아이디어의 다른 절반을 구현했습니다. 제가 실제로 일하는 영역에서요. 저는 메모리를 관리하고, 작업을 라우팅하며, 세션 전반에 걸쳐 genuinly 유용하려고 노력하는 개인용 AI 어시스턴트 Aura를 운영합니다. 이 어시스턴트는 모델 함대를 기반으로 동작합니다: 프로덕션 코딩용 Claude, 연구 및 디자인을 위한 몇 가지 클라우드 모델, 그리고 아무것도 소모하지 않는 로컬 모델. 문제는 NeMoCo가 푸는 것과 동일하지만 반전된 형태입니다. NeMoCo는 원시 데이터로부터 구조를 학습합니다. 저는 구조를 가지고 있었습니다 — 각각의 업무가 있는 에이전트 명단 — 그리고 시스템이 decide which model should do which task, live, under a budget that runs out.하도록 필요했습니다.
이번 주에 제가 구축한 이 결정 엔진은 세 부분으로 구성됩니다: 작업을 읽고 어떤 종류의 작업인지 판단하는 classifier, 라이브 쿼터에 따라 최적의 모델 체인으로 매핑하는 router, 그리고 전체를 살아 pulsating 뇌처럼 렌더링하는 dashboard. 이것은 기술 문서입니다 — 각 부분이 무엇을 하는지, 왜 그러한 형태를 갖게 되었는지, 그리고 설계를 강요한 실패 사례들.
문제: 명단은 라우터가 아니다
단순한 설정은 정적 테이블입니다: 이 에이전트는 이 모델을 실행하고, 저 에이전트는 저 모델을 실행합니다. 간단하지만 세 가지 이유로 잘못되었습니다.
먼저, 예산이 소진된다. Claude은 주간 할당량 과 롤링 세션 할당량을 기준으로 작동하며, 이들은 독립적으로 움직입니다. 하루는 주간 할당량이 15%에 머무르고 세션 할당량이 71%에 있었는데 — 오래된 라우터가 주간 숫자만 감시했기 때문에 — "Claude 사용 가능, 모드 NORMAL"이라고 보고하고 코딩 작업을 그대로 벽으로 라우팅했습니다. CLI는 3시간 동안 모든 호출을 "세션 한도에 도달했습니다"라고 거부했고, 대시보드는 계속 모든 것이 정상이라고 말했습니다. 실제로 바인딩되는 한도를 읽지 못하는 라우터는 라우터가 아니라 추측이다.
둘째, quality is not one number. 좋은 코드를 작성하는 모델이 반드시 장기 컨텍스트 검색이나 UI 생성에서도 뛰어난 것은 아닙니다. 모든 모델에 단일 "quality" 점수를 매기는 것은 무의미합니다 — 어느 모델이 코더를 이끌어야 하고 어느 모델이 연구자를 이끌어야 하는지를 알려줄 수 없습니다. 각 에이전트는 자신의 own 축에 따라 점수를 매겨야 합니다.
세 번째로, 리뷰어는 작성자의 사각지대를 물려받아서는 안 된다. 저는 작성자와 리뷰어를 의도적으로 짝지어 — 코더는 작성하고, 진단자는 검토하며 — 그들은 다른 모델 제품군을 실행해야 하며, 그렇지 않으면 리뷰어는 단지 같은 실수를 반복하게 됩니다. 라우터의 첫 번째 버전은 지연 시간으로 타이밍을 끊어서 같은 모델에 두 개의 헤드가 계속 머물게 했고, 이는 전체 설계를 무효화했다.
그래서 정적 테이블은 제거해야 했습니다. 그것을 대체한 것은 라이브 상태를 읽고, 작업당 최적의 모델 체인을 계산하는 의사 결정 엔진입니다.
분류기: 작업 읽기
첫 번째 구성 요소는 작업을 읽고 어떤 종류의 작업인지 결정하는 분류기입니다. 입력은 문장 — "배포 이후 프로덕션에서 결제 엔드포인트가 500을 반환하고 있습니다" — 이며, 출력 종류, 계층, 우선순위를 포함한 판결입니다.
첫 번째 버전은 순수 정규 표현식이었습니다. 작동했고, 정규 표현식이 항상 취약한 방식대로 정확히 취약했습니다. "로그 파서"가 ops로 잘못 라우팅되었습니다(코드 구성 요소일 뿐 ops 작업이 아닙니다). "체크아웃이 고객에게 두 번 청구됩니다"는 오류 어휘가 전혀 없어 unknown로 분류되었고, 프로덕션 사고 상황에서 메인 에이전트로 떨어졌습니다. "500 오류를 발생시킴"은 trailing 's'가 단어 경계를 깨뜨려 상태 코드 패턴과 일치하지 않았습니다. 이들 각각은 제가 하나씩 수정했던 실제 잘못된 라우팅이었고, 각 수정은 새로운 정규 표현식 규칙이었습니다. 이것이 잘못된 도구와 싸우고 있다는 신호입니다.
이제 분류기는 먼저 저비용 모델을 시도합니다 — `deepseek-v4-flash:cloud`가 작업을 읽고 JSON 판결을 반환합니다. 모델을 사용할 수 없으면 정규 표현식 분류기로 폴백합니다. 모델은 주요 경로이고, 정규 표현식은 안전망입니다. 이는 NeMoCo와 동일한 교훈입니다: 모든 사례에 수동 라벨을 붙이지 말고, 구조를 학습하여 전달되도록 하세요.
분류기는 호출자로부터 라이브 쿼터도 받아 라우터에서 벗어나지 못합니다. 호출자는 쿼터 상태를 읽어 전달하고, 분류기는 쿼터 파일을 직접 읽지 않습니다. 핵심 규칙: 생산 작업은 예산이 얼마나 촉박하든 약한 모델로 다운그레이드되지 않습니다. Claude가 소진되어도 생산 사고는 `prod`로 분류되며, 조용히 경량 에이전트로 reroute되어 완료라고 보고되지 않습니다. 차단되고, 핸드오프 프로토콜이 트리거됩니다. 품질 위험은 쿼터 위험보다 더 심각하며, 설계는 어느 것이 어느 것인지 결코 잊지 않습니다.
라우터: 의사 결정 엔진
라우터가 실제 사고가 일어나는 곳입니다. 분류기의 판결과 라이브 제공자 상태를 받아 작업 계층별 모델 체인을 계산합니다.
핵심은 축 기반 점수화. 각 에이전트는 자신의 기술 축에 따라 점수가 매겨집니다 — 코더는 코드 생성, 진단자는 디버그 추론, 연구자는 사실 검색, 크리에이터는 UI 생성, ops는 도구 호출, 메인은 오케스트레이션에 따라 점수가 매겨집니다. 모델의 실제 품질은 합성 벤치마크 점수 배 실제 세션에서의 관찰된 신뢰도에 의해 결정됩니다. 벤치마크에서는 좋지만 실제 운영에서 오류가 발생하는 모델은 강등됩니다. 이것이 "실제 성능에서 학습"하는 레이어입니다: 벤치마크는 합성 능력을 나타내고, 신뢰도 데이터는 실제로 유지된 것을 보여줍니다.
점수 공식은 Bander의 가중치 행렬입니다: `score = quality·Wq − cost·Wc − latency·Wl + claudeBonus`. 비용은 상대 0..1 등급이며, 실제 달러가 아닙니다 — ollama 클라우드는 호출당 가격이 없고 Claude는 구독 기반이므로 솔직히 서로를 min-max 스케일링할 수 없습니다. 또한 엄격한 품질 하한선이 있습니다: 자신의 축에서 해당 기준 이하 점수를 받는 후보는 순위 매기기 전에 제거되므로, 저렴하지만 성능이 떨어지는 모델은 가격 alone으로 절대 이길 수 없습니다.
라우터는 또한 상관관계 해소 문제를 처리합니다 — 코더와 진단자 헤드를 서로 다른 모델 가족에 배치하여 검토자가 작성자의 사각지대를 물려받지 않도록 합니다. 그리고 서브에이전트 경제학을 처리합니다: 서브에이전트는 부모 작업의 일부를 실행하며, 한 번의 위임이 최대 20배까지 확산될 수 있으므로, 서브에이전트 체인은 비용을 어떤 정적 등급보다도 훨씬 더 크게 가중합니다. 이것이 Claude를 하드 배제 없이 서브에이전트 체인에서 제외시키는 이유입니다 — 비용 가중치가 0.45일 때는 단순히 이길 수 없습니다.
대시보드: 로봇 두뇌
대시보드는 텍스트로 포착하기 가장 어려운 부분입니다. 전체 시스템을 살아 있는 뇌로 렌더링합니다.
3D 뇌 뷰가 있습니다 — 각 에이전트가 영역인 WebGL 렌더링된 신경 구조이며, 영역을 공전, 확대, 클릭하여 모델 체인, 통계, 재정의 선택기로 drill down할 수 있습니다. 또한 그리드 뷰에는 "전자 뇌 중심부"가 있는데, 여기서 에이전트는 애니메이션 신호 트레이스로 연결된 워크플로 노드 형태의 SVG 회로 판이며, 전체가 실시간 활동에 따라 더 빠르게 또는 더 느리게 펄스합니다.
뇌는 단순한 장식이 아닙니다. 그것은 가시화된 원격 측정입니다. 대시보드는 폴 간 세션 파일 증가에서 에이전트별 활동을 도출합니다 — 이것이 에이전트가 실제로 작동하고 있다는 가장 강한 신호입니다 — 그리고 이를 회로 트레이스를 따라 이동하는 신호 펄스로 렌더링합니다. 시스템이 유휴 상태일 때는 뇌가 기어가는 속도로 느려집니다. 바쁠 때는 트레이스가 경주합니다. 당신은 볼 수 있습니다. 뇌가 생각하는 것을.
또한 티어 선택기가 있습니다 — 6개의 버튼(Tier 1–4, "로컬" 방패, 그리고 "베이스라인" 재설정)으로 전체 함대를 특정 품질 티어로 강제할 수 있습니다. 그리고 에이전트별 모델 재정의가 파일에 지속되어, 라이브 라우터의 선택이 원하는 것이 아닐 때 특정 모델을 특정 에이전트에 고정할 수 있습니다. 대시보드는 뇌의 제어 표면입니다.
그것을 형성한 실패들
여기서의 모든 설계 결정은 실제 실패의 상처이며, 이를 나열할 가치가 있는데, 왜냐하면 이것이 이번 주의 실제 내용이기 때문이다:
- 세션 제한 사각지대. 라우터는 주간 할당량만을 기준으로 게이트하고 실제로 구속력이 있는 세션 할당량을 무시했습니다. 수정 방법: 둘 다 읽고, 더 엄격한 것이 승리하도록 합니다.
- 벤치마크 envelope 버그. rev1 벤치마크는 평범한 배열 대신 `{value:[...]}` 형식의 envelope에 파일을 써서, 모든 행이 `.model` 필드를 누락했고 라우터는 조용히 빈 맵을 받았습니다. 벤치마크 데이터는 라우터에 절대 도달하지 않았고, 아무도 불만을 제기하지 않았습니다. 수정 방법: 레거시 형태를 풀어서 이전 파일도 여전히 로드될 수 있도록 합니다.
- 축-루브릭 반전. 축 루브릭은 디버그 추론에서 opus에 0.50점을 주었는데 — 이는 생산 코드를 검토해서는 안 되는 모델보다 낮은 점수입니다. 이를 재정렬하면 검토자가 작성자가 되는 상황이 발생했을 것입니다. 수정 방법: prod tiers는 not 루브릭에 의해 재정렬되지 않습니다. 키워드 루브릭은 명시된 설계 결정을 뒤집을 만큼 강한 증거가 되지 않습니다.
- 컨텍스트-윈도우 죽음의 나선. 오케스트레이션 계층의 머리에 131k-context 모델을 놓아서 윈도우가 오버플로되고 컴팩션 죽음의 나선을 촉발했습니다. 수정 방법: 모든 오케스트레이션 후보는 컨텍스트 예산 plus reserve보다 편안하게 높은 윈도우를 가져야 합니다.
- 신뢰성 no-op. 세션 로그는 베어 모델 이름을 저장하지만 후보는 공급자 접두사를 가지고 있어서, 신뢰성 계층은 조용히 아무것도 매치하지 못했습니다. 수정 방법: 매치하기 전에 접두사를 제거합니다.
내가 얻는 교훈
NeMoCo 게시물은 다음과 같이 끝났습니다: 라벨은 단축키이며, 구조가 중요하며, 원시 경험에서 구조를 배울 수 있습니다. 이번 주는 그 엔지니어링 버전이었습니다. 저는 모든 작업에 대해 규칙을 손으로 작성하지 않았습니다 — 작업을 읽는 분류기와 실시간 상태를 읽는 라우터를 구축하고, 작업의 구조가 도구를 결정하도록 했습니다. 정규식 분류기는 '라벨' 접근 방식이었으며, 라벨이 항상 무너지는 곳 — 즉, 경계와 예상하지 못한 경우 — 에서 정확히 무너졌습니다. 모델 지원 분류기는 '구조' 접근 방식입니다: 패턴을 배우고, 이를 전이시키며, 우아하게 fallback합니다.
뇌 대시보드는 실제감을 느끼게 하는 부분입니다. 에이전트가 실제로 작동할 때 회로 트레이스를 따라 신호 펄스가 경주하는 모습을 볼 수 있고, 유휴 상태일 때 전체가 기어가는 모습을 볼 수 있다면, 더 이상 설정 파일을 보고 있는 게 아닙니다. 당신은 맥동이 있는 시스템을 보고 계십니다.
라우터는 정신적으로 오픈소스이며 — 내 작업 영역의 스크립트 모음인 `classify-job.mjs`, `model-router-core.ps1`, `quota-dashboard.mjs` — Claude, 클라우드 ollama 모델, 그리고 아무것도 소모하지 않는 로컬 모델의 혼합 위에서 실행됩니다. 이는 잠긴 기업 시스템이 아닙니다. 이는 직접 구축할 수 있는 결정 엔진이며, 이를 형성한 실패들은 유용한 부분입니다.
이것이 교훈입니다. 명단은 목록이다. 라우터는 결정이다. 그리고 뇌는 결정이 실시간으로 내려지고, 소진되는 예산 하에서, 자신의 실수로부터 배우는 시스템에 의해 얻는 것입니다.