pgvector 반정밀도 벡터 — halfvec로 저장 공간 줄이기
pgvector 반정밀도 벡터 — halfvec로 저장 공간 줄이기
임베딩 수가 늘면서 가장 먼저 부딪히는 문제가 저장 공간이에요. pgvector의 halfvec 타입은 벡터 원소를 반정밀도(half-precision) 부동소수점으로 저장해 워킹셋을 크게 줄여 줍니다.
출처: https://github.com/pgvector/pgvector#half-precision-vectors
halfvec로 저장하기
스키마는 vector와 똑같이 만들면 돼요. 타입 이름만 halfvec로 바꿉니다.
CREATE TABLE items (id bigserial PRIMARY KEY, embedding halfvec(3));
반정밀도 인덱싱
vector 벡터를 반정밀도로 캐스팅해 인덱스하면 인덱스 크기도 작아집니다. L2 거리를 기준으로 HNSW 인덱스를 만드는 예시예요.
CREATE INDEX ON items USING hnsw ((embedding::halfvec(3)) halfvec_l2_ops);
이렇게 인덱스를 만들면 최근접 이웃 검색도 같은 형식으로 질의합니다.
SELECT * FROM items ORDER BY embedding::halfvec(3) <-> '[1,2,3]' LIMIT 5;
halfvec의 특징
- 각 반정밀도 벡터는
2 * dimensions + 8바이트를 차지해요. 원소 하나당 반정밀도 부동소수점 숫자입니다. - 모든 원소는 유한해야 하며,
NaN,Infinity,-Infinity는 허용되지 않아요. - 최대 16,000차원까지 담을 수 있습니다.
2000차원이 넘는 고차원 벡터를 인덱싱해야 한다면 반정밀도 벡터(halfvec)나 반정밀도 인덱싱으로 최대 4000차원, 이진 양자화로 최대 64000차원까지 커버할 수 있어요. 인덱스가 메모리에 꽉 차지 않아도 동작하지만, 채워두면 성능이 좋아집니다.
더 알아보기
- 희소 벡터는 Sparse Vectors 참고
- 이진 벡터는 Binary Vectors 참고
- 대규모 확장은 Scaling 참고