1000만 문서를 4GB 메모리에 담는 오픈소스 벡터 인덱스 '터보벡' 공개
turbovec는 Rust로 작성된 벡터 인덱스로 파이썬 바인딩을 제공하며 깃허브 트렌딩에 올랐다. 1000만 개 문서로 이뤄진 코퍼스는 float32로 저장하면 31GB의 메모리를 차지하는데, turbovec는 같은 데이터를 4GB에 담으면서도 FAISS보다 빠르게 검색한다고 내세운다.
핵심은 구글 리서치가 제안한 TurboQuant 알고리즘이다. 데이터에 의존하지 않는 양자화기로, 왜곡에 대한 섀넌 하한에 부합하며 코드북 학습이나 별도의 train 단계가 필요 없다. 덕분에 벡터를 추가하면 곧바로 인덱싱되는 온라인 인제스트가 가능하고, 코퍼스가 커져도 파라미터 튜닝이나 재구축 과정이 없다.
속도 면에서는 손으로 작성한 NEON(ARM)·AVX-512BW(x86) 커널을 쓴다. ARM에서는 FAISS IndexPQFastScan을 12~20% 앞서고, x86에서는 대등하거나 앞선다. 공개된 벤치마크에서 ARM은 모든 설정에서 12~20% 빨랐고 x86은 모든 4비트 설정을 1~6% 능가했으나, d=1536과 d=3072의 2비트 멀티스레드 설정만 FAISS보다 2~4% 뒤졌다.
정확도 비교는 FAISS IndexPQ(LUT256, nbits=8)를 기준으로 했다. 10만 개 벡터에 k=64 조건에서, OpenAI 임베딩 d=1536과 d=3072에서는 TurboQuant가 R@1 기준 0.4~3.4포인트 앞섰고 k=4에서 양쪽 모두 1.0으로 수렴했다. 저차원인 GloVe d=200에서는 4비트에서 0.3포인트 앞서고 2비트에서는 1.2포인트 뒤졌으나, k가 16 부근에 이르면 FAISS를 따라잡았다.
검색 단계에서 id 허용목록이나 슬롯 비트마스크를 넘기면 커널이 이를 직접 반영한다. 필터링은 SIMD 커널 내부에서 32개 벡터 블록 단위로 처리돼, 허용된 슬롯이 없는 블록은 점수 계산 전에 건너뛴다. 그 결과 허용 집합이 작은 선택적 필터에서는 SIMD 비용 대부분을 회피하면서도 허용된 집합에서 최대 k개의 결과를 돌려준다.
turbovec는 관리형 서비스 없이 완전히 로컬에서 동작해 데이터가 사용자의 기기나 VPC를 벗어나지 않는다. 오픈소스 임베딩 모델과 함께 쓰면 완전히 망분리된 RAG 스택을 구성할 수 있어, 프라이버시·메모리·지연이 중요한 환경을 겨냥한다.
압축 원리는 각 벡터를 고차원 초구면 위의 방향으로 보는 데서 출발한다. 먼저 벡터의 길이를 떼어 별도 실수로 저장해 단위 방향만 남기고, 모든 벡터에 같은 무작위 직교 행렬을 곱한다. 회전 후에는 각 좌표가 입력 데이터와 무관하게 알려진 베타 분포를 따르고, 고차원에서는 N(0, 1/d) 가우시안에 수렴한다.
이어 좌표마다 이동과 배율 두 값을 맞추는 보정을 첫 추가 때 한 번 수행해 이후 재학습 없이 재사용하며, GloVe 2비트처럼 분포가 가장 많이 어긋나는 경우 회상률을 @1에서 최대 1.4%포인트 끌어올린다. 분포가 알려져 있으므로 Lloyd-Max 스칼라 양자화로 2비트는 4개, 4비트는 16개 버킷 경계를 평균제곱오차가 최소가 되도록 미리 계산한다. 각 좌표를 작은 정수로 바꿔 촘촘히 비트패킹하면 1536차원 벡터가 6,144바이트에서 384바이트로 16배 압축된다.
turbovec는 pip install turbovec로 설치하며, 삭제 후에도 안정적인 외부 id가 필요하면 IdMapIndex로 id 기반 O(1) 삭제를 쓸 수 있다. LangChain·LlamaIndex·Haystack·Agno용 드롭인 교체 패키지를 제공해 기존 파이프라인에서 import만 바꿔 끼울 수 있고, Rust에서는 cargo add turbovec로 같은 인덱스를 사용한다.