Vector Similarity Search with DuckDB: A Practical Guide to the VSS Extension

개요

DuckDB에 추가된 VSS(Vector Similarity Search) 익스텐션은 HNSW(Hierarchical Navigable Small Worlds) 알고리즘을 활용하여 DuckDB 네이티브 ARRAY 타입 컬럼에서 근사 최근접 이웃(ANN) 검색을 지원한다.

주요 내용

* VSS 익스텐션의 기능: DuckDB의 ARRAY 컬럼에 대한 유사도 검색을 가속화하기 위한 인덱싱 기능을 제공하며, HNSW 알고리즘을 구현하여 별도의 서비스나 인프라 없이 SQL 엔진 내에서 벡터 인덱스를 직접 관리한다.
* 설치 및 사용법: INSTALL vss; LOAD vss; 명령어로 익스텐션을 설치하고 로드한 후, 고정된 크기의 FLOAT ARRAY 컬럼을 가진 테이블을 생성하고 HNSW 인덱스를 CREATE INDEX ... USING HNSW (vec); 명령어로 구축한다.
* 쿼리 및 인덱스 활용: 인덱스가 생성된 후, ORDER BY array_distance(...) LIMIT k 형태의 쿼리에서 DuckDB는 자동으로 HNSW 인덱스를 스캔하여 검색하며, min_by 집계 함수도 인덱스 가속화를 지원한다.
* 지원 거리 메트릭: 기본적으로 l2sq (squared Euclidean distance)를 사용하며, 인덱스 생성 시 cosine (Cosine similarity distance) 또는 ip (Negative inner product) 메트릭을 선택할 수 있다.
* 인덱스 튜닝: ef_construction, ef_search, M, M0와 같은 HNSW 하이퍼파라미터를 통해 인덱스 품질과 검색 속도를 조절할 수 있으며, SET hnsw_ef_search = ...; 명령어로 런타임에 ef_search 값을 변경할 수 있다.
* 지속성(Persistence) 제약: 기본적으로 HNSW 인덱스는 인메모리 데이터베이스에서만 생성 가능하며, 디스크 기반 .duckdb 파일에서 인덱스를 사용하려면 SET hnsw_enable_experimental_persistence = true; 플래그를 활성화해야 한다. 이 기능은 WAL 복구가 완벽하게 구현되지 않아 프로덕션 환경에서는 권장되지 않으며, 비정상 종료 시 인덱스 손상이나 데이터 손실 가능성이 있다.
* 데이터 변경: 인덱스 생성 후에도 삽입, 업데이트, 삭제가 가능하지만, 대량 데이터 로드 후 인덱스를 구축하는 것이 더 효율적이다. 삭제는 지연 삭제 방식으로 처리되며, PRAGMA hnsw_compact_index('index_name'); 명령어나 인덱스 재구축을 통해 공간을 회수해야 한다.
* 추가 기능 (Fuzzy Joins): vss_joinvss_match 테이블 매크로를 통해 두 벡터 세트 간의 유사도 매칭을 수행할 수 있으며, 이는 중복 제거, 개체 식별 등에 유용하다. 이 매크로들은 HNSW 인덱스를 사용하지 않고 브루트 포스 검색을 수행한다.
* 제한 사항: 현재 32비트 FLOAT 벡터만 지원하며, 인덱스는 RAM에 모두 로드되어야 한다. 지속성 인덱스는 실험적인 플래그를 필요로 하며, vss_join / vss_match 매크로는 인덱스를 사용하지 않는다.

시사점

DuckDB의 VSS 익스텐션은 별도의 벡터 데이터베이스 없이 DuckDB 내에서 직접 벡터 유사도 검색 기능을 통합하고자 하는 로컬 우선 RAG 시스템, 임베딩 볼륨이 작고 인메모리 또는 실험적 지속성으로 충분한 시나리오, 그리고 SQL 워크플로우 내에서 벡터 검색을 통합하려는 경우에 강력한 솔루션이 될 수 있다. 그러나 대규모 다중 작성 프로덕션 환경에서 내구성이 뛰어나고 충돌 방지 기능이 있는 인덱스가 필요한 경우에는 외부 벡터 데이터베이스나 pgvector와 같은 확장이 더 안전한 선택이다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions