AI & LLM

Vector DB - Qdrant 를 활용하여 벡터 데이터 다뤄보기

@deveely 2025. 10. 19. 23:55
반응형

1. Vector DB란?

Vector DB는 데이터를 벡터(숫자 배열) 형태로 저장하고 벡터 간 유사도(Similarity) 를 계산해주는 AI 특화 데이터베이스입니다.

텍스트, 이미지, 오디오처럼 비정형 데이터를 임베딩(Embedding) 모델을 통해 벡터로 변환하고 이 벡터들의 “의미적 거리”를 계산함으로써 의미 기반 검색(Semantic Search), 추천 시스템, RAG(Retrieval Augmented Generation) 등에 활용됩니다.

대표적으로 많이 사용되는 Vector DB입니다.

이름 특징 주요 사용 사례

Pinecone 완전 관리형 SaaS. 인프라 관리 불필요 빠른 RAG 구축, 대규모 상용 서비스
Qdrant 오픈소스 기반, HTTP·gRPC 모두 지원 로컬/클라우드 환경, Spring AI 연동
Weaviate GraphQL API, 다양한 백엔드 스토리지 연동 멀티모달(텍스트+이미지) 검색

이 글에서는 Qdrant를 활용하여 Vector DB와 가까워져보고자 합니다.

2. 설치방법

Qdrant는 Docker를 활용하여 매우 간단하게 설치할 수 있습니다.

아래와 같이 이미지를 Pull 받고 실행해주면 끝입니다!

> docker pull qdrant/qdrant
> docker run -d \\
    --name qdrant \\
    -p 6333:6333 \\ // for HTTP
    -p 6334:6334 \\ // for gRPC 
    -v ~/qdrant_storage:/qdrant/storage \\ // 데이터 볼륨 설정
    qdrant/qdrant

도커 실행 명령어를 조금 들여다보면 6333 6334 2개 포트를 호스트와 연결시켜주는데요.

Qdrant는 HTTP, gRPC 2가지 통신 방식을 지원하기 때문에 서비스 특성에 맞춰 사용하시면 되겠습니다.

(참고로 gRPC에 대해 처음 접하시는 분들은 gRPC Reference - 개요 및 특징 살펴보시는것도 추천드립니다)

정상 기동 후 아래 명령으로 컬렉션 목록이 보인다면 성공입니다.

3. 간단한 실습

본격적으로 실습하기 전에 몇가지 사전지식을 알아보고 가겠습니다.

대표적으로 Collection, Point, Vector, Payload 가 있습니다.

  • Vector : 데이터를 임베딩하여 얻은 숫자 배열 데이터
  • Payload : 벡터에 대한 부연설명을 할 수 있는 메타 데이터
  • Point : Vector + Payload
  • Collection : 여러 Point 로 이뤄진 집합

즉 Collection은 Point (Payload를 같는 Vector)들의 집합이라고 정의할 수 있습니다.

Qdrant에서는 같은 Collection에 속한 모든 Vector가 동일한 차원(Dimension)같은 Metric(유사도 계산 방식) 을 가져야 합니다.

대표적인 Metric 종류는 다음과 같습니다.

Metric 설명 특징 / 사용 예시

Cosine 코사인 유사도 문장, 단어 임베딩 등 방향(semantic) 이 중요한 NLP에 적합
Dot 벡터 내적 크기와 방향을 모두 반영, 이미지·멀티모달 임베딩에 자주 사용
Euclid 유클리드 거리 물리적 거리나 좌표형 데이터 등 절대 거리 기반 비교에 사용

Collection 은 아래와 같이 만들어 볼 수 있습니다.

이름을 지정하여 생성하며 size는 차원, distance는 유사도 계산 방식을 의미합니다.

> curl -X PUT "<http://localhost:6333/collections/{컬렉션명}>" -d '{
  "vectors": {
    "size": 3,
    "distance": "Cosine"
  }
}'

{"result":true,"status":"ok","time":0.059407167}

다음과 같은 방법으로 현재 만들어져있는 컬렉션 목록을 확인해볼수도 있습니다.

> curl -X GET "<http://localhost:6333/collections>"

{"result":{"collections":[{"name":"test_collection"}]},"status":"ok","time":7.667e-6}

다음으로 만들어진 컬렉션에 벡터를 저장해보겠습니다.

  • wait 파라미터가 true이면 동기, false면 비동기로 처리합니다
> curl -X PUT "<http://localhost:6333/collections/{컬렉션명}/points?wait=true>" -d '{
  "points": [
      {
          "id": 1,
          "payload": {"color": "red"},
          "vector": [0.9, 0.1, 0.1]
      },
      {
          "id": 2,
          "payload": {"color": "green"},
          "vector": [0.1, 0.9, 0.1]
      },
      {
          "id": 3,
          "payload": {"color": "blue"},
          "vector": [0.1, 0.1, 0.9]
      }
  ]
}'

{"result":{"operation_id":0,"status":"acknowledged"},"status":"ok","time":0.000972208}

scroll API를 활용해 조회해보면 3개 포인트가 정상적으로 조회되는 부분이 확인됩니다.

> curl -s -X POST <http://localhost:6333/collections/test_collection/points/scroll> \\
  -H "Content-Type: application/json" \\
  -d '{"limit": 10, "with_vector": false, "with_payload": true}'

{"result":{"points":[{"id":1,"payload":{"color":"red"}},{"id":2,"payload":{"color":"green"}},{"id":3,"payload":{"color":"blue"}}],"next_page_offset":null},"status":"ok","time":0.000514917} 

이렇게 가볍게 컬렉션을 생성하고 벡터 저장 및 조회를 해봤습니다.

4. 마무리

Qdrant는 이 외에도 필터링, 조건 검색, Named Vector 등 다양한 고급 기능을 제공합니다.

자세한 내용은 공식 문서를 참고하시면 좋습니다.

다음 글에서는 Spring AI + Vector DB 를 활용한 RAG 아키텍쳐를 구현해보도록 하겠습니다.

반응형