768차원 임베딩 1,000만 개를 4GB로 압축해 FAISS보다 4.4배 빠르게 검색하는 방법
수십 기가바이트의 메모리가 필요했던 대규모 임베딩 데이터를 4GB로 줄이고, 검색 속도를 높이는 것이 가능해졌습니다. turbovec은 벡터를 2비트나 4비트로 압축해 저장하고, 그 압축된 형태 그대로 검색하는 프로세스 내 인덱스 라이브러리입니다. 학습 단계 없이 벡터를 추가하면 즉시 검색에 참여하며, 데이터가 프로세스 밖으로 나가지 않아 오프라인 환경에서도 사용할 수 있습니다.
압축된 데이터로 직접 검색하는 원리
turbovec은 Google Research의 TurboQuant 알고리즘을 기반으로 벡터를 2비트 또는 4비트로 압축합니다. 압축된 데이터를 SIMD 명령어로 직접 검색하므로 복원 과정이 필요 없습니다. 벡터를 추가하면 즉시 검색 대상이 되고, 삭제는 마이크로초 단위로 처리됩니다. sync(path)를 호출하면 변경된 부분만 파일에 기록하며, 이는 크래시 안전성을 보장합니다. Python과 Rust 모두 동일한 API를 제공하며, LangChain, LlamaIndex, Haystack, Agno 등 주요 프레임워크와의 통합 패키지도 지원합니다.
벤치마크로 확인한 성능 수치
100만 개의 OpenAI 임베딩(d=1536, d=3072)과 GloVe(d=200) 데이터를 사용해 FAISS와 비교했습니다. 4비트 압축 시 검색 속도는 ARM에서 4.0배, x86에서 4.9배 빠르고, 2비트에서는 각각 2.05배, 2.35배 빠릅니다. 메모리 사용량은 4비트 기준 float32 대비 7.8배, 2비트 기준 15.5배 적게 듭니다. 정확도(Remember@1)는 4비트에서 0.959~0.981, 2비트에서 0.901~0.931로 FAISS와 유사한 수준을 유지합니다. 특히 100만 개 벡터에서 쿼리당 0.13~0.25ms의 지연 시간을 기록했으며, 이는 코어 8개를 모두 사용했을 때의 수치입니다.
적용 전 확인해야 할 한계
turbovec은 모든 벡터를 스캔하는 방식이므로, 수억 개 이상의 벡터에서 엄격한 지연 시간 제한이 필요한 경우 HNSW나 IVF 인덱스가 더 적합합니다. 양자화 특성상 정확도가 떨어질 수 있으며, 4비트 기준 OpenAI 데이터에서 96~98%의 정확도를 보이지만 저차원 임베딩에서는 더 큰 손실이 발생할 수 있습니다. 또한 네트워크 API나 복제 기능이 없는 순수 라이브러리이므로, 서버 기능이 필요하면 다른 스택과 결합해야 합니다. 벡터 차원은 8의 배수여야 하며, 최대 16,384차원까지 지원합니다. 자신의 데이터 샘플로 정확도를 미리 확인하는 것이 중요합니다.