Show HN: Needle2: 휴대폰, 웨어러블, 스마트 홈 및 로봇을 위한 14MB 에이전트형 LLM
요약
Needle2는 휴대폰, 웨어러블, 로봇 등 다양한 소형 장치에 최적화된 14MB 에이전트형 LLM입니다. 이 모델은 도구 호출, 구조화된 데이터 추출, 텍스트 임베딩 기능을 제공하여 기기 내에서 복잡한 작업을 수행할 수 있게 합니다. 특히 오프라인 환경에서도 다양한 디바이스를 제어하는 비서 역할을 구현합니다.
핵심 포인트
- 도구 호출: 앱 함수 기반으로 정확하게 도구를 선택하고 인수를 채웁니다.
- 구조화된 추출: 인보이스, 예약 정보 등 지저분한 텍스트에서 필드를 안정적으로 추출합니다.
- 소형 장치 최적화: 14MB 크기의 모델로 휴대폰, 웨어러블 등 다양한 기기에서 구동됩니다.
- 도구 호출(Tool calls)
- 앱이 노출하는 함수들을 기반으로, Needle는 적절한 것을 선택하고 사용자가 말한 모든 인수를 채웁니다. 두 가지를 요청하면 순서대로 두 개의 호출을 받고; 어떤 도구도 커버하지 못하는 것을 요청하면 추측이 아닌 빈 목록을 받습니다.
- 구조화된 추출(Structured extraction)
- 형태(shape)를 선언하고 지저분한 텍스트를 제공하면, 타이핑된 필드를 돌려받을 수 있습니다: 인보이스, 예약 정보, 알림, 양식 등. 디코드 문법(decode grammar)은 출력의 구문 분석을 보장합니다. 추출 기능은 분류 문제에도 잘 일반화됩니다.
- 텍스트 임베딩(Text embedding)
- 동일한 모델이 문장에 대한 벡터를 반환하므로, 앱은 로컬에서 검색하고, 일치시키고, 라우팅할 수 있습니다: 의미하는 메모 찾기, 요청에 가장 가까운 도구 선택, 중복 알림 병합.
제품에서의 구현 예시:
-
스마트 홈(Smart home)
-
버튼을 누르는 것에서 집과 대화하는 것으로 전환됩니다. "침실 조명을 어둡게 하고 잠그기"는 허브를 거치지 않고 오프라인으로 실행되는 두 개의 호출이 됩니다.
-
로봇(Robots)
-
진공청소기나 소형 로봇에게 미묘한 지시를 내릴 수 있습니다: "주방은 청소하되 침실은 비워두기", "작업을 마치면 도크로 돌아가기". 각각이 실행할 수 있는 동작의 순서가 됩니다.
-
휴대폰(Phones)
-
답변하는 대신 기기에서 작동하는 비서입니다: 지난 주말 사진으로 앨범 만들기, 웹사이트 열기, 화면 어둡게 하기, 파일에서 임대차 계약서 찾기.
-
웨어러블(Wearables)
-
손목 위에서 알림을 구조화된 데이터로 읽습니다: 카드 청구액을 가맹점, 금액, 날짜로; 메시지를 답장으로; 불만을 감성 플래그로.
-
AR 글래스(AR glasses)
-
휴대폰이나 네트워크 연결 없이 짧은 요청만으로 내비게이션 및 주변 검색이 가능합니다.
-
자동차(Automotive)
-
차량 내부의 요청을 통해 기후, 미디어, 내비게이션, 통화가 제어되며, 도구 세트가 고정되어 장거리 대화를 거쳐도 작동할 수 있습니다.
-
컴퓨터(Computers)
-
눈앞의 기기를 평이한 영어로 제어합니다: 이메일 초안 작성하기, 타이머 시작하기, 주소 복사하기, 탭 열기.
-
검색 및 매칭
-
장치에서 벗어나지 않는 임베딩: 노트, 메시지 및 문서에 대한 의미론적 검색; 수백 개의 도구 중 가장 가까운 것에 일치하는 쿼리; 시계에서 병합된 근접 중복 경고.
모델
지능 계단식 구성(Intelligence laddering). Needle 3의 모든 레이어는 단조 증가하는 용량을 가진 서브 네트워크입니다. 개발자는 2개 레이어(2L) 서브 네트워크부터 20개 레이어(20L)까지 적절한 크기를 선택할 수 있습니다. 각 서브 네트워크는 미세 조정(fine-tuning)이 가능하여, 4L은 한 에포크 동안 다운스트림 작업에 맞춰 조정될 경우 DeepSeek V4 Flash와 일치할 수 있습니다. 지능 계단식 구성은 9~29MB의 CQ2-bit 바이너리를 생성하며 광범위한 소형 장치를 지원합니다.
- 입력(Inputs)
- 텍스트 프롬프트, 도구 정의 또는 추출 스키마 추가
- 출력(Outputs)
- 도구 호출 또는 추출이 포함된 구조화된 JSON
- 모델(Model)
- 29-121M 계단식 단순 어텐션 네트워크(Laddered Simple Attention Networks), CQ2 양자화
- 학습(Training)
- 독점적인 구조화된 데이터셋 360B 토큰
- 속도(Speed)
- Raspberry Pi 5에서 400
4k 토큰/초 디코드 및 110k 토큰/초 프리필
- Raspberry Pi 5에서 400
계단식 단순 어텐션 네트워크 (Laddered Simple Attention Networks)
시작하기
Python 패키지를 설치하세요. 추론 엔진은 Hugging Face에서 한 번 가져와 캐시되며, 구축할 것은 없습니다.
pip install cactus-needle
Needle은 도구 설명을 읽어 무엇을 호출하고 인수를 어떻게 채울지 결정하므로, 이를 잘 설명하는 것이 핵심입니다.
Simple: 함수를 장식(decorate)합니다. 시그니처가 인수 유형을 제공하고, 독스트링이 도구 설명이며, run()이 루프를 완성합니다: 모델이 호출을 선택하고, Needle이 사용자의 함수를 실행하며, 결과를 다시 공급하여 results로 첨부된 실행된 도구 결과와 함께 최종 응답을 반환합니다.
패턴별 라우팅(Route by pattern): 설명만으로는 모든 구문을 열거할 수 없을 때, 도구에 triggers를 제공합니다.
각 요청에 대해 정규 표현식(regular expressions)이 일치 여부를 검사합니다. 매칭은 디코드를 매칭된 도구로 제한하고 호출을 요구하므로, 요청이 거부되거나 잘못 라우팅되는 대신 지정한 도구에 도달하게 하며, 신뢰도 임계값(confidence floor) 이하에서도 호출이 전송됩니다. 매칭은 전체 턴(turn)을 제한하므로, 모든 것을 포괄하는 정규식(catch-all)은 다른 도구가 소유한 명사들을 제외해야 합니다. 예: ^(?![\s\S]*\b(lights?|doors?)\b)[\s\S]*\b(turn|switch)\b[\s\S]*\b(on|off)\b
; 그런 다음 "fan을 켜고 주방 조명을 어둡게 해줘"라는 요청은 여전히 두 도구 모두에 도달합니다.
from typing import Literal @needle.tool(triggers=[r"\b(turn|switch|power|flip)\b.*\b(on|off)\b", r"\btoggle\b"]) def control_device(device: str, action: Literal["on", "off", "toggle"]): "Switch or toggle any named smart-home device." return {"device": device, "action": action} agent = needle.Needle(tools=[control_device, get_weather]) agent.complete("toggle the garage door") # function_calls [{"name": "control_device", "arguments": {"device": "garage door", "action": "toggle"}}]
추출 (Extraction): 텍스트에서 구조화된 데이터를 뽑아내려면, 형태를 선언하고 extract()를 호출합니다.
. Pydantic 모델을 전달하면 타입이 지정된 객체를 돌려받습니다.
모든 턴은 하나의 JSON 객체를 반환합니다:
{ "type": "call", "success": true, "error": null, "error_code": null, "function_calls": [ { "name": "set_lights", "arguments": { "room": "living room", "on": true, "brightness": 30 } } ], "reasoning": "'living room' -> room; 'dim' -> on true, brightness 30", "confidence": 0.94, "prefill_tps": 4300.0, "decode_tps": 850.0, "peak_ram_mb": 28.5 }
신뢰도 게이팅 및 라우팅 (Confidence gating and routing): 모든 응답은 보정된 헤드(calibrated head)로부터 confidence 점수를 가지며, 엔진은 이미 0.1의 임계값(floor)을 적용합니다. 이보다 낮으면 호출은 suppressed_calls에 보류되고 function_calls는 비어 있습니다. 이보다 높으면, 그 점수는 라우팅할 수 있는 것입니다: 높으면 즉시 행동하고, 중간 정도면 호출을 보여주며 질문하고, 빈 결과는 거부로 처리합니다. triggers를 가진 도구는
일치하는 요청에 대한 호출을 항상 생성하므로, 점수가 해당 호출을 실행할지 확인할지를 알려줍니다.
r = agent.complete(user_text) calls = r["function_calls"] held = r["suppressed_calls"] if calls and r["confidence"] >= 0.7: execute(calls) # 확신: 행동 실행 elif calls or held: confirm(calls or held, r["reasoning"]) # 불확실: 호출을 보여주고 질문 else: say("I can't do that here") # 할 일 없음: 거절
도구 작성하기: 모델은 스키마를 문자 그대로 읽으므로, 평범한 설명의 좁은 도구가 광범위한 도구보다 효과적입니다. 카테고리보다는 해당 도구가 다루는 동작("방의 조명을 켜거나 끄기")으로 설명하는 하나의 행동당 하나의 도구를 만드세요. 이름에 열거형 옵션(예: action: ["increase", "decrease"])을 사용하고, 동의어는 설명에 포함시키세요. 요청에서 생략할 수 있는 필수 인자에는 default 값을 지정하세요. 기본값이 없고 요청에서도 증거가 없는 필수 인자는 추측하는 대신 누락 처리됩니다. 값 형식은 설명에 넣으세요("City, ST" 또는 "예: T-1042"). 항상 도구 사용이 필요한 의도(intent)에는 triggers를 추가하고, 모든 추가 도구는 오분류의 기회가 되므로 턴당 도구 세트를 작게 유지하세요.
파인튜닝(Fine-tune): Python 패키지가 가장 빠른 방법입니다. 전체 20개 레이어에 고정된 베이스 모델에 LoRA를 적용한 다음, 동일한 엔진에서 실행되는 모든 서브네트워크의 4비트 .cact 파일을 사용하세요.
Cactus 플랫폼
Needle은 맞춤화되도록 설계되었습니다. 그 용량은 사다리 같으며, 단지 2개 레이어와 같이 작은 서브네트워크만으로도 하나의 제품 도구에 파인튜닝되면, 전체 모델이 필요로 하는 장치보다 훨씬 작은 기기에서 최적으로 작동합니다. 용량을 좁고 잘 정의된 작업에 제한하는 것이 그곳에서 최고 수준의 정확도를 달성하게 합니다: DroidCall로 파인튜닝하면 모든 서브네트워크가 18점에서 36점까지 향상되며, 레이어가 4개 이상일 경우 파인튜닝된 서브네트워크는 최소 29M 매개변수를 가진 DeepSeek V4 Flash를 능가합니다 (그림 3).
플랫폼에서 파인튜닝된 모든 서브네트워크
Cactus Platform은 전체 경로를 의미합니다: Cactus 데이터셋, 배포된 모델의 2비트 양자화(quantisation) 기술, 평가 설계 및 추적, 전체 깊이 미세 조정(fine-tunes) 및 데이터셋 관리까지 모두 저희 인프라와 학습 파이프라인에서 처리할 수 있어 직접 구축할 필요가 없습니다.
배포 (Deploy)
모든 배포 대상은 시작 시 needle3.cact 가중치를 로드하는 1MB 미만의 사전 빌드된 엔진을 탑재합니다. needle build는 특정 플랫폼의 엔진을 가져와, 전체 20개 레이어 또는 더 작은 서브 네트워크에 해당하는 가중치를 그 옆에 배치합니다:
| 대상 (Target) | 플랫폼 폴더 (Platform folder) | 배포 항목 (Ships) |
|---|---|---|
| macOS | macos-arm64 | needle CLI, libneedle.a, needle.h |
| ... | ||
needle build --platform |
은 이를 다운로드하여 엔진 옆에 needle3.cact를 배치합니다.
# engine, header and weights for this Mac needle build --platform macos-arm64 # an 8-layer subnetwork for a Pi needle build --platform linux-arm64 --layers 8 --out ./pi # a tuned archive needle build --lora adapter.safetensors --out tuned.cact
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Research의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기