본문 바로가기
Data Science

벡터 DB 검색 기본 개념 : Embedding, ANN 개요 (1)

by 난시간과싸워 2025. 12. 8.
반응형

벡터 DB

  • 벡터 DB란 텍스트, 이미지, 오디오 같은 비정형 데이터들을 벡터(코드 관점에선 숫자의 배열) 형태로 저장해놓고, 이 들 사이의 유사도(similarity)를 기반으로 빠르게 검색하기 위해 특화된 데이터베이스이다.
  • 일반적으로 ML(특히 딥러닝 모델)을 이용하여 의미를 함축시켜 숫자배열로 표현하는 Embedding 과정을 거쳐 고차원 벡터로 변환한 뒤, DB에 저장된다.
  • 벡터 DB를 한 문장으로 요약하면,  비정형성의 데이터를 의미기반으로 검색하기 위해 벡터를 저장하고 탐색하는 DB이다. 

벡터 DB와 기존 검색 엔진과의 차이

  • 전통 검색 엔진(Elasitcsearch의 BM25)이나 정형데이터를 처리하는 RDBMS와 다른 점은 기존 DB들이 정확히 일치하거나 범위 검색을 하는데 최적화되어 있다면, 벡터 DB는 "의미적으로 비슷한 것"을 찾는데 최적화되어 있다. 
  • 키워드 검색이나 이미지 검색에서 같은 의미지만 다른 뜻을 가지고 있는 데이터들이 있다면 (ex. 자동차와 car는 같은 의미지만 글자 모양이 다름) 유사어를 직접 연결해줘야한다면, 벡터 DB는 의미적으로 같거나 비슷함을 Embedding 모델이 잘 표현한다면 같은 의미로 인식된다. 
  • 기존 DB가 특정 기준(ex. BM25)으로 정렬된다면  벡터 DB는 1) 의미를 어떻게 Embedding 하냐, 2) 어떤 방식으로 유사도(혹은 거리)를 정의하느냐에 따라 벡터 DB의 활용과 성능이 결정된다. 

 

벡터 DB의 단계

 

    • Embedding: 텍스트, 이미지, 보이스 등 다양한 비정형 데이터를 고차원 벡터로 변환
    • 거리/유사도 계산: 유사도를 판단하기 위한 식 (벡터 간의 거리(L2), 코사인 유사도)으로 유사도를 판단
    • Approximate Nearest Neighbor (ANN) 검색:
      • 모든 벡터를 비교하는 건 매우 비효율적 → 인덱스 + 근사 탐색으로 속도 최적화
      • 대표적 기법: HNSW, IVF, PQ 등 (인덱스 + 탐색 구조)

벡터 DB 성능에 중요한 요소들

  • Embedding 품질 : 벡터 DB의 검색 성능은 Embedding이 검색하고자 하는 "의미를 얼마나 잘 표현했는가"에 의해 결정된다. 이미지 검색이라면 이미지의 모양을 잘 표현할 수 있는 딥러닝 모델의 Feature를, RAG 검색을 위해서는 성능 좋은 모델의 Feature를 Embedding으로 선택해야한다.
  • 인덱스 선택(HNSW, IVF, PQ) : 벡터의 개수가 많아지면 모든 벡터와의 유사도를 다 검색할 수 없기 때문에(소요 시간), 벡터 DB는 탐색범위를 줄일수 있는 ANN 인덱스를 사용한다. 어떤 ANN 인덱스를 선택하느냐에 따라 정확도, 속도, 메모리 사용량이 달라진다.
인덱스 방식 정확도 속도 메모리 사용량 동작 방식
Flat / Brute-force (전체 검색) ★★★★★ (최고) ★☆☆☆☆ (가장 느림) ★★★★☆ (벡터 크기만큼 필요) Query 벡터와 모든 벡터를 하나씩 직접 비교
HNSW ★★★★☆ (높음) ★★★★★ (매우 빠름) ★★★☆☆ (그래프 구조 유지 필요) 계층형 그래프(HNSW)를 따라 탐색하며 근사 최근접 탐색 수행
IVF (Inverted File Index) ★★★☆☆ (중간) ★★★★☆ (빠름) ★★☆☆☆ (클러스터링으로 효율적) 벡터를 여러 클러스터로 나누고, 쿼리와 가까운 클러스터만 탐색
PQ (Product Quantization) ★★☆☆☆ (낮음~중간) ★★★★☆ (빠름) ★☆☆☆☆ (압축으로 매우 적음) 벡터를 여러 부분으로 나눠 각각을 양자화하여 메모리 절감 + 근사 탐색
  • Metadata + 필터링 조합 : 인덱스 선택이 벡터 내에서 근사 탐색으로 탐색 범위를 줄이는 것이라면 Metadata를 활용한 필터링을 걸면 탐색 범위를 크게 줄일 수 있어서, 속도를 향상시킬 수 있다. 다만, FAISS 등의 벡터 DB에서는 Metadata를 직접 관리해줘야하기 때문에 복잡해질 수 있다. 
  • 쿼리 벡터 생성 방식(모델 종류나 파라미터에 따라 결과 변화) : Embedding은 모두 동일한 기준(모델, 압축 등)을 가지고 만들어져야한다. 특히, Featue를 뽑기 위한 딥러닝 모델의 성능이 좋아졌다고해도, Embedding은 모두 동일 기준으로 생성해야한다. 
  • Rerank(재정렬 과정) : 벡터 DB는 의미 기반으로 후보를 빠르게 좁히는데 강점이 있지만, ANN 구조상 근사값이기 때문에 어느 정도의 정확도 손실을 가져간다. 또한, Embedding을 위한 모델로는 성능이 더 좋고 깊은 모델보다 빠르게 Feature를 뽑을 수 있는 모델이 선호된다. 정확도 손실을 위해 일반적으로 벡터 DB의 TOP-K로 후보군을 좁혀놓고, 더 성능이 좋은 Rerank 모델을 별도로 구축하여 사용하는 방법이 많이 사용된다. 

 

대표적인 벡터 DB들

최근 RAG를 구현하기 위해 다양한 벡터 DB들이 등장하였지만, 일반적으로 많이 쓰이는 DB는 아래와 같다.

 

1) Qdrant

  • Rust 기반, 매우 빠르고 안정적
  • UI 제공, 시각화 기능 우수
  • 필터링 + ANN 조합이 쉬움
  • 완전 오픈소스라 비용 부담 없음

2) Milvus

  • 다양한 인덱스(HNSW, IVF, PQ) 지원
  • 대규모 데이터(수억+) 처리에 강함
  • GPU 가속 지원

3) Elastic Vector Search

  • 기존 BM25 기반 검색과 벡터 검색을 함께 활용 가능
  • 통합 검색이 필요할 때 유리
  • 단, 유료 라이선스 문제로 오픈소스 DB와 조합해 쓰기도 함

4) FAISS

  • Meta가 만든 초고속 벡터 검색 라이브러리
  • GPU 가속 매우 강력
  • DB가 아니기 때문에 업데이트/삭제/메타데이터 관리가 어려움
  • “데이터가 자주 안 바뀌는 환경 + 초고속 검색”에 적합