pgvector 벡터 쿼리하기
pgvector 벡터 쿼리하기
벡터 검색의 핵심은 "내가 넣은 임베딩에 가장 가까운 벡터를 찾는 일"이에요. pgvector는 여러 거리 함수 연산자를 제공해서, 상황에 맞는 유사도를 골라 쓸 수 있어요.
가장 가까운 이웃 찾기
특정 벡터에 가장 가까운 5개를 가져오는 기본 쿼리예요.
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;
지원하는 거리 연산자는 다음과 같아요.
<->- L2(유클리드) 거리<#>- (음의) 내적<=>- 코사인 거리<+>- L1(택시) 거리<~>- 해밍 거리 (이진 벡터)<%>- 자카드 거리 (이진 벡터)
다른 행을 기준으로 그 이웃을 찾으려면 서브쿼리로 기준 벡터를 넘기면 돼요.
SELECT * FROM items WHERE id != 1 ORDER BY embedding <-> (SELECT embedding FROM items WHERE id = 1) LIMIT 5;
특정 거리 안에 있는 행만 뽑을 수도 있어요.
SELECT * FROM items WHERE embedding <-> '[3,1,2]' < 5;
이런 거리 조건도 ORDER BY와 LIMIT를 함께 쓰면 인덱스를 활용할 수 있어요.
거리 값 직접 구하기
거리 값 자체가 필요한 경우도 있어요.
SELECT embedding <-> '[3,1,2]' AS distance FROM items;
내적 연산자 <#>는 음의 내적을 돌려주므로, 실제 내적을 얻으려면 -1을 곱해요.
SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;
코사인 유사도는 코사인 거리를 1에서 빼면 돼요.
SELECT 1 - (embedding <=> '[3,1,2]') AS cosine_similarity FROM items;
벡터 집계 함수
그룹 없이 전체 평균을 구하거나, 그룹별 평균을 구할 수도 있어요.
SELECT AVG(embedding) FROM items;
SELECT category_id, AVG(embedding) FROM items GROUP BY category_id;