벡터 데이터베이스, 벡터 검색 라이브러리, 벡터 검색 플러그인 비교하기
안녕하세요, 벡터 데이터베이스 101에 다시 오신 것을 환영합니다!
ChatGPT 및 기타 대규모 언어 모델(LLM)의 급증으로 인해 벡터 검색 기술이 성장하고 있으며, 기존 데이터베이스 내에 FAISS 및 통합 벡터 검색 플러그인과 같은 라이브러리와 함께 Milvus 및 Zilliz Cloud와 같은 전문 벡터 데이터베이스가 등장했습니다.
이전 시리즈 게시물에서는 벡터 데이터베이스의 기초에 대해 자세히 살펴보았습니다. 이번 글에서는 벡터 데이터베이스, 벡터 검색 플러그인, 벡터 검색 라이브러리를 비교하면서 벡터 검색의 복잡한 영역을 계속해서 살펴보겠습니다.
벡터 검색이란 무엇인가요?
벡터 유사도 검색이라고도 하는벡터 검색은 광범위한 고밀도 벡터 데이터 모음 중에서 주어진 쿼리 벡터와 가장 유사하거나 의미적으로 관련된 상위 k개의 결과를 검색하는 기법입니다. 유사도 검색을 수행하기 전에 신경망을 활용하여 텍스트, 이미지, 동영상, 오디오와 같은 비정형 데이터를 임베딩 벡터라는 고차원 숫자 벡터로 변환합니다. 임베딩 벡터를 생성한 후, 벡터 검색 엔진은 입력 쿼리 벡터와 벡터 저장소에 있는 벡터 사이의 공간적 거리를 비교합니다. 공간적으로 가까울수록 더 유사합니다.
Python의 NumPy와 같은 머신 러닝 라이브러리, FAISS와 같은 벡터 검색 라이브러리, 기존 데이터베이스에 구축된 벡터 검색 플러그인, Milvus 및 Zilliz Cloud와 같은 전문 벡터 데이터베이스 등 다양한 벡터 검색 기술이 시중에 나와 있습니다.
벡터 데이터베이스와 벡터 검색 라이브러리 비교
전문화된 벡터 데이터베이스만이 유사도 검색을 위한 유일한 스택은 아닙니다. 벡터 데이터베이스가 등장하기 전에는 FAISS, ScaNN, HNSW와 같은 많은 벡터 검색 라이브러리가 벡터 검색에 사용되었습니다.
벡터 검색 라이브러리는 고성능 프로토타입 벡터 검색 시스템을 빠르게 구축하는 데 도움이 될 수 있습니다. FAISS를 예로 들어보면, 효율적인 유사도 검색과 고밀도 벡터 클러스터링을 위해 Meta에서 개발한 오픈 소스입니다. FAISS는 메모리에 완전히 로드할 수 없는 벡터 컬렉션을 포함해 모든 크기의 벡터 컬렉션을 처리할 수 있습니다. 또한 FAISS는 평가 및 파라미터 튜닝을 위한 도구도 제공합니다. C++로 작성되었지만 FAISS는 Python/NumPy 인터페이스도 제공합니다.
그러나 벡터 검색 라이브러리는 관리형 솔루션이 아닌 경량 ANN 라이브러리일 뿐이며 기능이 제한적입니다. 데이터 세트가 작고 제한적인 경우, 이러한 라이브러리는 프로덕션 환경에서 실행되는 시스템에서도 비정형 데이터 처리에 충분할 수 있습니다. 그러나 데이터 세트의 크기가 커지고 더 많은 사용자가 온보딩되면 규모 문제를 해결하기가 점점 더 어려워집니다. 게다가 인덱스 데이터에 대한 수정을 허용하지 않으며 데이터 가져오기 중에 쿼리할 수 없습니다.
이에 비해 벡터 데이터베이스는 비정형 데이터 저장 및 검색에 보다 최적화된 솔루션입니다. 수백만 또는 수십억 개의 벡터를 저장하고 쿼리하는 동시에 실시간 응답을 제공할 수 있으며, 사용자의 증가하는 비즈니스 요구 사항을 충족할 수 있도록 확장성이 뛰어납니다.
또한 Milvus와 같은 벡터 데이터베이스는 클라우드 네이티브, 멀티테넌시, 확장성 등 정형/반정형 데이터에 대해 훨씬 더 사용자 친화적인 기능을 갖추고 있습니다. 이러한 기능은 이 튜토리얼을 자세히 살펴보면서 더 명확해질 것입니다.
또한 벡터 검색 라이브러리와는 완전히 다른 추상화 계층에서 작동합니다. 벡터 데이터베이스는 완전한 서비스인 반면, ANN 라이브러리는 개발 중인 애플리케이션에 통합되기 위한 것입니다. 이러한 의미에서 ANN 라이브러리는 벡터 데이터베이스가 구축되는 많은 구성 요소 중 하나이며, 이는 마치 Elasticsearch가 Apache Lucene 위에 구축되는 방식과 유사합니다.
이러한 추상화가 중요한 이유를 설명하기 위해 벡터 데이터베이스에 새로운 비정형 데이터 요소를 삽입하는 경우를 예로 들어보겠습니다. Milvus에서는 이 작업이 매우 쉽습니다:
from pymilvus import Collectioncollection = Collection('book')mr = collection.insert(data)
코드 3줄만 추가하면 됩니다. 안타깝게도 FAISS나 ScaNN과 같은 라이브러리를 사용하면 특정 체크포인트에서 전체 인덱스를 수동으로 다시 만들지 않고는 이 작업을 쉽게 수행할 방법이 없습니다. 가능하다고 하더라도 벡터 검색 라이브러리는 가장 중요한 벡터 데이터베이스 기능인 확장성과 멀티테넌시가 부족합니다.
벡터 데이터베이스와 기존 데이터베이스용 벡터 검색 플러그인 비교
이제 벡터 검색 라이브러리와 벡터 데이터베이스의 차이점을 알아보았으니, 벡터 데이터베이스가 벡터 검색 플러그인과 어떻게 다른지 살펴봅시다.
점점 더 많은 전통적인 관계형 데이터베이스와 Clickhouse 및 Elasticsearch와 같은 검색 시스템에서 벡터 검색 플러그인을 기본으로 포함하고 있습니다. 예를 들어, Elasticsearch 8.0에는 restful API 엔드포인트를 통해 호출할 수 있는 벡터 삽입 및 ANN 검색 기능이 포함되어 있습니다. 이러한 솔루션은 임베딩 관리와 벡터 검색에 대한 풀스택 접근 방식을 취하지 않는다는 점에서 벡터 검색 플러그인의 문제는 밤낮으로 명확해야 합니다. 대신, 이러한 플러그인은 기존 아키텍처를 개선하기 위한 것이기 때문에 제한적이고 최적화되지 않습니다. 기존 데이터베이스 위에 비정형 데이터 애플리케이션을 개발하는 것은 가스 구동 자동차의 프레임 안에 리튬 배터리와 전기 모터를 장착하는 것과 같으며, 좋은 생각이 아닙니다!
그 이유를 설명하기 위해 벡터 데이터베이스가 구현해야 하는 기능 목록(첫 번째 섹션에서)으로 돌아가 보겠습니다. 벡터 검색 플러그인에는 이 중 두 가지 기능, 즉 조정 가능성과 사용자 친화적인 API/SDK가 빠져 있습니다. 다른 벡터 검색 플러그인도 매우 유사하게 작동하므로 더 이상 자세히 설명하지 않고 Elasticsearch의 ANN 엔진을 예로 들어 설명하겠습니다. Elasticsearch는 dense_vector
데이터 필드 유형을 통해 벡터 저장소를 지원하며 knnsearch endpoint
을 통해 쿼리할 수 있습니다:
PUT index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 128,
"index": true,
"similarity": "l2_norm"
}
}
}
}
PUT index/_doc
{
"image-vector": [0.12, 1.34, ...]
}
GET index/_knn_search
{
"knn": {
"field": "image-vector",
"query_vector": [-0.5, 9.4, ...],
"k": 10,
"num_candidates": 100
}
}
Elasticsearch의 ANN 플러그인은 하나의 인덱싱 알고리즘만 지원합니다: 계층적 탐색이 가능한 작은 세계, 즉 HNSW라고도 합니다(멀티버스를 대중화하는 데 있어서는 제작자가 Marvel보다 앞서 있었다고 생각합니다). 게다가 거리 측정 기준으로는 L2/유클리드 거리만 지원됩니다. 시작은 괜찮지만 본격적인 벡터 데이터베이스인 Milvus와 비교해 보겠습니다. pymilvus
을 사용합니다:
>>> field1 = FieldSchema(name='id', dtype=DataType.INT64, description='int64', is_primary=True)
>>> field2 = FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, description='embedding', dim=128, is_primary=False)
>>> schema = CollectionSchema(fields=[field1, field2], description='hello world collection')
>>> collection = Collection(name='my_collection', data=None, schema=schema)
>>> index_params = {
'index_type': 'IVF_FLAT',
'params': {'nlist': 1024},
"metric_type": 'L2'}
>>> collection.create_index('embedding', index_params)
>>> search_param = {
'data': vector,
'anns_field': 'embedding',
'param': {'metric_type': 'L2', 'params': {'nprobe': 16}},
'limit': 10,
'expr': 'id_field > 0'
}
>>> results = collection.search(**search_param)
Elasticsearch와 Milvus 모두 인덱스 생성, 임베딩 벡터 삽입, 가장 가까운 이웃 검색을 수행하는 방법을 가지고 있지만, 이 예제를 통해 Milvus가 더 직관적인 벡터 검색 API(더 나은 사용자 인터페이스 API)와 더 광범위한 벡터 인덱스 + 거리 메트릭 지원(더 나은 조정 가능성)을 가지고 있다는 것을 알 수 있습니다. Milvus는 향후 더 많은 벡터 인덱스를 지원하고 SQL과 유사한 문을 통해 쿼리할 수 있도록 하여 조정 가능성과 사용성을 더욱 개선할 계획입니다.
방금 꽤 많은 내용을 설명했습니다. 이 섹션은 상당히 길기 때문에 대충 훑어보신 분들을 위해 간단히 요약하자면, Milvus는 처음부터 벡터 데이터베이스로 구축되어 더 풍부한 기능과 비정형 데이터에 더 적합한 아키텍처를 제공하므로 벡터 검색 플러그인보다 낫다는 것입니다.
다양한 벡터 검색 기술 중에서 선택하는 방법은 무엇인가요?
모든 벡터 데이터베이스가 똑같이 만들어지는 것은 아니며, 각 데이터베이스는 특정 애플리케이션에 맞는 고유한 특성을 가지고 있습니다. 벡터 검색 라이브러리와 플러그인은 사용자 친화적이며 수백만 개의 벡터가 있는 소규모 프로덕션 환경을 처리하는 데 이상적입니다. 데이터 크기가 작고 기본적인 벡터 검색 기능만 필요한 경우, 이러한 기술만으로도 충분합니다.
하지만 수억 개의 벡터를 다루고 실시간 응답을 요구하는 데이터 집약적인 비즈니스에는 전문 벡터 데이터베이스가 가장 적합한 선택이 될 것입니다. 예를 들어 Milvus는 수십억 개의 벡터를 손쉽게 관리할 수 있으며, 초고속 쿼리 속도와 풍부한 기능을 제공합니다. 또한 Zilliz와 같은 완전 관리형 솔루션은 운영상의 어려움에서 벗어나 핵심 비즈니스 활동에만 집중할 수 있어 더욱 유리합니다.
벡터 데이터베이스 101 강좌를 다시 한 번 살펴보세요.
- 벡터 검색이란 무엇인가요?
- 벡터 데이터베이스와 벡터 검색 라이브러리 비교
- 벡터 데이터베이스와 기존 데이터베이스용 벡터 검색 플러그인 비교
- 다양한 벡터 검색 기술 중에서 선택하는 방법은 무엇인가요?
- 벡터 데이터베이스 101 강좌를 다시 한 번 살펴보세요.
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word