pgvector 벡터 쿼리하기

pgvector 벡터 쿼리하기

벡터 검색의 핵심은 "내가 넣은 임베딩에 가장 가까운 벡터를 찾는 일"이에요. pgvector는 여러 거리 함수 연산자를 제공해서, 상황에 맞는 유사도를 골라 쓸 수 있어요.

출처: https://github.com/pgvector/pgvector#querying

가장 가까운 이웃 찾기

특정 벡터에 가장 가까운 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 BYLIMIT를 함께 쓰면 인덱스를 활용할 수 있어요.

거리 값 직접 구하기

거리 값 자체가 필요한 경우도 있어요.

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;

더 알아보기