벡터 데이터베이스 — pgvector 와 Qdrant · 전용 벡터 DB · 실습
Qdrant — 전용 벡터 데이터베이스
목표
전용 벡터 데이터베이스 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.sql 로 articles 를 적재합니다.
픽스처 /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.csv 와 embeddings.csv 를 합쳐 2,000개의 점을 articles 컬렉션에 넣습니다 — id 는 문서 id 그대로, 벡터는 embeddings.csv 의 값, payload 는 category·lang·title 세 키.
4. 질의 "파드가 OOMKilled 로 계속 재시작한다" 를 embed.py 로 벡터화해 상위 5건을 검색하고 /root/qd/04-search.txt 에 id|score|category|title 로 남깁니다.
5. category 와 lang 에 keyword payload 인덱스를 만든 뒤, 질의 "privilege escalation found in the audit log" 로 category = security·lang = en 인 점만 상위 5건 검색해 /root/qd/05-filter.txt 에 id|score|category|lang|title 로 남깁니다.
6. category = billing 인 점을 scroll 로 100건씩 끝까지 넘기며 세어 /root/qd/06-scroll.txt 에 count=·pages=·page_sizes=(페이지마다 받은 개수를 쉼표로) 를 남깁니다.
7. articles 컬렉션의 스냅샷을 만들고 /root/qd/07-snapshot.txt 에 name=<스냅샷 이름> 을 남깁니다.
8. load.sql 로 PostgreSQL 에도 articles 를 적재하고, 질의 "복제 지연이 커지고 replica 가 뒤처진다" 의 상위 10건을 pgvector(정확 검색)와 Qdrant 양쪽에서 구해 /root/qd/08-compare.txt 에 pg_ids=·qdrant_ids=(쉼표 구분)·overlap=(겹치는 개수)와 두 엔진의 차이를 세 줄 이상 적습니다.
참고
- REST 본문은 JSON 입니다.
-H 'content-type: application/json'을 빠뜨리면 400 이 옵니다. embed.py의 출력[…]은 JSON 배열이라"query": $V처럼 그대로 끼워 넣을 수 있습니다.- Qdrant 의
score는 유사도(클수록 가깝다)입니다. pgvector 의<=>와 순위는 같고 방향만 반대입니다. - 컬렉션·점·스냅샷은 전부
/root/qdrant아래에 있고 볼륨이 없어 세션과 함께 사라집니다.
단계 8개
- Qdrant 기동
- 컬렉션 만들기
- payload 와 함께 upsert
- 벡터 검색
- payload 인덱스와 필터 검색
- scroll 로 페이지 넘기기
- 스냅샷
- pgvector 와 나란히