Rust/WASM으로 서브밀리초 벡터 데이터베이스 구축
Source: Dev.to
Overview
EdgeVec은 WebAssembly를 사용해 브라우저 내에서 완전히 실행되는 고성능 벡터 데이터베이스입니다. 서브밀리초 수준의 검색 시간을 달성하여 서버 없이도 클라이언트‑사이드 의미 검색, RAG, 추천 기능을 구현할 수 있습니다.
Performance
| Vectors | Float32 Search | Quantized (SQ8) Search |
|---|---|---|
| 10 k | 203 µs | 88 µs |
| 50 k | 480 µs | 167 µs |
| 100 k | 572 µs | 329 µs |
이러한 지연 시간은 서버‑사이드 솔루션과 비슷하지만 완전히 클라이언트‑사이드에서 실행됩니다.
Implementation Details
Algorithm
EdgeVec은 Hierarchical Navigable Small World (HNSW) 그래프를 사용합니다. 이는 Weaviate와 Qdrant와 같은 상용 벡터 데이터베이스에서도 사용되는 알고리즘입니다.
Quantization
32‑bit 부동소수점(768 차원 × 4 바이트 ≈ 3 KB per vector)을 저장하는 대신, 벡터를 8‑bit 정수로 압축합니다. 이로 인해 3.6배 메모리 감소가 이루어지며 정확도에 미치는 영향은 최소에 불과합니다.
SIMD Optimization
- Native (x86_64): AVX2 명령어
- WebAssembly:
simd128지원 시 사용
Rust의 포터블 SIMD를 활용해 거리 계산을 벡터화함으로써 위에 표시된 서브밀리초 수준의 쿼리 시간을 제공합니다.
Build Size
wasm-pack으로 컴파일한 최종 번들은 gzipped 148 KB에 불과해 어느 웹 애플리케이션에도 충분히 작습니다.
Where Client‑Side Vector Search Makes Sense
- Privacy – 임베딩이 디바이스를 떠나지 않습니다.
- Latency – 네트워크 왕복이 없습니다.
- Offline – 인터넷 연결 없이 동작합니다.
- Cost – 서버 비용을 없앨 수 있습니다.
브라우저 확장 프로그램, 로컬‑퍼스트 앱, 프라이버시‑보호 RAG 파이프라인에 이상적입니다.
Usage Example
import init, { EdgeVec, EdgeVecConfig } from 'edgevec';
await init();
const config = new EdgeVecConfig(768);
const index = new EdgeVec(config);
// Insert a vector
index.insert(new Float32Array(768).fill(0.1));
// Perform a search
const results = index.search(query, 10);
// results: [{ id: 0, score: 0.0 }, ...]
Resources
- GitHub:
- npm:
npm install edgevec
Alpha release – feedback welcome!