turbovec Python 바인딩을 사용하여 Rust로 작성된 오픈 소스 프로세스 내 벡터 인덱스입니다. Google Research의 TurboQuant 접근 방식을 구현하여 별도의 코드북 훈련 단계 없이 밀집된 벡터를 압축한 다음 아키텍처별 SIMD 커널로 압축된 코드를 검색합니다. 실용적인 매력은 온라인 수집, 2비트 또는 4비트 스토리지, 지속성, 안정적인 외부 ID, 삭제 지원, 허용 목록 필터링 검색 및 일반적인 RAG 프레임워크용 어댑터의 조합입니다.
정확하게 분류하는 것이 중요합니다. turbovec은 호스팅 벡터 데이터베이스나 완전한 검색 서비스가 아닌 인덱스 라이브러리입니다. 그 자체로는 분산 복제, 다중 노드 샤딩, 백업, 인증, 테넌트 관리, 네트워크 APIs, 하이브리드 어휘 검색, 관찰 가능성 또는 제어 평면을 제공하지 않습니다. 팀은 주변 문제를 소유하는 대가로 로컬 제어 및 메모리 효율성을 얻습니다.
TurboQuant 압축 작동 방식
기본 통찰력은 무작위 직교 회전이 고차원 단위 벡터의 좌표가 예측 가능한 분포를 따르도록 한다는 것입니다. turbovec은 먼저 각 벡터의 노름을 방향에서 분리합니다. 하나의 공유 무작위 회전을 적용한 다음 미리 계산된 Lloyd–Max 버킷을 사용하여 회전된 좌표를 양자화합니다. 2비트는 좌표당 4개의 값을 제공합니다. 4비트는 16개를 제공합니다. 코드는 비트 패킹되어 있으며 벡터별 수정을 통해 양자화로 인해 발생하는 체계적인 내부 곱 축소가 제거됩니다.
프로젝트는 TQ+ 보정을 추가합니다. 첫 번째 추가 시 경험적 분위수를 사용하여 각 좌표의 이동 및 배율을 추정한 다음 나중에 수집하기 위해 해당 값을 고정합니다. 이는 기존의 제품 양자화 교육과 동일하지 않지만 첫 번째 배치가 교정에 영향을 미칩니다. 따라서 작거나 대표성이 없는 첫 번째 추가는 잘못된 생산 초기화가 될 수 있습니다. 대표 샘플 및 테스트 분포 드리프트를 사용하여 인덱스를 시드합니다.
| 무대 | 저장 또는 계산 | 운영상의 결과 |
|---|---|---|
| 정규화 | 단위 방향 + 원래 노름 | 각도 구조를 양자화하면서 크기를 보존합니다. |
| 무작위 회전 | 공유 직교 변환 | 임의의 입력 데이터에서 좌표 분포를 예측 가능하게 만듭니다. |
| TQ+ 교정 | 첫 번째 추가 시 학습된 좌표별 이동 및 크기 조정 | 유한/저차원 동작을 개선합니다. 대표 초기화가 필요합니다 |
| Lloyd–Max 양자화 | 2비트 또는 4비트 좌표 코드 | 데이터세트에 따른 재현율 손실로 인한 대규모 메모리 감소 |
| 길이 수정 | 벡터당 하나의 스칼라 | 하향 편향된 내부 제품 추정치를 수정합니다. |
| SIMD 검색 | 압축된 코드에 대한 순환 쿼리 및 조회 테이블 점수 매기기 | 완전한 감압을 피합니다. 성능은 CPU 아키텍처에 따라 다릅니다. |
마케팅 지름길이 없는 메모리 수학
1,536차원 float32 벡터는 원시 좌표로 6,144바이트를 사용합니다. 해당 좌표 코드에는 메타데이터 이전에 2비트에서 384바이트 또는 4비트에서 768바이트가 필요합니다. 이는 좌표 페이로드가 이론적으로 16배 또는 8배 감소한 것입니다. 저장소의 헤드라인에는 약 31GB를 차지하는 천만 개의 문서 float32 코퍼스가 약 4GB에 들어갈 수 있다고 나와 있습니다. 해당 예는 특정 차원과 표현을 반영하므로 모든 자료에 일반화되어서는 안 됩니다.
용량 계획에는 외부 ID, 벡터별 수정/표준 값, 교정 데이터, 정렬, 할당자 오버헤드, 삭제된 슬롯, 애플리케이션 메타데이터, 쿼리 버퍼 및 원본 문서 저장소를 추가해야 합니다. 임베딩이 RAG 메모리 전체를 차지하는 경우는 거의 없습니다. 실제 지속형 인덱스를 로드하고 동시 쿼리를 제공한 후 상주 세트 크기를 측정합니다.
API이 지원하는 것
numpy를 np로 가져오기
turbovec에서 IdMapIndex 가져오기
인덱스 = IdMapIndex(dim=1536, bit_width=4)
index.add_with_ids(벡터.astype(np.float32), ids.astype(np.uint64))
점수, 결과_ID = index.search(query.astype(np.float32), k=10)
index.remove(document_id)
index.write("corpus.tvim")
복원됨 = IdMapIndex.load("corpus.tvim")
Python API은 float32가 아닌 벡터를 자동으로 변환하는 대신 의도적으로 거부합니다. 내부 슬롯은 삭제 및 유지 관리 후에 변경될 수 있으므로 안정적인 ID가 중요합니다. 지속성 덕분에 로컬 다시 시작이 실용적이기는 하지만 애플리케이션에는 여전히 원자성 게시, 체크섬, 백업/버전 정책 및 라이브러리 업그레이드 전반의 호환성 테스트가 필요합니다.
필터링된 검색은 의미 있는 차별화 요소입니다.
다중 테넌트, 기간 또는 권한 인식 검색의 경우 애플리케이션은 먼저 SQL, BM25, ACL 서비스 또는 다른 시스템에서 허용된 ID 세트를 생성한 다음 turbovec에 해당 후보의 순위를 지정하도록 요청할 수 있습니다. 필터링은 32-벡터 블록 단위로 SIMD 경로 내에서 발생합니다. 빈 블록은 건너뛸 수 있고 허용되지 않는 슬롯은 힙 삽입 전에 거부되므로 선택적 필터를 사용하면 조밀한 점수 작업을 대부분 피할 수 있습니다.
이는 유효한 문서가 너무 적게 반환되고 순위 정보가 유출될 수 있는 글로벌 Top-K를 검색하고 승인되지 않은 결과를 삭제하는 것보다 낫습니다. 허용 목록을 올바르게 구성하고 이를 인증된 테넌트에 바인딩하고 비어 있거나 작거나 거대하고 빠르게 변화하는 세트를 테스트하는 것은 여전히 호출자의 책임입니다. 최종 문서 가져오기에 대한 유일한 인증 확인으로 메타데이터 필터링을 사용하지 마십시오.
게시된 벤치마크를 읽는 방법
| 청구 | 게시된 테스트 경계 | 아직 입증되지 않은 사항 |
|---|---|---|
| FAISS PQ와 경쟁사 리콜 | 100K 벡터, k=64; OpenAI 치수 1536/3072 및 GloVe 치수 200; 일치하는 비트 전송률 | 임베딩 모델, 코퍼스 분포, k, 측정항목 및 관련성 라벨 |
| ARM에서 10~19% 더 빠름 | 저장소 구성의 FAISS IndexPQFastScan에 대한 Apple M3 Max | 기타 Apple 칩, 동시성, 열 상태 및 생산 필터 |
| 경쟁력 있는 x86 속도 | 제온 플래티넘 8481C; 4비트의 경우 승리가 보고되었으며 일부 2비트의 경우 약간의 손실이 보고되었습니다. | CPU 생성, AVX 경로, 코어, NUMA 및 쿼리 배치 |
| 훈련/재구축 없음 | 첫 번째 추가 TQ+ 교정 및 온라인 추가 기능을 갖춘 알려진 분포 양자화기 | 대표성이 없는 첫 번째 배치 또는 대규모 유통 변화의 영향 |
| 필터링된 검색으로 과도한 가져오기 방지 | 블록 채점 및 힙 삽입 내에서 처리되는 허용 목록 | 엔드투엔드 SQL/ACL 비용 및 최악의 비선택적 필터 |
비교 기준은 FAISS입니다. IndexPQ/IndexPQFastScan, 모든 FAISS 인덱스 유형이 아닙니다. 평면적 정확한 검색, HNSW, IVF-PQ, GPU 인덱스 및 관리형 데이터베이스는 재현율, 대기 시간, 메모리 및 운영 곡선의 다양한 지점을 해결합니다. 먼저 리포지토리 벤치마크를 재현한 다음 데이터와 수용 목표를 한 번에 하나씩 대체하십시오.
유용한 RAG 평가 프로토콜
- 임베딩을 고정합니다. 생산을 위해 계획된 정확한 모델, 정규화, 치수 및 거리 규칙을 사용하십시오.
- 기준 진실을 만듭니다. 신뢰할 수 있는 평면 구현을 통해 정확한 상위 k 이웃을 계산하고 작업 관련성 판단을 별도로 유지합니다.
- 두 비트 폭을 모두 테스트합니다. 2비트와 4비트를 서로 비교하는 것이 아니라 float32 또는 정확한 검색을 사용하여 비교합니다.
- 쿼리를 계층화합니다. 일반적인 사례, 희귀한 사례, 다국어 사례, 짧은 사례, 긴 사례, 중복된 사례, 도메인 외부 사례를 포함합니다.
- 운동 섭취. 대표 배치로 초기화하고, 이후 배포판을 추가하고, ID를 삭제하고, 지속하고, 다시 로드하고, 결정적 동작을 확인합니다.
- 벤치마크 필터. 적대적인 블록 레이아웃을 포함하여 0%, 0.1%, 1%, 10%, 50% 및 100% 적용 범위에서 필터 없음 및 허용 목록을 측정합니다.
- 부하 테스트. 실제 동시성에서 p50/p95/p99 대기 시간, 처리량, CPU 사용률, 상주 메모리 및 테일 동작을 기록합니다.
- 답변을 평가해 보세요. 검색 회상, 순위 재지정 품질, 인용 정확성 및 최종 답변 성공 여부를 측정합니다. 더 빠른 근사 이웃은 애플리케이션 결과가 유지되는 경우에만 가치가 있습니다.
결정 지표
| 미터법 | 정의 | 제안된 보고 |
|---|---|---|
| 리콜@k | 근사 검색을 통해 복구된 정확한 상위 k 이웃 | 데이터세트 슬라이스, 비트 폭 및 필터 선택성별 |
| 작업 회상 | 필수 증빙 문서가 검색된 쿼리 | 벡터-이웃 중첩만 단독으로 사용하는 것보다 더 의미 있음 |
| 벡터당 메모리 | RSS 델타 처리/검색 가능한 벡터 로드 | ID, 삭제된 슬롯 및 메타데이터 오버헤드 포함 |
| 꼬리 지연 시간 | p95/p99 엔드투엔드 쿼리 시간 | 현실적인 동시성과 허용 목록 혼합 |
| 비용 업데이트 | 추가, 삭제, 저장 및 다시 로드를 위한 시간 및 최대 메모리 | 최초 추가 교정 및 충돌 복구 포함 |
| 허용된 쿼리당 비용 | 인프라 + 엔지니어링 운영 / 올바른 작업 결과 | FAISS 및 관리형 대안과 비교 |
프레임워크 통합
저장소는 익숙한 인터페이스를 유지하면서 메모리 내 참조 저장소를 대체하는 LangChain, LlamaIndex, Haystack 및 Agno에 대한 어댑터를 문서화합니다. 이를 통해 개념 증명을 빠르게 수행할 수 있지만 "드롭인"은 동일한 채점, 필터링, 삭제, 지속성, 스레딩 또는 실패 의미 체계가 아닌 공용 소프트웨어 표면을 의미합니다. 배포하기 전에 각 프레임워크의 검색 테스트를 실행하고 호환 가능한 버전을 고정하세요.
대안
| 옵션 | 이럴 때 선호하세요 | 트레이드오프 |
|---|---|---|
| turbovec | 처리 중인 로컬 검색, 극도의 압축, 온라인 추가 및 허용 목록 필터링이 워크로드에 적합합니다. | 귀하는 서비스, 복제 및 운영 제어권을 소유하고 있습니다. |
| FAISS | 성숙한 정확한, IVF, PQ, HNSW 또는 GPU 인덱싱 선택이 필요합니다. | 구성 및 교육이 더 많이 포함될 수 있습니다. 메모리는 인덱스에 따라 다릅니다. |
| hnswlib | 컴팩트한 스토리지보다 높은 재현율과 낮은 지연 시간의 그래프 검색이 더 중요합니다. | 그래프 오버헤드는 훨씬 더 많은 메모리를 소비할 수 있습니다. |
| Qdrant, Weaviate 또는 Milvus | 네트워크 서비스, 메타데이터 필터, 복제 및 운영이 필요합니다. | 소규모 임베디드 라이브러리보다 더 많은 인프라와 메모리 |
| 관리형 벡터 데이터베이스 | 팀은 호스팅된 확장, 백업, 인증 및 지원을 원합니다. | 반복되는 비용, 데이터 상주 및 공급업체 종속성 |
| PostgreSQL 및 pgvector | 벡터는 관계형 데이터 및 기존 작업과 밀접하게 유지되어야 합니다. | 대규모의 특수 압축 인덱스와 일치하지 않을 수 있음 |
한계 및 생산 위험
- 대략적인 압축은 특히 공격적인 비트 폭이나 낮은 차원에서 가장 가까운 이웃 순서를 변경할 수 있습니다.
- CPU별 커널은 벤치마크 결과가 ARM, AVX2 및 AVX-512 하드웨어 간에 전송되어서는 안 된다는 것을 의미합니다.
- 첫 번째 추가 교정, 임베딩 모델 변경 및 코퍼스 드리프트에는 명시적인 마이그레이션 테스트가 필요합니다.
- 로컬 배포는 벡터를 사용자가 제어할 수 있도록 유지하지만 암호화, 액세스 제어 또는 보안 백업을 자동으로 추가하지 않습니다.
- 서비스 경계 및 복구 전략을 의도적으로 설계하지 않는 한 프로세스 내 충돌은 호스트 애플리케이션에 영향을 미칩니다.
- 프로젝트는 발전하고 있습니다. 릴리스를 고정하고, 변경 로그/보안 지침을 검사하고, 지속형 인덱스 호환성을 확인하세요.
자주 묻는 질문
turbovec은 벡터 데이터베이스입니까?
아니요. 벡터 인덱스 라이브러리입니다. 애플리케이션은 필요에 따라 문서 저장, 네트워킹, 인증, 복제, 모니터링 및 수명 주기 작업을 제공해야 합니다.
오프라인 교육 단계가 필요합니까?
기존의 코드북 교육을 피하고 온라인 추가를 지원합니다. TQ+은 첫 번째 추가 중에 좌표별 값을 보정하므로 초기화 배치는 여전히 주의를 기울여야 합니다.
2비트 또는 4비트를 선택해야 합니까?
메모리가 바인딩 제약이고 측정된 작업 재현율이 허용 가능한 수준인 경우 2비트를 사용합니다. 4비트는 일반적으로 좌표 코드 저장 공간의 약 두 배로 더 많은 충실도를 구입합니다. 둘 다 벤치마킹하세요.
필터링된 검색은 테넌트 보안을 적용합니까?
순위를 허용 목록으로 효율적으로 제한할 수 있습니다. 애플리케이션은 소스 콘텐츠를 반환하기 전에 올바른 목록을 작성하고 인증을 다시 확인해야 합니다.
FAISS 속도 주장은 보편적입니까?
아니요. 게시된 결과에는 명명된 하드웨어, 데이터 세트, 크기, 비트 너비 및 FAISS PQ/FastScan 구성이 포함됩니다. x86 2비트 결과에는 FAISS이 더 빠른 경우가 포함됩니다.
에어 갭이 가능합니까?
인덱스는 로컬로 실행되며 관리형 서비스가 필요하지 않습니다. 완전한 에어갭 RAG 스택에는 로컬 임베딩, 문서, 패키지/모델 출처 및 제어된 업데이트도 필요합니다.
1차 소스
- turbovec 공식 저장소 및 벤치마크 문서
- turbovec API 참조
- 재현 가능한 벤치마크 스크립트 및 결과
- TurboQuant 연구 논문
- RaBitQ 길이 수정을 위해 인용된 논문
- FAISS FastScan 기술 참조
- turbovec Python 패키지
- turbovec Rust 상자
마지막 검토일: 2026년 7월 25일. 달리 명시하지 않는 한 성능 설명의 범위는 저장소의 게시된 설정으로 제한됩니다. 채택 전에 모델, 하드웨어 및 필터 배포를 포함하여 코퍼스에서 재현합니다.




