LabHub

벡터 데이터베이스 — pgvector 와 Qdrant · 전용 벡터 DB · 실습

Qdrant — 전용 벡터 데이터베이스

LabHub 에서 이어서 보기

목표

전용 벡터 데이터베이스 Qdrant 를 켜고, 컬렉션·점·payload·필터·scroll·스냅샷을
한 바퀴 돌린 뒤, 같은 질의를 pgvector 와 나란히 놓고 무엇이 같고 무엇이 다른지를
적습니다.

왜 중요한가

pgvector 로 충분한 자리가 많습니다. 그런데 벡터가 수천만 개가 되고 필터가
까다로워지면, 앞 모듈에서 본 "필터가 결과를 줄이는 함정" 이 매일의 문제가 됩니다.
전용 엔진은 필터를 그래프 탐색 안에 넣고, 벡터를 위한 저장·페이지·스냅샷을
따로 갖습니다. 그 대가는 원본이 두 곳이 되는 것입니다. 어느 쪽이 싼지를 판단하려면
양쪽을 직접 만져 봐야 합니다.

환경

Qdrant 1.19 가 /opt/qdrant/qdrant 에 있고 기본으로 꺼져 있습니다.
/opt/lab/engines.sh start qdrant 로 켭니다(REST http://127.0.0.1:6333, gRPC 6334,
저장 /root/qdrant). 파이썬 qdrant-client 가 설치돼 있고, curl·jq 로도 전부 됩니다.

PostgreSQL 은 늘 떠 있습니다(psql 만 치면 labdb). 마지막 단계에서
psql -f /opt/lab/fixtures/vector/load.sqlarticles 를 적재합니다.

픽스처 /opt/lab/fixtures/vector/: docs.csv(문서), embeddings.csv(벡터),
embed.py(질의 → 벡터). 산출물은 /root/qd/ 아래에 둡니다. mkdir -p /root/qd 를 먼저 하세요.

단계

1. /opt/lab/engines.sh start qdrant 로 Qdrant 를 켜고, curl http://127.0.0.1:6333/ 의 응답을 /root/qd/01-info.json 에 저장합니다.
2. articles 컬렉션을 벡터 크기 64, 거리 함수 Cosine 으로 만듭니다.
3. docs.csvembeddings.csv 를 합쳐 2,000개의 점을 articles 컬렉션에 넣습니다 — id 는 문서 id 그대로, 벡터는 embeddings.csv 의 값, payload 는 category·lang·title 세 키.
4. 질의 "파드가 OOMKilled 로 계속 재시작한다" 를 embed.py 로 벡터화해 상위 5건을 검색하고 /root/qd/04-search.txtid|score|category|title 로 남깁니다.
5. categorylangkeyword payload 인덱스를 만든 뒤, 질의 "privilege escalation found in the audit log" 로 category = security·lang = en 인 점만 상위 5건 검색해 /root/qd/05-filter.txtid|score|category|lang|title 로 남깁니다.
6. category = billing 인 점을 scroll 로 100건씩 끝까지 넘기며 세어 /root/qd/06-scroll.txtcount=·pages=·page_sizes=(페이지마다 받은 개수를 쉼표로) 를 남깁니다.
7. articles 컬렉션의 스냅샷을 만들고 /root/qd/07-snapshot.txtname=<스냅샷 이름> 을 남깁니다.
8. load.sql 로 PostgreSQL 에도 articles 를 적재하고, 질의 "복제 지연이 커지고 replica 가 뒤처진다" 의 상위 10건을 pgvector(정확 검색)와 Qdrant 양쪽에서 구해 /root/qd/08-compare.txtpg_ids=·qdrant_ids=(쉼표 구분)·overlap=(겹치는 개수)와 두 엔진의 차이를 세 줄 이상 적습니다.

참고

단계 8개

  1. Qdrant 기동
  2. 컬렉션 만들기
  3. payload 와 함께 upsert
  4. 벡터 검색
  5. payload 인덱스와 필터 검색
  6. scroll 로 페이지 넘기기
  7. 스냅샷
  8. pgvector 와 나란히