LabHub

벡터 데이터베이스 — pgvector 와 Qdrant · 벡터 검색의 원리 · 실습

pgvector 로 정확 검색까지

LabHub 에서 이어서 보기

목표

pgvector 로 벡터를 저장하고, 세 거리 연산자의 뜻을 정규화된 벡터에서 직접 확인하고,
질의문을 벡터로 바꿔 정확 검색(exact kNN)과 범주 필터를 결합합니다. 이 실습의
결과가 다음 모듈에서 모든 근사 검색의 정답 기준이 됩니다.

왜 중요한가

벡터 검색은 "같은 낱말" 이 아니라 "가까운 뜻" 을 찾습니다. 그 일의 절반은 임베딩
모델이 하고, 나머지 절반 — 저장·거리·조건·속도 — 은 데이터베이스가 합니다.
이 실습은 뒤쪽 절반입니다. 정확 검색은 느리지만 틀리지 않으므로, 여기서 잡은
결과가 인덱스가 무엇을 놓치는지를 재는 자가 됩니다.

환경

이 파드는 postgres 계정으로 돕니다. psql 만 치면 labdb 에 붙고 vector 확장은
이미 켜져 있습니다.

export PATH=/usr/lib/postgresql/16/bin:$PATHexport PGHOST=127.0.0.1 PGUSER=lab PGDATABASE=labdbpsql

픽스처는 /opt/lab/fixtures/vector/ 에 있습니다(읽기 전용으로 생각하세요).

산출물은 전부 /root/vec/ 아래에 둡니다. mkdir -p /root/vec 를 먼저 하세요.

단계

1. articles 표를 만들고 문서 2,000건을 적재합니다 — 열은 id int primary key, category text, lang text, title text, body text, embedding vector(64). 문서는 /opt/lab/fixtures/vector/docs.csvCOPY 로 넣습니다(임베딩은 아직 비워 둡니다).
2. /opt/lab/fixtures/vector/embeddings.csv(id, embedding) 의 벡터를 articles.embedding 에 채우고, /root/vec/02-load.txtrows=·with_embedding=·dim= 세 줄을 남깁니다.
3. 문서 42 와 43 사이의 거리를 <->·<=>·<#> 로 재고, 문서 42 에 가장 가까운 5건(자기 자신 제외)을 세 연산자 각각으로 뽑아 같은 집합인지 확인해 /root/vec/03-ops.txtl2=·cosine=·ip=·top5_same= 을 남깁니다.
4. 문서 100 의 벡터로 가장 가까운 10건(자기 자신 제외)을 코사인 거리 오름차순으로 뽑아 /root/vec/04-knn.txt 에 한 줄에 하나씩 id|category|lang|title|distance 로 남깁니다.
5. embed.py 로 질의 "파드가 OOMKilled 로 계속 재시작한다" 의 벡터를 만들고, 가장 가까운 5건을 /root/vec/05-query.txtid|category|lang|title|distance 로 남깁니다.
6. 질의 "디스크 사용량이 90% 를 넘어 알림이 왔다" 로 category = 'storage' and lang = 'en' 인 문서 중 가장 가까운 5건을 /root/vec/06-filter.txtid|category|lang|title|distance 로 남깁니다.
7. 범주마다 avg(embedding) 으로 중심 벡터를 구하고, 질의 "결제 실패 뒤 환불 요청이 들어왔다" 와의 코사인 거리를 범주 8개 전부에 대해 오름차순으로 /root/vec/07-centroid.txtcategory|distance 로 남깁니다.
8. search_articles(q vector(64), k int) 함수를 만들어 거리 오름차순 k 건(id, category, title, distance)을 돌려주게 하고, /opt/lab/fixtures/vector/queries.json 의 질의 20개를 그 함수로 검색해 /root/vec/08-batch.csvqid,rank,id 200행을 남깁니다.

참고

단계 8개

  1. vector(64) 열이 있는 표
  2. 임베딩 적재
  3. 세 거리 연산자
  4. 정확 kNN
  5. 질의문으로 검색
  6. 범주 필터와 결합
  7. 범주 중심 벡터
  8. 검색 함수와 일괄 검색