pgvector 희소 벡터 — sparsevec로 대부분이 0인 벡터 다루기
pgvector 희소 벡터 — sparsevec로 대부분이 0인 벡터 다루기
대부분의 값이 0인 고차원 벡터(예: 단어 가방 방식의 TF-IDF 표현)는 밀집 배열로 저장하면 메모리가 낭비돼요. pgvector의 sparsevec 타입은 0이 아닌 값만 저장해 이 문제를 해결합니다.
sparsevec로 저장하기
sparsevec(5)처럼 차원을 지정해 컬럼을 만들고, 희소 형식 문자열로 값을 넣습니다.
CREATE TABLE items (id bigserial PRIMARY KEY, embedding sparsevec(5));
INSERT INTO items (embedding) VALUES ('{1:1,3:2,5:3}/5'), ('{1:4,3:5,5:6}/5');
입력 형식은 {index1:value1,index2:value2}/dimensions 이고, SQL 배열처럼 인덱스는 1부터 시작해요.
L2 거리로 최근접 이웃 검색
다른 벡터 타입과 동일하게 L2 거리 연산자로 검색합니다.
SELECT * FROM items ORDER BY embedding <-> '{1:3,3:1,5:2}/5' LIMIT 5;
희소 벡터도 sparsevec_l2_ops 같은 연산자 클래스로 HNSW 인덱스를 만들어 근사 검색을 쓸 수 있어요.
더 알아보기
- 반정밀도 벡터는 Half-Precision Vectors 참고
- 이진 벡터는 Binary Vectors 참고
- 인덱스와 확장은 Scaling 참고