North Mini Code 소개: 개발자를 위한 Cohere의 첫 번째 모델
요약
Cohere가 에이전트 소프트웨어 엔지니어링에 최적화된 30B MoE 모델인 North Mini Code를 출시했습니다. Apache 2.0 라이선스로 제공되며, 유사 규모의 모델 및 대형 모델들을 능가하는 코딩 성능을 보여줍니다.
핵심 포인트
- 30B MoE 구조로 3B의 활성 파라미터만 사용하여 효율성 극대화
- 에이전트 코딩 및 복잡한 소프트웨어 워크플로우 최적화
- Artificial Analysis 코딩 인덱스에서 주요 모델들 능가
- 다양한 스캐폴드 학습을 통해 에이전트 작업의 견고함 확보
- Apache 2.0 라이선스로 Hugging Face를 통해 공개
아래에 나열된 모든 공동 저자
오늘 우리는 강력한 에이전트 코딩 (agentic coding) 능력을 갖춘 30B 파라미터 Mixture-of-Experts (MoE) 모델이자 3B의 활성 파라미터를 가진 North Mini Code를 출시하며, 이는 Hugging Face에서 Apache 2.0 라이선스로 제공됩니다.
North Mini Code는 Cohere의 새로운 모델 제품군의 첫 번째 모델이며, 특히 에이전트 소프트웨어 엔지니어링 (agentic software engineering) 작업을 위해 설계 및 학습되었습니다.
Figure 1: 유사한 크기의 선도적인 오픈 소스 (open-source) 모델들과 비교했을 때, 에이전트 코딩 작업 및 복잡한 코드 생성 벤치마크에서의 North Mini Code의 성능. 당사의 벤치마킹 방법론에 대한 자세한 내용은 여기를 참조하십시오.
North Mini Code는 복잡한 소프트웨어 엔지니어링 워크플로우 (workflows), 터미널 기반 에이전트 작업, 그리고 고품질 코드 생성에 최적화되어 있습니다. Artificial Analysis의 코딩 인덱스 (Coding Index)에서 North Mini Code는 33.4점을 기록하며 Qwen3.5 (35B-A3B), Gemma 4 (26B-A4B), Devstral Small 2 (24B Dense), 그리고 Nemotron 3 Super (120B-A12B), Mistral Small 4 (119B-A6B), Devstral 2 (123B)와 같이 훨씬 더 큰 모델들까지 능가했습니다. 이는 해당 크기 등급에서 가장 강력한 오픈 소스 코딩 모델 중 하나로 자리매김하고 있습니다.
실제 환경의 코드 에이전트 (code agents)는 에이전트 하네스 (agent harnesses) 전반에 걸친 모델의 품질과 견고함에 의존합니다. 우리는 단일 하네스에 최적화하는 대신 여러 스캐폴드 (scaffolds)를 사용하여 North Mini Code를 학습시켰습니다. 이러한 접근 방식은 North Mini Code가 OpenCode와 같은 코딩 에이전트의 신뢰할 수 있는 기반 역할을 할 수 있게 합니다.
Figure 2: North Mini Code는 인터리브된 슬라이딩 윈도우 셀프 어텐션 (interleaved sliding-window self-attention)과 풀 셀프 어텐션 (full self-attention)을 갖춘 Mixture-of-Experts 트랜스포머 (Transformer) 디코더입니다.
North Mini Code는 디코더 전용 (decoder-only) 트랜스포머 (Transformer) 기반의 희소 혼합 전문가 (sparse Mixture-of-Experts) 모델입니다. 이 모델은 RoPE를 사용하는 슬라이딩 윈도우 어텐션 (sliding-window attention)과 위치 임베딩 (positional embeddings)이 없는 글로벌 어텐션 (global attention)을 3:1 비율로 교차 배치한 효율적인 어텐션 구현 방식을 사용합니다 [1]. 피드포워드 (feed-forward) 블록은 128개의 전문가 (experts)로 구성된 MoE 블록이며, 토큰당 8개의 전문가가 활성화됩니다. 각 전문가 블록은 SwiGLU 활성화 함수를 사용하는 FFN 블록입니다. 라우터 (router)는 top-k 선택 전에 로짓 (logits)에 시그모이드 (sigmoid) 활성화 함수를 적용합니다. 또한 희소 레이어 (sparse layers) 이전에 단일 밀집 레이어 (dense layer)를 사용합니다.
그림 3: 사후 학습 (post-training) 파이프라인은 소프트웨어 엔지니어링 및 터미널 작업을 대상으로 하는 두 단계의 지도 미세 조정 (supervised fine-tuning, SFT) 단계와 검증 가능한 보상을 활용한 에이전트 강화학습 (agentic reinforcement learning with verifiable rewards, RLVR) 단계로 구성됩니다.
우리는 에이전트 코딩 (agentic coding)에 초점을 맞추어, 2단계의 계층적 지도 미세 조정 (SFT)과 그 뒤를 잇는 검증 가능한 보상을 활용한 강화학습 (RLVR)을 통해 North Mini Code를 사후 학습합니다. 첫 번째 단계의 SFT 데이터는 견고성과 사용성을 위해 더 넓은 혼합 데이터셋 내에 통합된 코딩 능력에 집중합니다. 데이터 혼합 (datamix)에는 프로그래밍, 추론 (reasoning), 그리고 다양한 도메인에 걸친 지시 이행 (instruction following)이 포함되며, 여기서 코드 데이터셋은 학습 가능한 토큰의 70%, 에이전트 도구 사용 (agentic tool-use) 데이터의 43%, 그리고 단일 턴 (single-turn) 경쟁적 또는 과학적 프로그래밍 데이터의 27%를 차지합니다. 두 번째 단계의 SFT에서는 에이전트 및 추론 중심의 샘플로만 구성된 45억 토큰의 데이터 혼합을 사용하며, 여기서 코드 데이터는 학습 가능한 토큰의 61%를 형성합니다. 이 혼합물은 도구 호출 (tool calls)과 완성 (completions)이 실행 가능하고 정확한 것으로 검증된, 코딩 및 광범위한 에이전트 작업 전반에 걸친 최고 품질의 데이터로 구성됩니다.
우리의 내부 데이터 파이프라인은 컨테이너화된 에이전트 코딩 환경 (containerised agentic coding environments)에 크게 의존합니다. 우리는 합성 SFT (Supervised Fine-Tuning) 데이터 생성 및 RLVR (Reinforcement Learning from Verifiable Rewards)에 사용하기 위해 이러한 환경의 별도 하위 집합을 유지 관리합니다. 대부분은 실제 저장소 (repositories)의 소프트웨어 엔지니어링 작업에 기반하며, 나머지는 오픈 소스 및 내부 데이터 세트에서 가져온 터미널 기반 에이전트 작업입니다. 총합하여, 우리는 약 5,000개의 고유 저장소에 걸쳐 7만 개 이상의 검증 가능한 작업을 사용했습니다. 우리는 평가 중 소스 누출 (source leakage)을 방지하기 위해 SWE-Bench [2] 및 SWE-Bench-Pro [3]의 저장소 소스와 대조하여 환경의 중복을 제거했습니다 [4].
우리는 SFT의 첫 번째 및 두 번째 단계에 각각 64K 및 128K 컨텍스트 길이 (context lengths)를 사용했습니다. 이러한 "긴 것에서 더 긴 것으로 (long-to-longer)" 이어지는 캐스케이드 (cascade) 방식 ([5, 6]과 유사)은 가치 있는 짧은 데이터에 대한 이분법적 훈련 (bipartite training)을 가능하게 하여 견고한 성능 베이스라인을 구축한 다음, 고품질로 검증된 샘플에 대해서만 타겟팅된 긴 컨텍스트 훈련을 수행할 수 있게 합니다. 다단계 훈련이 없었다면, 초기 훈련 단계의 20B 비코드 토큰 (non-code tokens)이 이후 훈련 단계의 1.5B 고품질 코드 데이터 토큰을 압도하여, 단계 간 데이터 트렌드 차이로 인해 더 낮은 성능과 더 높은 행동 충돌 (behavioral conflicts)을 초래했을 것입니다. 경험적인 사례로, 거의 완전한 길이 분포를 가진 샘플로 훈련하는 것이 64K까지만 잘린 분포로 훈련하는 것보다 평가 시 더 짧은 최종 궤적 (trajectories)을 생성했습니다.
SFT (Supervised Fine-Tuning) 과정에서 North Mini Code를 정량적 지표에 맞춰 최적화하는 대신, 우리는 SFT를 엄격하게 *RLVR (Reinforcement Learning from Verifiable Rewards)을 위한 프라이밍 (priming)*으로 사용하는 접근 방식을 채택했습니다. 데이터 혼합 (data mixture)은 다운스트림 단계에서의 샘플링 다양성(sampling diversity)과 pass@K (높은 K 값 기준)를 최적화합니다. 우리는 샘플 수준의 필터링을 사용하여 잘못된 도구 호출 (invalid tool calls), 오류가 있는 공백 생성 (erroneous whitespace generation), 잘못된 형식의 특수 토큰 (malformed special tokens), 또는 환각된 인용 (hallucinated citations)과 같은 병리적 현상 (pathologies)을 제거합니다. 바람직하지 않은 RLVR 동작(예: 낮은 엔트로피, 잘못된 구조화된 생성)을 유발하는 아티팩트(Artifacts)나 하이퍼파라미터는 절제 연구 (ablations)를 통해 제거되었습니다. 최종 SFT 모델은 SWE-Bench Verified [2]에서 80.2%의 pass@10를, Terminal-Bench v2 [7]에서 55.1%의 pass@10를 달성했습니다.
하네스 (Harness)의 견고함은 에이전트가 다양하고 예측 불가능한 도구 환경에 직면하는 실제 소프트웨어 개발 환경에서 모델의 사용성을 향상시킵니다. 이러한 환경은 단순히 프롬프팅 (prompting)뿐만 아니라 근본적인 도구 사용 양식 (tool-use modality)에서도 차이가 납니다. 예를 들어, SWE-Agent [8]는 특화된 명령 (bash, str_replace_editor, submit 도구)과 템플릿화된 관찰값 (templated observations)을 갖춘 비교적 풍부한 에이전트-CLI 인터페이스를 노출합니다. mini-SWE-agent [9]는 이를 단일 bash 도구로 축소하여 셸(shell)의 가공되지 않은 표준 출력 (raw stdout)만을 유일한 피드백으로 사용하며, OpenCode [10]는 구조화된 JSON 응답을 반환하는 세분화된 개별 유형 도구 (edit, grep, todowrite, task 등)를 사용합니다.
그림 4: 다양한 에이전트 코딩 하네스 (agentic coding harnesses)를 구동하기 위해, North Mini Code는 두 번째 SFT 단계 동안 다양한 코딩 하네스에 노출됩니다.
우리는 두 번째 SFT (Supervised Fine-Tuning) 단계 동안 소량의 추가적인 벤치마크 하네스 (harness) 데이터(선택된 SWE-Agent 하네스의 50%와 비교하여 SFT 혼합 데이터의 6%)를 도입함으로써 하네스 간 일반화 (cross-harness generalization) 문제를 해결합니다. 구체적으로, 이러한 데이터 혼합은 SWE-Bench Verified에서 SWE-Agent의 성능을 유지하면서도 OpenCode 하네스를 사용한 평가에서 10%의 성능 향상을 가져왔으며, 이는 벤치마크 성능을 저하시키지 않고도 저렴한 비용으로 하네스 간 전이 (cross-harness transfer)를 달 수 있음을 보여줍니다. 특히, North-Code-Mini는 mini-SWE-Agent를 사용하여 61.0%의 pass@1을 달성했는데, 이러한 개선은 교차 작업 (cross-task) 및 교차 하네스 (cross-harness) 설정에서 별도의 비용 없이 나타났습니다. 이는 도구 기능이 중첩되는 하네스들이 긍정적인 전이를 위한 충분한 표현 구조 (representational structure)를 공유하고 있음을 시사합니다. 또한 우리는 하이브리드 하네스 데이터로 학습할 때 데이터 충돌 (data conflict)이 최소화됨을 관찰했으며, 이는 서로 다른 하네스에 요구되는 기술들이 대개 모순되기보다는 상호 보완적임을 나타냅니다.
마찬가지로, 공식 Terminal-Bench는 자체적인 Terminus 2 하네스를 사용하며, 여기서 모든 에이전트-CLI 상호작용은 (네이티브 도구 호출 (native tool calling) 대신) 일반 텍스트 채팅 턴을 통해 전달됩니다. 우리 모델을 Terminus 2에 적응시키기 위해, 우리는 데이터 혼합물에 일반 텍스트 형식의 소량의 데이터(20% 미만)를 포함시켰으며, 이는 모델이 자연스럽게 일반화하기에 충분한 것으로 증명되었습니다. 흥미롭게도, 우리는 모델이 단순히 이해 없이 고정된 템플릿을 그대로 읊는 것이 아니라 지시 사항과 행동 사이의 연결을 적절히 확립하도록 강제하기 위해, 다양한 하네스에 충분한 변형을 도입하는 것(데이터 증강 (data augmentation)과 유사함)이 매우 중요하다는 것을 발견했습니다. 이는 특히 하네스들이 서로 유사해 보일 때 더욱 중요합니다.
코딩 에이전트 (Coding-agent)의 롤아웃 (rollouts)은 길이가 길고 변동성이 매우 큽니다. 가장 느린 궤적 (trajectories)은 통상적으로 중앙값보다 한 자릿수(an order of magnitude) 더 깁니다. 동기식 강화학습 (RL) 루프를 사용하면 매 배치 (batch)마다 해당 시도들이 생성될 때까지 트레이너 (trainer)가 유휴 상태로 대기하게 되므로, 우리는 샘플링 (sampling)과 학습 (learning)을 분리합니다. 즉, 트레이너는 롤아웃을 지속적으로 제공하는 vLLM 사이드카 (sidecar)와 함께 실행됩니다. 정책 가중치 (Policy weights)는 학습 단계가 몇 번(K=4) 진행될 때마다 vLLM으로 내보내지므로, 샘플러 (sampler)는 어느 순간에도 기껏해야 약간의 오프-폴리시 (off-policy) 상태일 뿐입니다. 이후 잔차 불일치 (residual mismatch)는 손실 (loss) 단계에서 교정됩니다.
가장 긴 롤아웃을 기다리느라 학습 프로세스가 차단되는 것을 방지하는 동시에, 작업 간 데이터 분포의 불균형을 피하기 위해 우리는 윈도우 기반 (windowed) 선입선출 (FIFO) 큐 (트레이너↔샘플러) [11]를 사용했습니다. 큐의 앞부분에 있는 작은 비율은 뒤처지는 데이터 (stragglers)를 처리하기 위해 완료 순서대로 소비되며, 나머지는 입력 순서를 유지합니다. 경험적으로, 이는 훈련 안정성을 눈에 띄게 저해하지 않으면서 완료 순서 방식 (completion-order scheme)의 처리량 (throughput) 대부분을 회복합니다.
우리는 토큰 수준의 중요도 샘플링 (importance sampling) 교정이 포함된 로그 가능도 (log-likelihood) 목적 함수인 CISPO [12]를 사용하여 학습합니다. CISPO는 중요도 가중치 (importance weight)가 확률 비율 (probability ratio)이 아닌 로그 가능도에 곱해진다는 점과, 더 강력한 규제 (regularization)를 통해 RLOO [13]를 강화했다는 점에서 PPO 및 GRPO와 다릅니다. 우리는 손실을 프롬프트 (prompt) 수준이 아닌 토큰 수준에서 집계하므로, 그래디언트 (gradient) 신호는 궤적 길이에 따라 스케일링되며, (대부분의 신용 할당 (credit-assignment) 신호가 존재하는) 긴 에이전트 추적 (agentic traces)이 짧은 것들에 비해 가중치가 낮아지지 않습니다.
단일 멀티 환경 RL 학습 (A single multi-environment RL train) – 우리는 터미널 기반 작업 (Terminal-based tasks)과 소프트웨어 엔지니어링 작업 (software engineering tasks)이라는 두 가지 작업 환경을 아우르는 단일 멀티 환경 온라인 RL (Reinforcement Learning) 학습을 실행합니다. 각 학습 배치 (batch)는 512개의 롤아웃 (rollouts)으로 구성되며, 프롬프트당 8개의 롤아웃이 그룹 크기로 샘플링됩니다. 모든 롤아웃은 128K 토큰의 글로벌 컨텍스트 윈도우 (global context window)를 공유합니다. 작업 복잡도의 차이를 고려하여, 각 작업에는 별도의 에이전트 단계 예산 (agentic-step budget)이 할당됩니다. 이러한 작업별 예산은 RLVR 이전에 수행된 pass@k 필터링을 기반으로 설정되었으며, 이를 통해 예산이 각 작업 분포의 난이도에 적절히 조정되도록 보장합니다. 모델에게 필요 이상으로 큰 턴 예산 (turn budget)을 부여하면 롤아웃에서 불필요한 장황함 (verbosity)과 잦은 단계 전환 (hoppiness)이 발생한다는 것을 관찰했습니다.
터미널 기반 작업의 경우, Harbor의 Tmux 세션 구현 [14]에 기반한 단일 터미널 사용 도구를 사용하는 간단한 ReAct 하네스 (harness)로 에이전트를 구성하는 반면, SWE 작업의 경우 SWE-agent [8] 하네스를 사용합니다. 두 환경 모두 에이전트에게 환경 상태를 인코딩한 사전 구축된 Docker 이미지, 자연어 사용자 프롬프트, 그리고 검증에 사용되는 일련의 유닛 테스트 (unit tests)를 제공합니다. 우리는 내부 데이터셋과 오픈 소스 데이터셋의 조합으로 학습하며, 수용 가능한 pass@k 비율을 가진 문제들만 유지하도록 필터링했습니다. 즉, 너무 쉽게 해결되거나 완전히 해결 불가능한 인스턴스는 제외했습니다. 우리는 유닛 테스트 기반 검증기 (verifier)에서 도출된 이진 보상 (binary rewards)을 사용합니다. 또한, 모델이 잘못된 도구 호출 (tool calls)을 생성하거나 파싱할 수 없는 출력을 생성할 경우 0의 보상을 받게 하여, 첫 학습 단계 내에서 환각 (hallucinated) 또는 잘못된 형식의 도구 호출 비율이 급격히 떨어지도록 했습니다.
그림 5 (Figure 5): 멀티 환경 RL 학습은 SWE-Bench Verified 및 Terminal-Bench v2와 같은 벤치마크에서 모델 성능을 향상시킵니다. 학습 곡선은 왼쪽의 RLVR 학습 과정에 따라 표시됩니다.
온라인 RL을 통한 더 높은 성능과 견고함 – RLVR (Reinforcement Learning from Verifiable Rewards) 학습은 SFT (Supervised Fine-Tuning) 초기화 모델 대비 최종 모델의 성능을 Terminal-Bench v2에서 7.9% (절대치) pass@1, SWE-Bench에서 3.0% (절대치) 향상시켰습니다. 우리는 두 환경을 통합하여 학습하는 것이 각 환경을 개별적으로 학습하는 것보다 더 강력한 결과를 생성하며, 분포 외 (out-of-distribution) 작업에 대해서도 더 나은 일반화 성능을 보인다는 점을 관찰했습니다. 정확도 점수 외에도, RLVR 모델이 더 짧은 궤적 (trajectories)을 생성하고 유효하지 않거나 실패하는 도구 호출 (tool calls)을 줄임으로써 에이전트의 견고함 (robustness)이 크게 개선됨을 확인했습니다. 최종 모델은 또한 도구 호출 루핑 (tool-call looping)이 덜 반복적이며, 솔루션을 제출하거나 사용자에게 응답함으로써 궤적을 안정적으로 마무리하는 모습을 보입니다.
기존 코딩 벤치마크를 보완하기 위해, 우리는 또한 인간 어노테이터 (human annotators)와의 쌍체 평가 (pairwise evaluation)를 통해 분포 외 (out-of-distribution) 문제에 대한 모델 성능을 측정하는 자체 내부 벤치마크 제품군을 개발했습니다. 다른 벤치마크 설정과 마찬가지로, 우리는 Harbor를 통해 OpenCode에 활용된 모델의 반복 버전들을 평가했습니다. 모델 성능을 이해하기 위해, 우리는 네 가지 별개의 기능에 대해 벤치마크를 수행합니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Hugging Face Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기