숨겨진 테스트로 로컬 모델의 신뢰를 쌓는 짐(Gym)을 구축했습니다. gpt-oss:20b가 두 번이나 휩쓸어 실제 업무를 맡겼습니다 (오픈
요약
로컬 모델의 신뢰성을 검증하기 위해 숨겨진 테스트 스위트를 활용하는 'eval gym' 파이프라인을 구축했습니다. gpt-oss:20b 모델이 이 테스트를 통과하여 에이전트 기반 앱 빌드 신뢰 등급을 획득했으며, 실제 업무 적용을 통해 모델의 한계와 버그를 식별하는 과정을 다룹니다.
핵심 포인트
- 숨겨진 pytest를 활용한 로컬 모델 전용 신뢰 파이프라인 구축
- gpt-oss:20b 모델이 에이전트 기반 앱 빌드 신뢰 등급 획득
- 실제 프로덕션 티켓 적용을 통한 모델의 토큰 제한 및 에러 식별
- 모델의 성능을 브랜딩이 아닌 실제 테스트 결과로 검증
며칠 전, 저는 초안 작성을 무료 및 로컬 모델로 오프로딩(offloading)하는 플러그인인 agent-smith에 대해 게시물을 올렸습니다. 그 이후로 이것은 제가 예상하지 못했던 방향으로 성장했습니다. 바로 로컬 플릿(fleet)을 위한 완전한 신뢰 파이프라인(trust pipeline)이 된 것입니다. 여기서 모델들은 자신만의 차선을 획득하고, 이를 계속 유지하며, 실수할 경우 차선을 잃게 됩니다. 근거 있는 문헌 조사(lit sweep)를 거친 결과, 통합된 버전은 아직 다른 어디에도 존재하지 않는다고 상당히 확신합니다. 증거는 아래에 있으며, 저장소(repo)는 하단에 있습니다. MIT 라이선스입니다.
핵심 아이디어: 모델은 신뢰를 부여받는 것이 아니라, 신뢰를 획득해야 합니다.
저는 제 MacBook(M3 Pro, 36GB)에서 평가 짐(eval gym)을 실행합니다. 모델들이 절대 볼 수 없는 숨겨진 pytest 스위트가 포함된 14가지 작업으로 구성됩니다: 코드 생성(code gen), 구조화된 추출(structured extraction), 저장소 버그 수정(repo bug fixes), 그리고 샌드박스 도구 루프(list, read, write, run, finish) 내에서의 완전한 소규모 앱 빌드입니다. 특정 능력에 대해 신뢰할 수 있는(trusted) 등급으로 승격되려면 두 번의 연속적인 깨끗한 실행이 필요합니다. 모든 과정은 temperature 0에서 진행됩니다.
gpt-oss:20b는 아무런 준비 없이 들어와 14가지 작업을 모두 휩쓸었습니다. 그것도 두 번이나요. 제 하네스(harness)에서 에이전트 기반 앱 빌드(agentic app builds)로 신뢰 등급을 획득한 첫 번째 모델입니다. 이 모델은 노트북에서 12GB 메모리를 사용하여, 한 번도 본 적 없는 테스트에 맞춘 작성된 명세(specs)로부터 todo CLI, CSV 리포터, 그리고 표준 라이브러리(stdlib) HTTP API를 구축했습니다. 현재 플릿 구성은 다음과 같습니다: 코드 품질을 위한 gpt-oss:20b, 비전 및 디자인을 위한 gemma4:26b, 빠른 초안 작성을 위한 qwen3-coder:30b입니다. 이들은 서로 다른 부분을 놓치는데, 이는 나중에 중요한 요소가 됩니다.
그 후 저는 실제 업무를 맡겼고, 실패가 가장 흥미로운 부분이었습니다. 첫 번째 프로덕션 티켓(production ticket): 소규모 통계 모듈 구축. 모델은 3번째 턴에서 실패했습니다. 제 하네스는 턴당 생성 토큰을 1600개로 제한하는데, 모델이 단 한 번의 네이티브 도구 호출(native tool call)로 문서가 많은 파일을 작성하려 시도했고, 호출이 JSON 중간에서 잘리면서 Ollama가 500 에러를 반환했습니다. 짐(gym)의 작업들은 마침 제한 범위 내에 있었기 때문에 이 문제를 잡아내지 못했습니다. 하나의 실제 티켓이 한 시간 만에 두 개의 실제 버그를 찾아냈습니다. 두 버그 모두 판정(verdicts)과 함께 로그에 기록되었고, 모두 수정되었으며, 재시도 결과 제 적대적 테스트(adversarial tests)를 통과한 모듈이 배포되었습니다.
짐(gym)은 모델의 이름이 무엇인지 상관하지 않습니다. 이번 주에 저는 프론티어 모델(frontier model)의 이름을 붙인 인기 있는 9B 튜닝 모델(다운로드 150만 회, "uncensored", 그 모든 것을 갖춘)을 인터뷰했습니다.
모두와 동일한 조건: 숨겨진 테스트(hidden tests), 온도(temp) 0, Q4. 결과: 10/14. 5.6GB 크기치고는 존중할 만한 에이전트적 역량(agentic chops)을 보여주었으나, 코드 생성(code gen)에서는 차단된 티어(blocked tier)였고, 원샷(one shots) 시 최대 260초가 소요되었습니다(나의 20B 모델보다 느림). 또한, 이 모델이 통과한 그 어떤 것도 이미 보유 중인 모델들보다 더 잘 수행하지 못했습니다. 독자적인 영역(lane)이 없습니다. 브랜딩은 결과 어디에서도 나타나지 않았습니다. 그것이 바로 숨겨진 테스트의 핵심입니다.
모든 위임(delegation)은 기록되고, 판단되며, 이제 감시됩니다. 실행당 하나의 JSON 라인이 생성됩니다. 검토 후 저는 다음과 같이 표시합니다: 결과 좋음(verdict good), 또는 이유와 작업 태그(task tag)를 포함한 결과 나쁨(verdict bad). 보고서는 모델별, 작업 형태(task shape)별 라우팅 가중치(routing weights)를 계산합니다: 품질 비율(quality rate)과 연속적인 성공 기록(consecutive good streak)을 합산합니다. 연속 성공이 5회면 가벼운 검토(light review)를, 10회면 무작위 점검(spot checks)만 수행하며, 한 번이라도 실패하면 기록은 초기화됩니다. 그리고 신뢰할 수 있는 모델도 조용히 퇴보할 수 있기 때문에(Ollama 가중치 업데이트, 양자화(quant) 변경 등), 이제 '목격자 센서(witness sensor)'가 있습니다. 로컬 실행의 5%는 두 번째 모델에서 조용히 재실행되어 비교됩니다. 일치 여부는 조용히 기록됩니다. 불일치(disagreement)가 발생하면 검토를 위한 드리프트 신호(drift signal)를 발생시킵니다. 이 센서는 작동 시작 2분 만에 무언가를 잡아냈습니다: llama3.2:3b가 자신이 Google에 의해 만들어졌다고 자신 있게 답변한 것입니다. 목격자 모델은 이에 동의하지 않았습니다. Llama3.2는 Meta의 모델입니다.
불일치가 발생하면 에스컬레이션(escalation)이 실행됩니다. 배치 모드(Batch mode)는 모든 항목을 온도 0에서 두 개의 로컬 모델로 실행할 수 있습니다. 일치하면 수락되고, 불일치하면 두 답변을 모두 기록한 뒤 해당 항목을 더 강력한 모델이나 사람에게 큐(queue)로 넘깁니다. 검토 집중도는 무작위 점검 대신 틀릴 가능성이 가장 높은 항목에 정확히 배치됩니다.
API 비용이 저렴한데 왜 굳이 이럴까요: 저는 제 구독 티어를 감당할 여유가 없었습니다. 현재까지 플릿(fleet)은 348건의 위임을 흡수했습니다(109분의 연산 시간, 283개 항목의 분류 스윕(classify sweep), 약 215K의 출력 토큰). 이 모든 작업은 API 사용 시 할당량(quota)이 소모되었을 작업들입니다. 검토된 작업은 80%의 검증된 '좋음' 상태로 실행되고 있으며, 모든 '나쁨'은 회귀 테스트(regression test)가 되도록 큐에 쌓입니다. 로컬 방식은 여유 자원(headroom) 측면에서 스스로 비용을 충당하며, 어떤 데이터도 기계 외부로 나가지 않습니다.
나를 놀라게 한 부분은: 이 글을 쓰기 전에 현재 문헌에 대한 연구 스윕(research sweep)을 수행했다는 점입니다.
온라인 밴딧 라우팅 (Online bandit routing)은 2025년과 2026년에 이 분야가 나아간 정확한 방향입니다 (MixLLM, BaRP, ParetoBandit). 의견 불일치 시의 에스컬레이션 (Escalation on disagreement)은 이번 봄 두 편의 논문에서 공식화되었습니다. 하지만 여러분의 검증된 결과가 Ollama 플릿 (fleet) 전체의 라우팅을 업데이트하고, 실패 사례가 회귀 테스트 (regression tests)가 되며, 증인 프로세스 (witness process)가 신뢰할 수 있는 모델들을 감사하는 개인적이고 로컬한 버전은 어떨까요? 제가 알기로는, 파워 유저들이 직접 이를 결합하거나 혹은 존재하지 않습니다. 그래서 여기 제가 만든 결합 도구가 있습니다.
이 커뮤니티에 걸맞게 솔직한 주의 사항을 밝힙니다:
- 연승 수학 (streak math)은 LinUCB가 아닌 단순 카운터입니다. 작동은 하지만, 화려하지는 않습니다.
- 합의 (Consensus) 및 증인 (witness) 모드는 짧은 구조화된 출력 (structured outputs)에서만 작동합니다. 두 모델이 산문 (prose) 형태의 텍스트에서 문자열 일치 (string match)를 하는 일은 결코 없을 것입니다.
- 증인은 로컬 실행의 5%에서만 작동합니다. 이는 연기 감지기 (smoke detector)이지, 증명 시스템 (proof system)이 아닙니다.
- 작은 작업들은 위임할 가치가 없습니다. 오버헤드 (overhead)가 절감액을 잡아먹습니다. 직접 측정했습니다.
- 동일한 모델로부터 동일한 초에 실행된 결과는 원장 키잉 (ledger keying)에서 여전히 충돌할 수 있습니다. 인지하고 있으며, 수정 목록에 있습니다.
덧붙이자면: 이번 주에 플릿은 듣는 법도 배웠습니다. 로컬 Whisper 전사 (transcription)는 동일한 방식으로 해당 티어를 획득했습니다 (측정 결과 98%의 의미론적 정확도). 그리고 저는 README에서 CUDA가 필요하다고 명시된 Meta의 sam-audio를 Apple Silicon에서 실행하는 데 성공했습니다. 그것은 8가지의 우회 방법을 필요로 했으며 별도의 글을 쓸 가치가 있습니다.
리포지토리 (MIT): https://github.com/negativetime/agent-smith-plugin
스크립트는 순수 표준 라이브러리 (stdlib) Python이며 Ollama와 직접 통신하므로 단독으로 작동합니다. Claude Code 플러그인 래퍼 (wrapper)도 있지만, 아무것도 그것을 요구하지는 않습니다.
submitted by /u/negativetim3
[link] [comments]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기