벡터 양자화

벡터 양자화 (압축)

벡터 양자화(quantization)는 벡터 임베딩을 압축해 벡터 인덱스의 메모리 사용량을 줄이는 기법이에요. 그 결과 배포 비용이 낮아지고 유사도 검색 속도가 개선됩니다. Weaviate는 네 가지 양자화 기법을 제공해요.

  • BQ(Binary Quantization) — 이진 양자화
  • PQ(Product Quantization) — 곱 양자화
  • SQ(Scalar Quantization) — 스칼라 양자화
  • RQ(Rotational Quantization) — 회전 양자화

출처: 공식문서 - Compression (Vector Quantization)

상황부터 — 왜 양자화가 필요한가

벡터 임베딩은 보통 32비트 부동소수점(4바이트) 으로 저장돼요. 수십억 개 객체를 다루는 규모에선 이 메모리 비용이 상당해집니다. 양자화는 숫자를 더 낮은 정밀도(예: 8비트 정수 1바이트, 또는 이진수)로 표현해 메모리를 줄이는 기술이에요. 일부 기법은 벡터의 차원 수 자체도 줄입니다. 신경망에서 가중치·활성화 값을 32비트 float에서 8비트 int로 낮추는 것과 같은 원리예요.

기본 압축(DEFAULT_QUANTIZATION)

v1.33부터 새 컬렉션에 기본 적용할 양자화를 DEFAULT_QUANTIZATION 환경변수로 정할 수 있어요. 기본은 미설정(압축 미적용)이며, 설정하면(예: 8-bit RQ) 새로 만드는 모든 컬렉션에 적용됩니다. 주의할 점:

  • 한 번 컬렉션에 설정하면 비활성화할 수 없어요.
  • 인덱스 타입이 지원하지 않으면 적용되지 않아요(예: PQ·SQ는 Flat 인덱스 미지원).

BQ — 이진 양자화

BQ는 각 벡터 임베딩을 이진 표현(1비트) 으로 변환해요. 원래 차원당 32비트였던 것을 1비트로 줄여 약 32배 저장 공간 절감을 이룹니다. 고차원 벡터일수록 효과가 커요. Flat 인덱스에서 검색 속도를 높이는 데 특히 유용합니다.

PQ — 곱 양자화

PQ는 hnsw 인덱스에서 쓸 수 있는 다단계 양자화 기법이에요. 각 벡터 임베딩을 두 단계로 줄입니다.

  1. 벡터의 차원을 더 적은 수의 "세그먼트(segment)" 로 축소하고
  2. 각 세그먼트를 원래 비트 수(보통 32비트 float)에서 더 적은 비트로 양자화

PQ에서 원본 벡터는 '세그먼트' 또는 '부분공간(subspace)'이라 부르는 작은 벡터들의 곱으로 표현되고, 각 세그먼트는 독립적으로 양자화돼요. 세그먼트 생성 후 각 세그먼트의 센트로이드(centroid) 를 계산하는 훈련 단계가 이어집니다.

  • 트레이드오프 — PQ는 recall·성능·메모리 사이에서 균형을 맞춰야 해요. 메모리를 줄이면 recall이 낮아질 수 있습니다. PQ 압축을 쓰면 HNSW도 함께 튜닝해서 서로 보완되게 하세요.
  • 인코더 — 코드북(codebook) 센트로이드를 생성하는 인코더는 기본 kmeans(전통 방식)와 tile 두 가지를 지원합니다. encoder.typetile 또는 kmeans로 설정해요.

SQ — 스칼라 양자화

SQ는 각 벡터 차원을 32비트에서 8비트로 줄여요. 데이터에 훈련해 차원별 커스텀 버킷(bucket)을 만들고, 32비트 차원의 정보를 8비트 버킷에 매핑할 때 데이터 특성을 보존하도록 학습합니다.

RQ — 회전 양자화

RQ는 벡터에 빠른 의사 난수 회전(pseudorandom rotation) 을 먼저 적용한 뒤 각 차원을 양자화해요. 회전이 정보를 차원 전체에 고르게 퍼뜨려서, 훈련 단계 없이도 recall을 잘 유지합니다.

  • 8-bit RQ — HNSW 인덱스엔 v1.32, Flat 인덱스엔 v1.35부터 추가. 약 4배 압축을 주면서 내부 테스트 기준 recall 98~99% 유지.
  • 1-bit RQ — HNSW엔 v1.33, Flat엔 v1.35부터 추가. 차원이 늘수록 32배에 가까운 비대칭(asymmetric) 압축. 데이터 벡터는 차원당 1비트(부호만 저장), 쿼리 벡터는 검색 중 차원당 5비트로 스칼라 양자화해, 대칭 방식(BQ)보다 recall이 좋습니다.

요약

  • 양자화는 벡터를 낮은 정밀도로 표현해 메모리와 배포 비용을 줄이고 검색을 빠르게 만듭니다.
  • BQ(1비트)·PQ(세그먼트+센트로이드)·SQ(8비트 버킷)·RQ(회전+비대칭) 네 가지.
  • 인덱스 종류에 따라 지원 범위가 달라요(PQ·SQ는 Flat 미지원).
  • DEFAULT_QUANTIZATION으로 새 컬렉션 기본값을 지정할 수 있지만, 설정하면 끌 수 없어요.

더 알아보기 (Learn more)