벡터 데이터베이스

현지·2025년 9월 24일

벡터 데이터베이스란?

텍스트, 이미지, 오디오 등의 데이터를 고차원 벡터로 표현해 저장하는 데이터베이스입니다. 오늘날 대부분의 데이터는 미리 정의된 구조나 형식이 없는 텍스트, 이미지, 오디오 등의 비정형 데이터이다. 이러한 형태가 일관적이지 않은 데이터들을 RDBMS에 넣기란 어려운 일이다.

이미지를 예로 들자면 이미지는 픽셀값이 저장되기 때문에 특정 이미지를 찾기 위해선 태그나 속성(ex. 고양이, 강아지)을 수동으로 입력해야 한다.

하지만 벡터 데이터베이스는 벡터 임베딩을 통해 인덱싱하고 저장하여 빠른 검색 및 유사성 검색이 가능하다. 다시말해
데이터의 의미 기반 유사성 검색이 가능해진다는 말이다.

그렇다면 벡터 임베딩은 무엇일까?

벡터 임베딩

임베딩은 텍스트나 이미지 같은 데이터를 숫자 리스트, 즉 벡터로 바꾸는 방식이다. 이 벡터들은 데이터의 의미나 특성을 담고 있다.

의미가 비슷한 항목은 벡터 공간에서도 가까운 위치에 놓이게 되기 때문에 코사인 유사도나 유클리드 거리 등을 통해 서로 간의 유사도를 계산하여, 유사한 항목을 쉽게 찾을 수 있다.

벡터 데이터베이스는 이러한 임베딩들을 효율적으로 저장하고 검색하기 위해 만들어졌다. 기존 데이터베이스처럼 정확히 일치하는 값을 찾는 게 아니라, 유사한 것을 찾는 방식이다.

word2vec

대표적인 단어 임베딩 신경망 모델이다. Word2Vec에는 CBOW와 Skip-gram이라는 두 가지 대표적인 구조가 있다.

CBOW

CBOW의 기본 아이디어는 주변 단어를 통해 주어진 단어를 예측하는 것이다.
총 단어가 c개라고 할 때 앞뒤로 c/2개의 단어를 통해 주어진 단어를 예측한다.

Skip-gram 구조 (중심 → 주변 예측)

Skip - gram은 CBOW와는 반대로 하나의 단어에서 여러 단어를 예측하는 방법이다. 즉 중심단어에서 주변단어를 예측하는 방식인데 CBOW보다 성능이 좋아 더 많이 쓰인다.

벡터 인덱싱

벡터 임베딩이 비정형 데이터를 숫자 벡터로 바꾸는 것이라면, 인덱싱은 벡터 공간에 위치한 이미 만들어진 벡터들끼리 비슷한 걸 빠르게 찾도록 구조화하는 작업이라고 할 수 있다.

벡터 DB에서 데이터를 검색할 때 KNN(기준 벡터와 가장 가까운 K개의 벡터를 찾아주는 방법)이 사용되는데, 벡터 인덱싱은 그 작업을 더 빠르게 하기 위해 사용된다.

벡터 공간을 쪼개거나, 비슷한 벡터끼리 그래프처럼 연결하거나, 트리 구조로 나누거나 이런 다양한 방식으로 비슷한 애들끼리 미리 묶어놓고 검색 범위를 줄인다.

vector Indexing 기법

  1. Flat Index

    별도의 인덱싱 기법 없이 벡터를 저장하는 방법이다.
    모든 벡터들과 유사도를 계산해 가장 높은 유사도를 지닌 벡터를 찾는다. 일반적으로 10000~50000개 정도이 벡터에서 적당한 성능과 높은 정확성을 얻을 수 있다.
    하지만 실제로 이렇게 사용한다면 벡터 데이터가 더 많아 탐색 속도가 느려질 것이다.

  2. Random Projection

    랜덤한 벡터를 만들어서 원래 벡터와의 내적을 시켜서 차원을 줄
    이는 방법이다.
    원래 벡터와의 유사성도 유지할수 있고 고차원의 원래 벡터보다
    탐색속도가 빠를수 있다고 한다.
    하지만 Approxiamtion이기 때문에 정확도는 다소 떨어질수 있다.

  3. PQ (Product Quantization)

    원래 벡터를 균등하게 몇개의 서브벡터로 쪼개고, 각 서브벡터들
    을 Quantization하여 크기를 줄이는 방법이다.
    빠르고 정확도도 좋으며 큰 데이터셋에서 사용하기 좋은 기법이라
    고 한다. Quantiztion으로 값을 표현하는데 사용하는 bit수를 줄
    이기 때문에 메모리 사용량도 적고, 탐색 속도도 빠르다.
    하지만 근본적으로 표현하는 숫자의 범위를 제한하는 방법이기 때
    문에 정확도는 다소 떨어질수 있다.

  4. LSH (Locality-Sensitive Hashing)

    원래 벡터를 hashing 함수에 한번 돌려서 bucket에 매핑하고,
    bucket에서 비교하여 찾는 방법이다.
    유사도 검색을 할때도 쿼리문에 대한 벡터를 동일한 해싱함수를
    사용해서 같은 버킷에 있는 벡터들하고만 비교하여 찾는다.
    전체 데이터가 아니라 버킷에 있는 데이터안에서만 찾기 때문에
    탐색속도가 빠르다.
    하지만 버킷이 많을수록 정확도가 높아지겟지만, 더 많은 메모리
    가필요하게 된다.

  5. HNSW (Hierarchical Navigable Small World
    grahp)

    원래 벡터를 가지고 N개의 레이어를 가진 그래프를 생성하고, 그
    래프를 기반으로 가장 가까운(유사도가 높은)결과를 찾아내는 방
    법이다.

profile
헤맨만큼 내 땅이다

0개의 댓글