새벽을 밝히는 붉은 달

벡터 데이터베이스 톺아보기 본문

Develop/Database

벡터 데이터베이스 톺아보기

자윰 2023. 11. 5. 19:48

회사에서 벡터 데이터베이스 도입한 것은 알고 있었는데, 인공지능 쪽에 쓰이는 데이터베이스인 것만 알고 정확히 뭔지 잘 모르고 있었다.  점차 팀 내에서 MLOps 관련된 프로젝트가 늘어나는 것을 보며 나도 알고 있어야 언젠가 관련 업무를 할당받았을 때 더 빠르게 이해할 수 있을 것 같아서 살펴보려고 한다.

1. 관계형 데이터베이스는 AI 애플리케이션에 적합하지 않다

우리는 일반적으로 데이터를 저장할 때 관계형 데이터베이스에 저장하고, 이를 기반으로 검색한다. AI 애플리케이션의 경우 복잡한 작업을 실행할 때 장기 기억을 이해하고 유지하는데 중요한 의미 정보를 전달하는 데이터 표현 유형인 벡터 임베딩을 사용한다.

 

임베딩고차원의 단어나 이미지 같은 데이터를 실수 벡터 형태로 표현한 결과물을 의미한다. 아래와 같이 특정 단어나 이미지, 문서를 임베딩 생성 모델에 입력하게 되면 일정한 수의 실수들로 구성된 벡터가 출력된다.

https://syncly.app/ko/blog/what-is-embedding-and-how-to-use

임베딩은 AI 모델에 의해 생성되며 많은 수의 attributes나 features를 가지므로 representation을 관리하기가 어렵다. 또한 벡터 임베딩은 기존 스칼라 기반 데이터베이스가 데이터의 복잡성과 규모를 따라잡을 수 없기 때문에 어떤 인사이트를 뽑아내거나 실시간 분석을 수행하기 어렵다. 따라서 이러한 유형의 데이터를 처리하고 데이터를 최대한 활용하는데 필요한 성능, 확장성, 유연성을 제공하도록 특별히 설계된 특수한 데이터베이스가 필요하게 되었다. 

 

2. 벡터 데이터베이스란

벡터 데이터베이스벡터를 고차원 포인트로 저장하고 검색하는 기능을 제공하는 데이터베이스이다. N차원 공간에서 가장 가까운 이웃을 효율적이고 빠르게 조회할 수 있는 추가적인 기능을 제공한다. 

 

다음과 같은 다이어그램을 통해 벡터 데이터베이스의 역할을 이해할 수 있다.

https://www.pinecone.io/learn/vector-database/

1. 임베딩 모델을 사용하여 인덱싱하려는 콘텐츠에 대한 벡터 임베딩을 만든다.

2. 벡터 임베딩은 임베딩이 생성된 원본 콘텐츠에 대한 일부 참조와 함께 벡터 데이터베이스에 삽입된다.

3. 애플리케이션이 쿼리를 실행하면 동일한 임베딩 모델을 사용하여 쿼리에 대한 임베딩을 생성하고 해당 임베딩을 사용해 유사한 벡터 임베딩에 대해 벡터 데이터베이스에 쿼리한다. 유사한 임베딩은 이를 생성하는 이전에 생성한 오리지털 콘텐츠와 연관된 임베딩이다.

3. 벡터 데이터베이스의 특징

1. 데이터 관리: insert, deletem update 같은 데이터 저장 기능을 제공한다.

2. 메타데이터 저장 및 필터링: 각 벡터 항목과 관련된 메타데이터를 저장할 수 있으며, 메타데이터 필터를 사용해 보다 세부적인 쿼리를 할 수 있다.

3. 확장성: 증가하는 데이터 볼륨과 사용자 요구에 맞춰 확장 가능하도록 설계되어 분산 및 병렬 처리에 더 나은 지원을 제공한다.

4. 실시간 업데이트: 실시간 데이터 업데이트를 지원하여 데이터에 대한 동적 변경을 허용한다.

5. 백업 및 컬렉션: 데이터베이스에 저장된 모든 데이터를 백업하는 작업을 처리할 수 있다. 나중에 사용할 수 있도록 해당 인덱스에 데이터를 저장하는 컬렉션 형태로 백업할 수 있는 특정 인덱스를 선택적으로 선택할 수 있다.

6. 생태계 통합: ETL 파이프라인, 분석 도구, 시각화 플랫폼과 같은 데이터 처리 생태계의 다른 구성 요소와 쉽게 통합하여 데이터 관리 워크플로를 간소화할 수 있다.

7. 데이터 보안 및 접근 제어: 민감한 정보를 보호하기 위한 내장된 데이터 보안 기능과 접근 제어 메커니즘을 제공한다.

4. 벡터 데이터베이스는 어떻게 동작하는가?

벡터 데이터베이스는 벡터에서 동작하기 때문에 우리가 알고있던 전통적인 데이터베이스와 최적화 및 쿼리 방식이 다르다. 기존 데이터베이스의 경우 보통 값이 쿼리와 정확히 일치하는 데이터베이스의 행을 쿼리하지만, 벡터 데이터베이스에서는 유사성 측정법을 적용하여 쿼리와 가장 유사한 벡터를 찾는다.

 

벡터 데이터베이스는 가장 유사한 벡터를 찾기 위해 ANN(Approximate Nearest Neighbor) 검색에 활용되는 다양한 알고리즘의 조합을 사용한다. 이러한 알고리즘은 hashing, quantization, graph-based search 등을 통해 검색을 최적화한다. 알고리즘은 쿼리된 벡터의 neighbor를 빠르고 정확하게 검색하는 파이프라인으로 조립된다. 

 

벡터 데이터베이스는 대략적인 결과를 제공하기 때문에 벡터 데이터베이스에서 고려하는 점은 정확성속도이다. 결과가 정확할수록 쿼리 속도가 느려진다

 

벡터 데이터베이스의 일반적인 파이프라인은 다음과 같다.

https://www.pinecone.io/learn/vector-database/

 

1. Indexing: 벡터 데이터베이스는 PQ, LSH 또는 HNSW와 같은 알고리즘을 사용하여 벡터를 인덱싱한다. 이 단계에서는 더 빠른 검색을 가능하게 하는 데이터 구조에 벡터를 매핑한다.

2. Querying: 벡터 데이터베이스는 인덱싱된 쿼리 벡터를 dataset의 인덱싱된 벡터와 비교하여 nearest neighbors을 찾는다.

3. Post Processing: 경우에 따라 벡터 데이터베이스는 dataset에서 final nearest neighbors을 검색하고 이를 사후 처리하여 최종 결과를 반환한다. 이 단계에는 다른 유사성 측정을 사용하여 nearest neighbors의 순위를 다시 매기는 작업이 포함될 수 있다.

4-1. 벡터 임베딩 처리에 대한 여러 알고리즘

여러 알고리즘들은 벡터 인덱스 생성을 용이하게 할 수 있다. 이런 알고리즘들은 빠르게 탐색이 가능한 데이터 구조를 만들어서 빠른 쿼리를 할 수 있도록 하는 것이 공통된 목적이며, 일반적으로 쿼리 프로세스를 최적화하기 위해 original vector의 표현을 압축된 형식으로 변환한다.

Random Projection

https://www.pinecone.io/learn/vector-database/

Random Projection은 Random Projection Matrix를 이용해서 고차원 벡터를 저차원 공간에 Projection하는 것이다. 먼저 원하는 목표의 저차원 값의 크기를 가진 난수 Matrix를 만들고, 입력 벡터와 Matrix의 내적을 계산하여 original vectors보다 차원이 적지만 여전히 유사성을 유지하는 projected matrix를 만든다. 

 

쿼리할 때는 projection matrix를 이용하여 query vector를 저차원 공간에 project하고, project된 query vector를 데이터베이스의 projected vectors와 비교하여 nearest neighbors를 찾는다. 이 방식은 데이터의 차원이 줄어들기 때문에 전체 고차원 공간을 검색하는 것보다 검색 속도가 훨씬 빠르다. 

 

품질은 Projection Matrix의 속성에 따라 다르지만, 일반적으로 Projection Matrix가 무작위일수록 품질이 좋아진다. 하지만 진정한 무작위 projection matrix를 만드는 것은 대규모 dataset의 경우 계산 비용이 많이 들 수 있다.

Product Quantization

https://www.pinecone.io/learn/vector-database/

Product Quantization은 고차원 벡터에 대한 손실 압축 기술이다. origin vector를 가져와서 더 작은 청크로 나누고 각 청크에 대한 대표 코드를 생성해 각 청크의 표현을 단순화한 다음 유사성 작업에 필수적인 정보를 잃지 않고 모든 청크를 다시 합친다. 이 과정은 총 네 단계로 이루어진다.

 

1. Splitting: vector가 segments로 분할된다.

2. Training: 각 segment에 대한 codebook을 구축한다. 즉, 벡터에 할당될 수 있는 잠재적인 코드의 풀을 생성한다. 이 codebook은 벡터의 각 segment에 대해 k-means clustering을 수행해 생성된 클러스터의 중심점으로 구성된다. segment codebook에는 k-means clustering 에 사용하는 값과 동일한 수의 값이 있다. 

3. Encoding: 알고리즘은 각 segment에 특정 코드를 할당한다. Training이 완료된 후 codebook에서 각 vector segment에 가장 가까운 값을 찾는다. Segement에 대한 PQ 코드는 codebook의 해당 값에 대한 식별자가 된다. 원하는 만큼 많은 PQ 코드를 사용할 수 있다. 즉, codebook에서 여러 값을 선택해 각 segment를 나타낼 수 있다.

4. Querying: 쿼리할 때 알고리즘은 벡터를 하위 벡터로 나누고 동일한 codebook을 사용하여 quantize 한 후, 인덱싱된 코드를 사용하여 쿼리 벡터에 가장 가까운 벡터를 찾는다.

 

codebook의 대표 벡터 수는 표현의 정확성과 codebook 검색의 계산 비용 간의 균형이다. codebook의 대표 벡터가 많을수록 부분 공간의 벡터 표현이 더 정확해지지만 codebook을 검색하는데 계산 비용이 높아지며, 대표 벡터가 적을수록 표현의 정확도는 떨어지지만 계산 비용은 낮아진다.

Locality-sensitive hashing

https://www.pinecone.io/learn/vector-database/

LSH(Locality-Sensitive Hashing)은 대략적인 최근접 검색의 맥락에서 인덱싱하는 기술이다. 대략적이고 포괄적이지 않은 결과를 제공하면서도 속도에 최적화되어 있다. LSH는 위와 같이 일련의 해싱 함수를 사용하여 유사한 벡터를 bucket으로 매핑한다.

 

주어진 쿼리 벡터에 대한 가장 가까운 이웃을 찾기 위해 유사한 벡터를 해시 테이블에 bucket하는 데 사용된 것과 동일한 해싱 함수를 사용해 특정 테이블로 해싱한 후 테이블의 다른 벡터와 비교하여 가장 가까운 일치 항목을 찾는다. 전체 공간보다 각 해시 테이블의 벡터 수가 훨씬 적기 때문에 전체 dataset에서 검색하는 것보다 훨씬 빠르다.

 

다만 LSH는 approximate method이며 approximation의 품질은 해시 함수의 속성에 따라 달라진다. 일반적으로 해시 함수를 많이 사용할수록 approximate의 품질은 좋아지나 계산 비용이 많이 들고 대규모 dataset에는 적합하지 않을 수 있다. 

Hierarchical Navigable Small World (HNSW)

https://www.pinecone.io/learn/vector-database/

HNSW는 트리의 각 노드가 벡터 집합을 나타내는 계층적 트리형 구조를 만든다. 노드 사이의 edges는 벡터 간의 유사성을 나타낸다. 알고리즘은 각각 적은 수의 벡터를 포함하는 노드 집합을 생성하는 것으로 시작된다. 이는 무작위로 수행하거나 각 클러스터가 노드가 되는 k-means와 같은 알고리즘을 사용해 벡터를 클러스터링하여 수행할 수 있다. 

https://www.pinecone.io/learn/vector-database/

그런 다음 알고리즘은 각 노드의 벡터를 검사하고 노드, 그리고 그 노드와 가장 유사한 벡터를 가진 노드 사이에 edges를 그린다.

 

HNSW 인덱스를 쿼리하면 이 그래프를 사용하여 트리를 탐색하고 쿼리 벡터에 가장 가까운 벡터를 포함할 가능성이 가장 높은 노드를 방문한다.

4-2. 유사성 측정 (Similarity Measures)

유사성 측정은 벡터 공간에서 두 벡터가 얼마나 유사한지 결정하는 수학적 방법이며, 벡터 데이터베이스에 저장된 벡터를 비교하고 주어진 쿼리 벡터와 가장 유사한 벡터를 찾는데 사용된다.

 

다음과 같은 유사성 측정 방법이 있다.

  • Cosine similarity: 벡터 공간에서 두 벡터 사이의 각도의 코사인을 측정한다. 범위는 -1부터 1까지이며 1은 동일한 벡터, 0은 직교 벡터, -1은 정반대인 벡터를 나타낸다. 
  • Euclidean distance: 벡터 공간에서 두 벡터 사이의 직선 거리를 측정한다. 범위는 0부터 ∞까지이며 0은 동일한 벡터를 나타내고 값이 클수록 dissimilar vector를 나타낸다. 
  • Dot product: 두 벡터의 크기와 두 벡터 사이의 각도 코사인의 곱을 측정한다. 범위는 -∞ ~ ∞이며 양수 값은 같은 방향을 가리키는 벡터, 0은 직교 벡터, 음수 값은 반대 방향을 가리키는 벡터를 나타낸다. 

유사성 측정은 벡터 데이터베이스에서 얻은 결과에 영향을 미치기 때문에 사용 사례와 요구 사항에 따라 적절한 방법을 사용해야 한다.

4-3. 필터링 (Filtering)

데이터베이스에 저장된 모든 벡터에는 메타데이터도 포함되어 있으며, 벡터 데이터베이스는 메타데이터 쿼리를 기반으로 결과를 필터링할 수도 있다. 이를 위해 벡터 데이터베이스는 일반적으로 벡터 인덱스와 메타데이터 인덱스라는 두 개의 인덱스를 유지 관리한다. 그런 다음 벡터 검색 자체 전 또는 후에 메타데이터 필터링을 수행하지만 두 경우 모두 쿼리 프로세스가 느려지는 어려움이 있다.

https://www.pinecone.io/learn/vector-database/

  • Pre-filtering: 벡터 검색 전에 메타데이터 필터링이 수행된다. 이는 검색 공간을 줄이는 데 도움이 될 수 있지만 시스템이 메타데이터 필터 기준과 일치하지 않는 관련 결과를 간과하게 만들 수도 있다. 또한 광범위한 메타데이터 필터링으로 인해 추가된 계산 오버헤드로 인해 쿼리 프로세스 속도가 느려질 수 있다. 
  • Post-filtering: 벡터 검색 후에 메타데이터 필터링이 수행된다. 이는 관련 있는 모든 결과를 고려하는 데 도움이 되지만 검색이 완료된 후에 관련 없는 결과를 필터링해야하기 때문에 추가적인 오버헤드가 발생하고 쿼리 프로세스가 느려질 수 있다.

필터링 프로세스를 최적화하기 위해 벡터 데이터베이스는 메타데이터에 대한 고급 인덱싱 방법을 사용하거나 병렬 처리를 사용해 필터링 작업 속도를 높이는 등 다양한 기술을 사용한다.

5. 주요 벡터 데이터베이스 간 비교 (2023년 기준)

벡터 데이터베이스들 중 Pinecone, Weaviate, Milvus, Qdrant, Chroma, Elasticsearch, PGvector에 대해 정리한 표이다.

  Pinecone Weaviate Milvus Qdrant Chroma Elasticsearch PGvector
Is Open Source
Self-host
Cloud Management (✔️)
Purpose-built for Vectors
Developer Experience 👍👍👍 👍👍 👍👍 👍👍 👍👍 👍 👍
Community Community page & events 8k☆ github, 4k slack 23k☆ github, 4k slack 13k☆ github, 3k discord 9k☆ github, 6k discord 23k slack 6k☆ github
Queries per second (using text nytimes-256-angular) 150 *for p2, but more pods can be added 791 2406 326 ? 700-100 *from various reports 141
Latency, ms (Recall/Percentile 95 (millis), nytimes-256-angular) 1 *batched search, 0.99 recall, 200k SBERT 2 1 4 ? ? 8
Supported Index Types ? HNSW Multiple (11 total) HNSW HNSW HNSW HNSW/IVFFlat
Hybrid Search(i.e. scalar filtering)
Disk Index Support
Role-based Access Control
Dynamic Segment Placement vs. Static Data Sharding ? Static sharding Dynamic segment placement Static sharding Dynamic segment placement Static sharding -
Free Hosted Tier (free self-hosted) (free self-hosted) (free self-hosted) (varies)
Pricing (50k vectors @1536) $70 fr. $25 fr. $65 est. $9 Varies $95 Varies
Pricing (20M vectors, 20M req. @768) $227 ($2074 for high performance) $1536 fr. $309 ($2291 for high performance) fr. $281 ($820 for high performance) Varies est. $1225 Varies

출처: https://benchmark.vectorview.ai/vectordbs.html

 

각 데이터베이스에 대해 더 자세한 정보는 각 데이터베이스의 document를 확인해보자.

Pinecone

- https://www.pinecone.io/

 

Weaviate

- https://weaviate.io/

- https://github.com/weaviate/weaviate

 

Milvus

- https://milvus.io/

- https://github.com/milvus-io/milvus

 

Qdrant

- https://qdrant.tech/

- https://github.com/qdrant/qdrant

 

Chroma

- https://www.trychroma.com/

- https://github.com/chroma-core/chroma

 

Elasticsearch

- https://www.elastic.co/kr/elasticsearch

 

PGvector

- https://github.com/pgvector/pgvector

Reference

Embedding이란 무엇이고, 어떻게 사용하는가?

What is a Vector Database?

벡터 데이터베이스란?

Picking a vector database: a comparison and guide for 2023

Comments