Cactus-Compute/needle3
Needle 3 — 모바일·임베디드 기기를 위한 초소형 도구 호출 모델
Needle 3는 모바일, 웨어러블, 로봇, 스마트홈, 자동차, 마이크로컨트롤러에서 도구 호출과 구조화된 데이터 추출, 텍스트 임베딩을 처리하는 온디바이스 모델입니다. 전체 모델 파일은 8~29MB이며, 2~20개 레이어 서브네트워크를 각 기기에 맞춰 배포하고 LoRA로 제품별 도구를 튜닝할 수 있습니다.
- 주제
AI 요약
Needle 3는 일반 대화 능력을 줄이고 온디바이스 작업에 맞춘 foundation model입니다. 모바일 앱이나 임베디드 기기가 노출한 함수 목록에서 필요한 도구를 고르고, 사용자의 요청에서 각 인자를 채워 함수 호출을 만듭니다. 요청한 작업이 도구 목록에 없으면 추측하지 않고 빈 목록을 반환합니다. 구조화된 추출에서는 스키마를 선언한 뒤 청구서, 예약 정보, 알림, 양식 같은 비정형 텍스트를 타입이 있는 필드로 변환합니다. 스키마에서 만든 byte-level grammar가 토큰 생성을 제한하므로 결과가 JSON 구조를 벗어나지 않습니다. 같은 모델에서 문장 임베딩도 생성해 기기 내부 검색, 매칭, 라우팅에 사용할 수 있습니다.
모델 크기와 평가
전체 모델은 하나의 8~29MB 파일로 배포됩니다. 원문은 일반 대화 모델보다 최대 10배 작은 모델과 비교해 모바일 도구 호출에서 더 높은 성능을 내고, 추출 작업에서는 2~3배 큰 모델과 맞먹는다고 설명합니다. 도구 호출 평가는 전체 테스트 분할의 exact-match accuracy로 측정하고, 구조화 추출은 필드 단위 micro-F1로 측정합니다. 구체적인 비교 결과와 대화형 frontier plot, 구조도, fine-tuning 결과는 Cactus Compute의 Needle 페이지에서 제공합니다.
각 응답은 function_calls, 모델 reasoning, 학습된 head가 계산한 calibrated confidence를 담은 JSON 객체입니다. confidence를 기준으로 요청을 실행하거나, 사용자 확인을 받거나, 거부하는 라우팅을 구성할 수 있습니다. 오프토픽 요청에는 도구를 임의로 선택하지 않고 빈 배열을 반환합니다.
Laddered Simple Attention Network
Needle 3의 구조는 Laddered Simple Attention Network입니다. Feed-forward network 대신 Monarch Hadamard MLP를 사용하고, attention에는 GQA와 causal convolution tap을 결합합니다. engram에는 n-gram 메모리를 저장하고 gather 연산으로 읽습니다. multi-lane hyper-connection도 포함합니다. 학습 단계에서 2층부터 20층까지 모든 깊이를 별도 배포 가능한 모델로 만들도록 구성했습니다.
파라미터 대부분은 engram에 들어갑니다. 원문은 121M 파라미터 모델이 50M 모델에 해당하는 연산량으로 동작한다고 설명합니다. 가중치는 Cactus Quants의 CQ2-bit 형식으로 압축하며, 모델이 생성하는 모든 토큰에는 사용자가 지정한 스키마에서 컴파일한 grammar가 적용됩니다. 저장소에는 20층 needle3.cact 모델, fine-tuning용 needle3.safetensors checkpoint, 플랫폼별 실행 엔진이 들어 있습니다.
기기 배포와 실행 구조
플랫폼별 폴더에는 1MB보다 작은 엔진이 있으며, 시작할 때 needle3.cact를 읽습니다. needle build --platform <folder> [--layers N] 명령은 엔진과 헤더를 내려받고, 지정한 깊이의 모델 가중치를 엔진 옆에 배치합니다. 같은 방식으로 2층부터 20층까지 필요한 서브네트워크를 만들 수 있습니다. C API, CLI runner, browser, WASI, air-gapped 환경을 지원하며, Python 패키지와 소스 코드는 GitHub에서 제공합니다. 모델과 엔진은 한 번 내려받은 뒤 캐시됩니다.
Python에서는 pip install cactus-needle로 패키지를 설치한 뒤 도구 함수를 @needle.tool로 등록합니다. 예를 들어 get_weather(city: str) 함수를 등록하고 Needle(tools=[get_weather])를 실행하면, “지금 라고스 날씨가 어떤가요?”라는 요청을 get_weather 호출과 city: Lagos 인자로 변환합니다. CLI에서는 ./needle --model needle3.cact --tools tools.json --prompt "dim the living room to 30"처럼 실행하거나 --serve 옵션으로 서버를 띄울 수 있습니다.
Fine-tuning과 서브네트워크
Needle는 제품별 도구에 맞춘 fine-tuning을 염두에 두고 설계했습니다. Python 패키지는 20층 frozen base model에 LoRA adapter를 학습합니다. 이후 needle build --layers N이 adapter를 병합하고, 2~20층 범위에서 필요한 서브네트워크를 잘라 4-bit .cact 파일로 내보냅니다. 변환한 모델은 같은 엔진에서 실행합니다.
DroidCall 데이터셋으로 fine-tuning하면 모든 서브네트워크의 점수가 18~36포인트 상승합니다. 4층 이상 서브네트워크는 29M 파라미터부터 DeepSeek V4 Flash를 넘어서는 결과를 냈다고 설명합니다. 출시 모델에 적용한 2-bit post-training과 양자화, Cactus 자체 데이터셋을 활용한 학습은 Cactus Platform에서 수행합니다.
도구 스키마와 컨텍스트 제약
도구는 한 동작에 하나씩 정의하고, 사용자가 실제로 말할 법한 이름을 붙여야 합니다. 인자 형식은 설명에 적고, 허용 범위 같은 제약은 grammar에 넣으며, 호출을 유도할 trigger도 지정합니다. 도구 스키마는 system prompt 및 대화 기록과 같은 모델 컨텍스트를 사용합니다.
needle_init은 성공하면 정적 prefix를 토큰화한 길이를 반환합니다. prefix가 모델의 컨텍스트 한도를 넘으면 실패합니다. C API에서 음수 반환을 받으면 needle_last_error()로 측정된 prefix 토큰 수와 컨텍스트 한도를 확인할 수 있습니다. 이때 도구 설명과 스키마를 줄이거나, 큰 도구 목록을 여러 카탈로그로 나눠야 합니다. 도구를 5개보다 많이 선언하면 매 턴 검색된 도구만 prefix에 남길 수 있습니다. max_new_tokens도 컨텍스트 공간을 미리 예약하므로 생성 상한을 크게 잡을수록 현재 요청과 대화 기록에 쓸 공간이 줄어듭니다.
원문: Hugging Face / 번역·요약: Trawling