facts
이번에 공개된 Ternlight는 서버 호출 없이 브라우저 내부에서 텍스트 임베딩과 유사도 검색을 수행하는 도구다. 엔진, 모델, BERT 토크나이저를 단일 .wasm(WebAssembly) 파일에 통합해 런타임 시 별도의 fetch 과정이나 postinstall 단계 없이 즉시 실행된다.
모델은 성능과 크기에 따라 두 가지 티어로 제공된다. 품질 중심의 `@ternlight/base`는 gzip 기준 7.2MB의 크기를 가지며, 소형·고속 티어인 `@ternlight/mini`는 5.0MB의 크기로 제공된다. 두 모델 모두 384차원의 L2 정규화된 Float32Array를 출력하며, 최대 입력 길이는 128 토큰(약 95단어)으로 제한된다.
제공되는 핵심 API는 세 가지 프리미티브로 구성된다.
- `embed`: 문자열을 입력받아 임베딩 벡터를 반환한다.
- `cosineSim`: 두 임베딩 벡터 간의 코사인 유사도를 계산한다.
- `similar`: 코퍼스 내에서 최근접 이웃 검색을 수행하며, `topK` 옵션을 통해 결과 개수를 지정할 수 있다.
지원 환경은 Node.js 18 버전 이상을 비롯해 일반 브라우저(번들러 경유), Cloudflare Workers, Vercel Edge, Deno, Bun이다. 각 환경에 최적화된 로더로 자동 라우팅되어 동작한다.
how-it-works
Ternlight의 핵심은 `all-MiniLM-L6-v2` 모델을 교사 모델로 삼아 증류(Distillation)하고, BitNet b1.58 스타일의 양자화 인지 학습(QAT, Quantization-Aware Training)을 적용한 점에 있다. 이를 통해 모델 크기를 약 30배 압축하면서도 정확도 손실을 최소화했다.
가장 중요한 기술적 특징은 삼진 가중치(Ternary weights)의 도입이다. 모든 가중치를 -1, 0, +1 중 하나로 제한하여, 기존의 복잡한 부동소수점 곱셈 연산을 단순한 덧셈과 뺄셈으로 대체했다. 모델 설계 단계부터 삼진 모델로 학습되었기에 양자화 이후에도 품질을 유지할 수 있다.
추론 엔진은 Rust로 작성되어 WASM SIMD(Single Instruction, Multiple Data)로 컴파일되었다. 이를 통해 CPU의 벡터 명령어를 활용해 덧셈과 뺄셈 연산을 병렬 처리하며, GPU나 NPU 없이 CPU만으로 고속 추론이 가능하다.
M 시리즈 Mac의 Node/V8 환경에서 측정된 성능 지표는 다음과 같다.
- **@ternlight/mini**: p50 지연시간 2.5ms, 단일 스레드 처리량 약 400 emb/s, Spearman 상관계수 0.820, SciFact NDCG@10 0.439. 아키텍처는 2-layer, d_model=256, 4 heads, 파라미터 약 9.5M이다.
- **@ternlight/base**: p50 지연시간 5.1ms, 단일 스레드 처리량 약 195 emb/s, Spearman 상관계수 0.844, SciFact NDCG@10 0.465. 아키텍처는 2-layer, d_model=384, 6 heads, 파라미터 약 15.4M이다.
implementation-impact
개발자는 이제 시맨틱 검색 기능을 구현할 때 별도의 추론 서버를 구축하거나 외부 API를 호출할 필요가 없다. `npm install @ternlight/base` 명령어로 패키지를 설치한 뒤, 다음과 같이 즉시 사용할 수 있다.
import { embed, similar } from '@ternlight/base';
const recipes = [ /* 임베딩된 문서 리스트 */ ];
const results = similar('easy weeknight dinner ideas', recipes, { topK: 3 });실무 관점에서 가장 큰 변화는 네트워크 왕복 시간(Round-trip time)의 제거다. 사용자가 타이핑하는 즉시 결과를 보여주는 'Search-as-you-type' 기능을 구현할 때, 어떤 네트워크 호출보다 빠른 응답 속도를 확보할 수 있다. 또한 쿼리와 문서가 사용자의 기기를 벗어나지 않으므로, 데이터 처리 계약이나 유출 위험이 있는 프라이버시 민감 애플리케이션에 적합하다.
인프라 운영 측면에서는 Cloudflare Workers나 Vercel Edge 같은 엣지 런타임에서 요청 핸들러와 임베딩 모델을 동일한 위치에 배치할 수 있어, 아키텍처가 단순해지고 지연시간이 줄어든다. 특히 ARM 코어에서 덧셈/뺄셈 연산이 효율적으로 실행되므로 Raspberry Pi와 같은 IoT 하드웨어나 저사양 키오스크에서도 GPU 없이 시맨틱 검색을 구동할 수 있다.
도입 시 고려할 트레이드오프는 모델 티어 선택이다. 처리 속도와 번들 크기가 최우선이라면 `@ternlight/mini`를, 검색 정확도와 품질이 중요하다면 `@ternlight/base`를 선택해야 한다. 두 티어는 동일한 API를 공유하므로 설정 변경만으로 교체가 가능하다.




