Annoy vs Voyager: GenAI를 위한 올바른 벡터 검색 도구 선택하기
AI 기반 애플리케이션이 계속 성장함에 따라 빠르고 확장 가능한 벡터 검색 도구의 필요성이 필수적이 되었습니다. 벡터 검색은 추천 시스템, 이미지 검색, 자연어 처리(NLP), 그리고 고차원 데이터 간의 유사성을 찾는 것이 중요한 기타 분야의 핵심 요소입니다. 벡터 검색에 사용할 수 있는 많은 도구 중에서 Annoy와 Voyager는 널리 사용되는 두 가지 옵션으로, 각각 뚜렷한 장점을 제공합니다.
이 글에서는 Annoy와 Voyager를 비교하며, 기능, 검색 방법론, 확장성, 사용 사례에 초점을 맞춰 어떤 것이 귀하의 요구에 더 적합한지 결정하는 데 도움을 드리겠습니다.
벡터 검색이란?
Annoy와 Voyager의 세부 사항을 살펴보기 전에 벡터 검색을 이해하는 것이 중요합니다. 간단히 말해, 벡터 검색, 또는 벡터 유사도 검색은 주어진 쿼리 벡터와 가장 가까운 벡터(데이터 포인트)를 고차원 공간에서 찾습니다. 이러한 벡터는 종종 머신 러닝 모델에 의해 생성되어 비정형 데이터의 본질(예: 문장의 의미나 이미지의 특징)을 포착합니다.
정확한 일치나 필터링을 기반으로 검색이 이루어지는 전통적인 데이터베이스와 달리, 벡터 검색은 유사성에 중점을 둡니다. 목표는 거리 메트릭(예: 유클리드 거리 또는 코사인 유사도)을 기반으로 서로 "가까운" 벡터를 찾는 것입니다. 예를 들어, 벡터는 자연어 처리(NLP에서 단어나 문장을 나타낼 수 있으며, 벡터 검색은 의미적으로 가장 유사한 단어나 텍스트를 찾는 데 도움을 줍니다. 추천 시스템에서 벡터 검색은 사용자의 선호도에 가장 가까운 항목을 식별합니다. 벡터 검색은 또한 대규모 언어 모델(LLMs)에 추가적인 문맥 정보를 제공하여 그 출력을 보강하는 기술인 검색 증강 생성 (RAG)에서도 중요한 역할을 합니다.
벡터 검색을 수행하기 위해 시장에는 다음을 포함한 많은 솔루션이 있습니다:
- Annoy 및 Voyager와 같은 벡터 검색 라이브러리.
- Milvus, Zilliz Cloud (완전 관리형 Milvus)와 같은 목적 특화 벡터 데이터베이스
- Chroma 및 Milvus Lite와 같은 경량 벡터 데이터베이스.
- 벡터 검색 애드온이 포함된 전통적인 데이터베이스
Annoy란? 개요
Annoy (Approximate Nearest Neighbors Oh Yeah)는 고차원 공간에서 효율적인 근사 최근접 이웃(ANN) 검색을 위해 설계된 Spotify가 개발한 오픈 소스 라이브러리입니다. 주요 기능은 벡터 임베딩을 기반으로 주어진 쿼리 항목과 유사한 항목을 빠르게 찾는 것입니다. Annoy는 정확한 일치보다 "충분히 가까운" 결과를 빠르게 찾는 것이 더 중요한 대규모 데이터셋을 다룰 때 특히 유용합니다. 사용자 선호도를 기반으로 노래, 제품 또는 동영상과 같은 유사한 항목을 제안하는 추천 엔진을 구축하는 데 자주 사용됩니다.
Annoy의 핵심 기능 및 강점
- 근사 최근접 이웃 검색: Annoy는 근사 최근접 이웃(ANN) 검색을 수행하는 속도로 잘 알려져 있으며, 이는 정확한 일치를 요구하지 않고도 “충분히 가까운” 결과를 제공합니다. 이는 정확한 검색이 너무 느리거나 리소스를 많이 소모할 수 있는 대규모 데이터셋을 다루는 애플리케이션에 특히 유용합니다.
- 트리 기반 인덱싱: Annoy는 랜덤 프로젝션 트리를 사용하여 데이터를 인덱싱하며, 데이터를 더 관리하기 쉬운 하위 집합으로 구성함으로써 검색 쿼리 속도를 높입니다.
- 디스크 기반 저장소: Annoy의 가장 가치 있는 기능 중 하나는 인덱스를 디스크에 저장한다는 점입니다. 이는 메모리에 맞지 않는 대규모 데이터셋도 효율적으로 인덱싱하고 검색할 수 있음을 의미합니다. Annoy의 디스크 기반 저장소는 또한 서로 다른 프로세스 간에 인덱스를 공유할 수 있게 해주어 메모리 사용량을 줄이는 데 도움이 됩니다.
- 메모리 효율성: Annoy는 메모리와 효율적으로 작동하도록 최적화되어 있습니다. 메모리에서 인덱스를 구축하고 디스크에 저장할 수 있어 RAM이 충분하지 않더라도 대규모 데이터셋을 처리할 수 있습니다. 이 기능은 시스템 메모리가 제약 조건인 경우에 특히 유용합니다.
- 불변 인덱스: Annoy에서 인덱스가 한 번 구축되면 수정할 수 없습니다. 데이터셋이 변경되면 전체 인덱스를 다시 구축해야 합니다. 이는 데이터가 자주 변경되지 않는 정적 데이터셋에 적합한 선택이 됩니다.
- 배치 쿼리: 여러 쿼리를 병렬로 실행할 수 있어, 특히 높은 처리량이 필요한 애플리케이션에서 검색 프로세스를 더욱 최적화하는 데 도움이 됩니다.
- 언어 지원: Annoy는 주로 Python에서 사용되지만, 성능상의 이유로 C++로 작성되었습니다.
Annoy의 강점은 단순성과 고차원 벡터 검색을 빠르고 효율적으로 처리할 수 있는 능력에 있습니다. 하지만 이러한 성능 향상을 달성하기 위해 어느 정도의 정확성을 희생합니다.
Voyager란 무엇인가? 개요
Voyager는 Annoy를 대체하도록 설계된 Spotify의 최신 벡터 검색 라이브러리입니다. hnswlib 위에 구축된 Voyager는 더 높은 속도와 정확도, 더 나은 메모리 효율성, 더 폭넓은 유연성을 요구하는 현대적인 최근접 이웃 검색 사용 사례에 최적화되어 있습니다. 또한 엔터프라이즈 수준 배포에 더 적합하게 만드는 강력한 프로덕션 준비 기능도 제공합니다.
Voyager의 핵심 기능 및 강점
- 속도와 정확도: Voyager는 동일한 재현율을 유지하면서 Annoy보다 10배 이상의 속도를 제공합니다. 또한 동일한 속도 수준에서 최대 50% 더 높은 정확도를 제공하여 성능을 저하시키지 않고 더 정밀한 결과를 제공합니다.
- 메모리 효율성: Voyager는 E4M3 8비트 부동소수점 표현을 사용한 덕분에 Annoy보다 최대 4배 적은 메모리를 사용하여 매우 메모리 효율적입니다. 이는 메모리 제약이 있는 환경에 이상적입니다.
- 멀티스레딩 및 확장성: Voyager는 멀티스레드 인덱스 생성 및 쿼리를 지원하여 확장성이 매우 뛰어납니다. 작은 앱을 구축하든 대규모 엔터프라이즈 솔루션을 구축하든 Voyager는 워크로드를 효율적으로 처리할 수 있습니다.
- 언어 지원: Python만 지원하는 많은 최근접 이웃 검색 도구와 달리, Voyager는 Python과 Java 모두에 대해 동일한 인터페이스를 제공하여 다양한 개발 환경에서 더 다재다능합니다.
- 장애 허용 및 프로덕션 준비: Voyager는 손상 감지 기능이 있는 장애 허용 인덱스 파일을 포함하여, 시스템이 데이터 손상 위험 없이 대규모 배포를 처리할 수 있도록 보장합니다.
- Google Cloud 통합: Voyager는 Google Cloud Services에서 스트림 기반 I/O를 위한 내장 지원을 제공하여 클라우드에서 인덱스를 직접 스트리밍할 수 있게 하며, 이는 대규모 데이터셋 관리를 단순화할 수 있습니다.
Voyager는 프로덕션 사용을 염두에 두고 설계되었으며, 속도, 정확도, 메모리 효율성을 제공하는 동시에 강력한 언어 지원과 클라우드 기반 인프라와의 호환성을 제공합니다.
Annoy와 Voyager의 주요 차이점
검색 방법론
Annoy는 근사 최근접 이웃 검색을 위해 랜덤 프로젝션 트리를 사용하며, 일부 정확도를 희생하는 대신 속도를 우선시합니다. 이 방법은 검색 데이터셋이 크고 완벽한 결과가 필요하지 않을 때 잘 작동합니다. 반면 Voyager는 hnswlib를 기반으로 하며, Hierarchical Navigable Small World (HNSW) 알고리즘을 사용합니다. 이 방법은 더 나은 정확도와 속도를 제공하며, 대부분의 사용 사례에서 Annoy보다 뛰어나고, 특히 정밀도가 중요할 때 그렇습니다.
데이터 처리
Annoy는 비정형 데이터와 고차원 벡터 검색에 최적화되어 있습니다. 트리 기반 접근 방식은 대량의 데이터를 효율적으로 처리하지만, 정형 또는 반정형 데이터에 관해서는 그다지 유연하지 않습니다. 반면 Voyager는 더 유연합니다. 둘 다 벡터 데이터를 처리하지만, Voyager의 설계, 특히 멀티스레딩 및 Google Cloud 통합은 여러 데이터 유형이 관련된 더 복잡하고 대규모인 데이터 환경에 더 적합하게 만듭니다.
확장성 및 성능
두 도구 모두 확장성이 뛰어나지만, Voyager는 멀티스레드 인덱스 생성 및 쿼리 지원을 통해 더 많은 확장성 옵션을 제공합니다. Voyager의 내결함성 인덱스 파일과 클라우드 호환성도 분산 시스템이나 클라우드 환경 전반으로 확장하기 쉽게 만듭니다. Annoy는 배포가 더 간단하고 대규모 데이터셋을 효율적으로 처리할 수 있지만, 엔터프라이즈 수준의 확장성이나 클라우드 네이티브 아키텍처에서는 그만큼 견고하지 않습니다.
유연성 및 사용자 지정
Annoy는 기본적인 사용자 지정을 제공하지만, 주요 초점은 근사 최근접 이웃 검색에 있어 다양한 데이터 유형이나 검색 방법론에 적응하는 유연성이 제한됩니다. 반면 Voyager는 사용자 지정을 염두에 두고 구축되었습니다. 사용자는 속도, 정확도, 지연 시간, 비용 간의 균형을 맞추며 특정 요구 사항에 따라 성능을 미세 조정할 수 있습니다. 이로 인해 Voyager는 더 맞춤화된 솔루션이 필요한 애플리케이션에 더 적합합니다.
통합 및 생태계
Annoy는 독립형 라이브러리로, 더 큰 생태계에 통합하기 위한 지원이 제한적입니다. Python 기반 프로젝트와는 잘 작동하지만, 엔터프라이즈 환경에 필요한 더 광범위한 통합 기능은 부족합니다. Voyager는 이 부분에서 두각을 나타내며, Google Cloud와 같은 클라우드 기반 서비스와의 원활한 통합과 Java 및 Python에 대한 완전한 지원을 제공합니다. 이를 통해 Voyager를 더 큰 데이터 파이프라인, 머신 러닝 워크플로, 엔터프라이즈 시스템에 더 쉽게 통합할 수 있습니다.
사용 편의성
Annoy의 단순성은 가장 큰 장점 중 하나입니다. 특히 Python 환경에서 작업하는 경우 설정하고 사용하기 쉽습니다. 하지만 범위는 비교적 제한적입니다. 반면 Voyager는 더 많은 기능과 유연성을 제공하지만, 추가 기능과 사용자 지정 옵션으로 인해 학습 곡선이 약간 더 높습니다. Voyager가 프로덕션 준비가 되어 있고 Python과 Java 모두에 대한 광범위한 문서를 포함하고 있다는 점은 더 복잡한 시스템에 통합하는 과정을 쉽게 하는 데 도움이 됩니다.
비용 고려 사항
Annoy는 완전히 오픈 소스이며 라이선스 비용이 없습니다. 하지만 사용자는 대규모 환경에 배포할 때 여전히 인프라 및 확장 비용을 고려해야 합니다. 더 새롭고 고급인 Voyager는 특히 인덱스 호스팅에 Google Cloud와 같은 관리형 서비스를 사용하는 경우 추가 비용이 발생할 수 있습니다. 그렇지만 Voyager의 메모리 효율성과 대규모 데이터셋을 확장된 규모로 처리하는 능력은 시간이 지남에 따라 비용 절감으로 이어질 수 있으며, 특히 엔터프라이즈 수준의 애플리케이션에서 그렇습니다.
보안 기능
Annoy에는 기본 제공 보안 기능이 포함되어 있지 않습니다. 필요한 경우 사용자는 암호화, 인증, 액세스 제어를 별도로 구현해야 합니다. Voyager는 프로덕션 환경을 위해 설계되었기 때문에 장애 허용 인덱스 파일과 손상 감지에 대한 지원이 더 우수하지만, 암호화 및 액세스 제어와 같은 보안 기능은 여전히 도구 자체 외부에서 구현해야 합니다.
Annoy를 선택해야 할 때
다음과 같은 경우 Annoy는 탁월한 선택입니다:
- 근사 최근접 이웃 검색으로 충분한 소규모 프로젝트를 진행하고 있는 경우.
- 애플리케이션이 구조화 또는 반구조화 데이터를 처리할 필요가 없는 경우.
- 정확도보다 속도를 우선시하고, 검색 결과의 정밀도가 덜 중요한 경우.
- 메모리 리소스에 제약이 있지만 대규모 데이터셋을 효율적으로 처리해야 하는 경우.
- 팀이 최소한의 설정으로 사용할 수 있는 가볍고 사용하기 쉬운 도구를 선호하는 경우.
Voyager를 선택해야 할 때
다음과 같은 경우 Voyager가 더 나은 선택입니다:
- 높은 수준의 정확도가 필요하고 최근접 이웃 검색에서 정밀한 결과가 필요한 경우.
- 애플리케이션이 구조화, 반구조화, 비구조화 데이터를 처리하며 더 많은 유연성이 필요한 경우.
- 대규모 클라우드 기반 환경에서 작업하고 있으며 Google Cloud와 같은 클라우드 서비스와의 통합이 원활해야 하는 경우.
- 프로젝트에서 속도, 정확도, 비용의 균형을 맞춰야 하며, 검색 알고리즘과 데이터 처리를 사용자 지정할 수 있는 옵션이 필요한 경우.
- Python 및 Java 모두에 대한 강력한 지원과 견고한 장애 허용 기능을 갖춘 프로덕션 준비 완료 솔루션이 필요한 경우.
벡터 검색 라이브러리와 목적별 벡터 데이터베이스 비교
Annoy 및 Voyager와 같은 벡터 검색 라이브러리와 Milvus와 같은 목적별 벡터 데이터베이스는 모두 고차원 벡터 데이터의 유사도 검색 문제를 해결하는 것을 목표로 하지만, 서로 다른 역할을 수행합니다.
벡터 검색 라이브러리는 효율적인 최근접 이웃 검색 작업에만 집중합니다. 이들은 쿼리 벡터와 유사한 벡터를 찾기 위한 가볍고 빠른 솔루션을 제공합니다. 이러한 라이브러리는 종종 더 작은 단일 노드 환경이나 정적 또는 중간 규모 데이터셋을 사용하는 애플리케이션에서 사용됩니다. 그러나 일반적으로 동적 데이터를 관리하거나, 지속성을 제공하거나, 분산 시스템 전반으로 확장하기 위한 기능은 부족합니다. 이러한 라이브러리를 사용하는 개발자는 일반적으로 데이터 관리, 업데이트, 확장을 수동으로 처리해야 합니다.
반면에 Milvus 및 Zilliz Cloud(관리형 Milvus)와 같은 목적별 벡터 데이터베이스는 대규모 벡터 데이터 관리를 위해 설계된 포괄적인 시스템입니다. 이러한 데이터베이스는 단순한 벡터 검색을 넘어 영구 스토리지, 실시간 업데이트, 분산 아키텍처, 고급 쿼리 기능과 같은 기능을 제공합니다. 동적 데이터셋을 지원하며 데이터가 자주 업데이트되는 실시간 애플리케이션도 쉽게 처리할 수 있습니다. 또한 벡터 데이터베이스는 벡터 검색을 기존 필터링 및 메타데이터 쿼리와 결합하기 위한 통합 지원을 포함하는 경우가 많아, 확장성, 고가용성, 더 복잡한 검색 기능이 필요한 프로덕션 환경에 이상적입니다.
- Zilliz Cloud의 최신 신규 기능 및 개선 사항을 확인해 보세요: Zilliz Cloud 업데이트: 마이그레이션 서비스, Fivetran 커넥터, 다중 복제본 등
각 벡터 검색 솔루션을 선택해야 할 때
다음과 같은 경우 벡터 검색 라이브러리를 선택하세요:
- 소규모에서 중간 규모의 비교적 정적인 데이터셋이 있는 경우.
- 인덱싱 및 검색 알고리즘에 대한 완전한 제어를 선호하는 경우.
- 기존 시스템에 검색을 임베딩하고 있으며 인프라를 관리할 수 있는 경우.
다음과 같은 경우 목적별 벡터 데이터베이스를 선택하세요:
- 분산 시스템 전반에서 수십억 개의 벡터로 확장해야 합니다.
- 데이터셋이 자주 변경되어 실시간 업데이트가 필요합니다.
- 스토리지, 확장, 쿼리 최적화를 대신 처리해 주는 관리형 솔루션을 선호합니다.
요약하면, 벡터 검색 라이브러리는 속도와 메모리 효율성이 우선순위이지만 운영 복잡성은 최소화되는 더 단순하고 소규모의 사용 사례에 가장 적합합니다. 반면 목적별로 구축된 벡터 데이터베이스는 동적 데이터 처리, 확장성, 사용 편의성이 요구되는 대규모 프로덕션급 시스템을 위해 설계되었으며, 복잡한 애플리케이션을 관리하는 개발자에게 상당한 운영상 이점을 제공하는 경우가 많습니다.
모든 벡터 검색 솔루션 평가 및 비교
좋습니다. 이제 다양한 벡터 검색 솔루션 간의 차이를 알아보았습니다. 다음 질문은 다음과 같습니다. 검색 알고리즘이 정확한 결과를 반환하고 동시에 매우 빠르게 작동하도록 어떻게 보장할 수 있을까요? 특히 대규모 환경에서 다양한 ANN 알고리즘의 효과를 어떻게 평가할 수 있을까요?
이러한 질문에 답하려면 벤치마킹 도구가 필요합니다. 이러한 도구는 많이 있으며, 그중 가장 효율적인 두 가지가 두드러집니다: ANN benchmarks 및 VectorDBBench.
ANN benchmarks
ANN Benchmarks(Approximate Nearest Neighbor Benchmarks)는 다양한 근사 최근접 이웃(ANN) 알고리즘의 성능을 평가하고 비교하도록 설계된 오픈 소스 프로젝트입니다. 고차원 벡터 검색과 같은 작업에서 다양한 알고리즘을 벤치마킹하기 위한 표준화된 프레임워크를 제공하여, 개발자와 연구자가 다양한 데이터셋 전반에서 검색 속도, 정확도, 메모리 사용량과 같은 지표를 측정할 수 있게 합니다. ANN-Benchmarks를 사용하면 Faiss, Annoy, HNSWlib 및 기타 라이브러리에서 볼 수 있는 알고리즘의 속도와 정밀도 간 트레이드오프를 평가할 수 있어, 특정 애플리케이션에 어떤 알고리즘이 가장 적합한지 이해하는 데 유용한 도구가 됩니다.
ANN Benchmarks GitHub repository: https://github.com/erikbern/ann-benchmarks
ANN Benchmarks Website: https://ann-benchmarks.com/
VectorDBBench: 오픈 소스 벤치마킹 도구
VectorDBBench는 고성능 데이터 저장 및 검색 시스템, 특히 벡터 데이터베이스가 필요한 사용자를 위해 설계된 오픈 소스 벤치마킹 도구입니다. 이 도구를 사용하면 사용자는 자체 데이터셋을 사용하여 Milvus 및 Zilliz Cloud(관리형 Milvus)와 같은 다양한 벡터 데이터베이스 시스템의 성능을 테스트하고 비교하며, 자신의 사용 사례에 가장 적합한 시스템을 결정할 수 있습니다. VectorDBBench는 Python으로 작성되었으며 MIT 오픈 소스 라이선스에 따라 라이선스가 부여되어 누구나 자유롭게 사용, 수정, 배포할 수 있습니다.
VectorDBBench GitHub repository: https://github.com/zilliztech/VectorDBBench
VectorDBBench Leaderboard. 에서 주류 벡터 데이터베이스의 성능을 빠르게 살펴보세요.
VectorDB 평가에 관한 기법 및 인사이트:
VectorDB, GenAI 및 ML에 관한 추가 리소스
계속 읽기

Zilliz Cloud Enterprise Vector Search Powers High-Performance AI on AWS
Zilliz Cloud on AWS powers secure, scalable, ultra-fast vector search for enterprise AI apps, with BYOC, sub-10ms latency, and zero-DevOps simplicity.

VidTok: Rethinking Video Processing with Compact Tokenization
VidTok tokenizes videos to reduce redundancy while preserving spatial and temporal details for efficient processing.

DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding
Explore DeepSeek-VL2, the open-source MoE vision-language model. Discover its architecture, efficient training pipeline, and top-tier performance.
The Definitive Guide to Choosing a Vector Database
Overwhelmed by all the options? Learn key features to look for & how to evaluate with your own data. Choose with confidence.


