제품 양자화는 임베딩을 여러 부분공간으로 나누고 각 부분 벡터를 학습된 소형 중심점 코드로 대체하여 대규모 비공개 벡터 컬렉션을 가속합니다.
이는 더 넓은 벡터 양자화 계열에 속하는 구체적인 메커니즘입니다. 모든 좌표를 독립적으로 줄이는 대신, PQ는 여러 개의 더 작은 코드북을 학습하고 하나의 고차원 임베딩을 코드 ID 시퀀스로 표현합니다. 홈 검색 서버는 메모리에 훨씬 더 많은 코드를 보관하고 사전 계산된 테이블을 사용해 쿼리 거리를 추정할 수 있으므로, 저장되는 벡터 바이트 수와 광범위한 후보 검색 중 필요한 전체 정밀도 연산량을 모두 줄일 수 있습니다.
PQ는 하나의 고차원 임베딩을 여러 부분 벡터로 나눕니다
임베딩의 차원이 `d`라고 가정해 보겠습니다. PQ는 `M`개의 부분 양자화기를 선택하고 좌표를 `M`개의 저차원 블록으로 나누어 각 블록을 독립적으로 모델링할 수 있도록 합니다.
부분 양자화기의 수는 원본 임베딩을 몇 개의 저차원 블록으로 나눌지 결정하며, 하나의 PQ 표현을 구성하는 코드 ID의 개수도 결정합니다.
이러한 분해 방식 때문에 제품 양자화라는 이름이 붙었습니다. 전체 근사는 완전한 벡터를 대상으로 하는 하나의 거대한 코드북이 아니라 여러 부분공간에서 독립적으로 선택한 결과를 조합해 구성됩니다. 부분공간은 벡터 차원을 호환되는 방식으로 나눌 수 있어야 합니다. 부분공간의 크기와 개수는 압축률, 코드북 학습 비용, 거리 정확도, 데이터 분포가 분해된 표현에 얼마나 잘 맞는지에 영향을 줍니다.
각 부분공간은 대표 중심점으로 구성된 코드북을 학습합니다
PQ는 일반적으로 컬렉션을 대표하는 샘플을 사용해 학습합니다. 각 부분공간에서는 클러스터링을 통해 유사한 부분 벡터 그룹을 대표하는 중심 벡터를 찾습니다.
일반적인 제품 양자화기는 k-means를 사용해 각 부분공간의 중심점을 학습하며, 학습 부분 벡터와 할당된 대표값 사이의 근사 오차를 최소화합니다.
학습이 끝나면 데이터베이스는 압축된 검색 코드에 모든 원본 좌표를 저장할 필요가 없습니다. 각 부분공간에서 가장 가까운 중심점의 식별자만 저장하면 됩니다.
학습 샘플이 향후 가정용 문서를 제대로 대표하지 못하면 학습된 중심점이 이후 벡터를 부정확하게 근사할 수 있습니다. 따라서 코드북 품질은 한 번 정하고 무시할 수 있는 세부 사항이 아니라 구현상의 중요한 경계입니다.
저장된 벡터는 짧은 코드 ID 시퀀스로 변환됩니다
각 부분 벡터에 대해 인코더는 가장 가까운 중심점을 찾고 해당 중심점의 인덱스를 저장합니다. `M`개의 인덱스를 이어 붙이면 전체 임베딩의 PQ 코드가 됩니다.
설정 가능한 비트 수를 사용하는 m개의 부분 벡터 코드를 저장하면 긴 부동소수점 배열을 중심점 식별자의 짧은 시퀀스와 공유 코드북으로 대체할 수 있습니다.
예를 들어 부분 양자화기당 8비트를 사용하면 해당 부분공간에서 256개의 중심점 중 하나를 나타낼 수 있습니다. 따라서 전체 벡터 코드는 원본 차원마다 32비트 정밀도를 사용하는 대신 부분 양자화기의 개수에 따라 증가합니다. 코드북과 인덱스 오버헤드에도 메모리가 필요하므로 전체 컬렉션은 코드 바이트만으로 계산한 크기보다 큽니다. 이러한 공유 코드북의 비용이 충분히 분산될 만큼 벡터 수가 많을 때 메모리 절감 효과가 가장 커집니다.
쿼리는 모든 부분공간에 대한 거리 조회 테이블을 생성합니다
쿼리가 들어오면 시스템은 쿼리를 동일한 부분공간으로 나누고 각 코드북의 모든 중심점까지의 거리를 계산합니다. 이 값들이 작은 조회 테이블을 구성합니다.
쿼리-중심점 거리 테이블은 각 부분공간에서 쿼리와 모든 중심점 사이의 거리를 미리 계산하므로, 후보 거리를 전체 벡터 연산 대신 작은 조회 결과를 조합해 계산할 수 있습니다.
저장된 데이터베이스 벡터까지의 거리를 추정할 때 검색 과정에서 모든 전체 좌표를 복원할 필요는 없습니다. 각 코드 ID를 읽고 해당 부분공간의 거리를 조회한 다음 그 값을 합산합니다.
이러한 테이블 기반 경로는 비대칭 거리 계산이라고도 합니다. 데이터베이스 벡터는 양자화된 코드로 표현하는 반면 쿼리는 높은 정밀도로 유지할 수 있기 때문입니다.
소형 코드는 컬렉션이 커질수록 캐시 지역성을 향상합니다
대규모 벡터 검색은 단일 거리 연산의 수학적 복잡도보다 메모리를 통해 후보 데이터를 이동시키는 작업에 의해 제한되는 경우가 많습니다.
짧은 코드를 사용하면 더 많은 후보를 CPU 캐시에 저장할 수 있고 비교당 메모리 대역폭 사용량도 줄어듭니다.
압축 거리 계산 경로는 SIMD에 적합한 테이블 조회로 가속할 수 있습니다. 제품 양자화 검색은 소형 코드를 반복해서 읽고 부분공간 거리를 누적하기 때문입니다.
비공개 홈 컬렉션에서는 이러한 방식이 활성 검색 표현을 RAM에 유지하는 인덱스와 로컬 LLM, 데이터베이스, 파일 시스템 캐시가 메모리를 두고 계속 경쟁하는 인덱스 사이의 성능 차이를 만들 수 있습니다.
컬렉션이 매우 작거나, 메타데이터 필터링으로 모든 쿼리가 소수의 벡터로 줄어들거나, 다른 인덱스 계층이 지연 시간을 지배하는 경우에는 이점이 작아집니다.
PQ는 일반적으로 압축과 속도를 위해 일부 재현율을 희생합니다
중심점 코드는 원본 부분 벡터를 근사하므로 실제 거리가 비슷한 두 후보의 순서가 바뀔 수 있습니다. 일반적으로 압축이 강할수록 후보를 구분하는 데 사용할 수 있는 정보가 줄어듭니다.
제품 양자화를 손실 압축으로 취급하면 그 경계가 분명해집니다. 더 작은 코드는 벡터 메모리를 줄이지만 양자화 오차로 인해 가까운 이웃의 순서가 바뀔 수 있습니다.
부분 양자화기의 수나 비트 수를 늘리면 더 많은 세부 정보를 보존할 수 있지만 각 코드와 조회 구조가 커집니다. 더 작은 코드는 메모리를 더 많이 절약하지만 양자화 오차가 발생할 가능성이 높아집니다. 적합한 설정은 코퍼스에 따라 달라집니다. 서로 유사한 매뉴얼, 중복된 문서 버전, 세밀한 코드 검색에는 다양한 가정용 메모를 대상으로 하는 폭넓은 의미 검색보다 더 높은 정밀도가 필요할 수 있습니다.
소형 코드로 1차 검색 후 전체 정밀도로 재점수화할 수 있습니다
PQ를 사용한다고 해서 최종 결과가 압축 거리 순서를 무조건 신뢰해야 하는 것은 아닙니다. 시스템은 PQ로 더 많은 후보를 검색한 뒤 원본 벡터가 별도로 저장된 후보만 재점수화할 수 있습니다.
의미 기반 벡터 검색에서 PQ는 후보 비교에 사용하는 표현을 바꿀 뿐입니다. 출처 정보, 메타데이터 필터링, 재순위화, RAG는 여전히 해당 벡터 단계와 함께 작동합니다.
이 2단계 방식은 메모리와 연산을 비대칭적으로 사용합니다. 압축 코드는 대규모 후보 공간을 처리하고, 정확한 벡터는 소수의 후보 목록에 대해서만 접근합니다.
제품 양자화는 소형 코드가 작업 집합과 거리 계산에 필요한 데이터 이동량을 크게 줄이면서도 로컬 RAG 시스템에 필요한 근거 품질보다 측정된 재현율을 낮추지 않을 때 비공개 컬렉션을 가속합니다.
기술 및 AI 허브
더 읽어보기

홈 카메라는 클라우드 시간 서비스 없이 이벤트를 동기화할 수 있나요?
클라우드 없이 카메라 시간을 동기화하는 메커니즘 우선 설명, 공유 리소스의 트레이드오프, 쿼리 팬아웃 관련 자주 묻는 질문 3가지, 그리고 실용적인 검증 프로토콜.

로컬 AI 서비스가 추론 전에 손상된 모델 레이어를 감지할 수 있나요?
손상된 모델 계층 감지에 대한 메커니즘 중심 설명, 공유 리소스의 트레이드오프, 쿼리 팬아웃 관련 자주 묻는 질문 3가지, 그리고 실용적인 검증 프로토콜.

모든 임베딩을 다시 생성하지 않고 RAG 시스템을 복원할 수 있을까요?
재임베딩 없이 RAG를 복원하는 메커니즘 중심 설명, 공유 리소스의 트레이드오프, 쿼리 팬아웃 관련 자주 묻는 질문 3가지, 그리고 실용적인 검증 프로토콜.

