타이거데이터(Tiger Data, 옛 타임스케일)가 10월 13일(현지시간) 포스트그레SQL용 오픈소스 벡터 검색 확장 "pg_vectorsearch"를 발표하고 첫 정식 버전 0.1.0을 깃허브에 공개했다.
핵심은 PRISM이라는 새 인덱스다. pgvector의 HNSW처럼 벡터끼리 그래프로 잇지 않고, 비슷한 벡터를 파티션으로 묶어 압축해 저장한다. 회사는 1억 벡터에서 HNSW보다 메모리가 4분의 1인 머신으로 더 빠른 검색과 20배 넘게 빠른 인덱스 빌드를 냈다고 밝혔다. 다만 상태는 아직 알파다.
- pg_vectorsearch의 PRISM 인덱스는 IVF 계열 파티션 방식에 계층형 라우팅과 RaBitQ 양자화를 결합했다. 라이선스는 PostgreSQL 라이선스, 포스트그레SQL 18 이상이 필요하다.
- 타이거데이터 벤치마크에서 1억 벡터 기준 PRISM은 128GB 머신에서 1시간 40분에 빌드, 재현율 95%에서 p50 6ms. HNSW는 512GB 머신에서 42시간 걸려 8ms였다.
- 기존 pgvector의
vector·halfvec컬럼에 그대로 인덱스를 만들 수 있다. 다만 알파 단계라 운영 환경용은 아니며, 기존 pgvectorscale은 유지보수 모드로 들어간다.
무슨 일이무슨 일이 있었나
타이거데이터는 발표 글에서 벡터 검색이 나머지 데이터와 같은 데이터베이스에 있을 때 더 쓸모 있다고 강조했다. RAG, 시맨틱 검색, 추천에서 벡터를 포스트그레스에 두면 결과를 애플리케이션 데이터와 조인하고, 한 트랜잭션으로 함께 갱신하고, 익숙한 SQL 도구를 그대로 쓸 수 있다. pgvector가 이것을 가능하게 했고 HNSW가 사실상 표준 인덱스가 됐다.
문제는 메모리다. HNSW 그래프 탐색은 무작위 읽기를 반복하기 때문에 좋은 성능을 내려면 그래프 대부분이 메모리에 있어야 한다. 회사 벤치마크에서 1억 벡터 HNSW 빌드가 끝난 가장 작은 머신은 RAM 512GB였다. 이런 자원 요구가 팀을 포스트그레스 밖의 전용 벡터 DB로 밀어낸다는 것이 타이거데이터의 문제의식이다.
깃허브 릴리스 기록을 보면 10월 9일 0.1.0-rc1, 10월 12일 rc2를 거쳐 10월 13일 0.1.0이 나왔다. 릴리스 노트는 첫 버전이 "알파 수준"이며 핵심 기능은 동작하지만 알아야 할 공백이 있다고 명시했다.
핵심 내용벤치마크 숫자
타이거데이터는 모든 결과를 공개 벤치마크 도구로 측정했고, 재현율은 정확한 전수 검색 대비 recall@10이며, HNSW는 가장 유리했던 pgvector 16비트 halfvec으로 돌렸다고 밝혔다. 1억 개의 Cohere 임베딩을 AWS r8i.4xlarge(16 vCPU, 128GiB)와 r8i.16xlarge(64 vCPU, 512GiB, 시간당 비용 4배)에 올렸다.
작은 규모에서도 같은 경향이라고 회사는 설명했다. 100만 벡터를 4GiB 메모리의 c8g.large에 올렸을 때 PRISM은 약 3분, HNSW는 그래프가 메모리에 다 들어가지 않아 스래싱이 일어나며 약 21.7시간 걸렸다. 같은 머신에서 PRISM 인덱스는 280MB로 HNSW(2.05GB)의 약 7분의 1이었고, 재현율 99%에서 9ms 대 392ms였다. 2GiB 머신에서도 PRISM은 재현율 99%를 15ms에 냈다.
배경왜 그래프를 버렸나
흥미로운 대목은 타이거데이터가 스스로의 이전 선택을 뒤집었다는 점이다. 회사는 2024년 마이크로소프트 DiskANN 연구에서 영감을 받은 그래프 기반 인덱스 pgvectorscale을 공개했다. 그러나 다양한 데이터셋, 특히 저차원 데이터에서 그래프 일부가 도달 불가능해져 재현율이 떨어지는 문제를 만났고, 원리적인 해법을 찾지 못했다고 밝혔다. 느린 쿼리는 측정하고 튜닝할 수 있지만, 재현율 저하는 사용자가 검색 품질을 의심하기 전까지 알아채기도 어렵다는 설명이다.
그 사이 구글의 AlloyDB용 ScaNN, 마이크로소프트의 SPANN 등 업계는 벡터 공간을 파티션으로 나누고 압축한 뒤 가까운 파티션을 SIMD로 훑는 방식으로 수렴했다. 그래프 탐색은 다음 노드 주소를 이전 노드에서 얻기 때문에 CPU가 미리 읽어 올 수 없지만, 파티션 스캔은 메모리를 일직선으로 읽어 프리페처와 SIMD를 최대로 활용한다. PRISM은 계층형 센트로이드 트리를 포스트그레스 버퍼 캐시에 올려 두고, RaBitQ로 양자화한 벡터를 SIMD에 맞춘 페이지 레이아웃으로 저장한다. RaBitQ의 오차 한계 덕분에 최근접 이웃이 될 수 없는 벡터를 미리 걸러, 원본 정밀도 재순위 대상이 크게 줄어든다.
타이거데이터는 앞으로 벡터 검색 개발 대부분을 이 새 구조로 옮기며, 운영 환경에서 안정적으로 쓰이고 있는 pgvectorscale은 유지보수 모드로 들어간다고 밝혔다.
할 일써 보려면 무엇을 알아야 하나
도입 장벽은 낮다. pg_vectorsearch는 자체 vec32·vec16 타입을 제공해 단독으로도 동작하고, 이미 pgvector의 vector·halfvec 컬럼이 있다면 테이블을 다시 쓰거나 복사하지 않고 그 위에 PRISM 인덱스를 만들 수 있다. 연산자(<->, <#>, <=>)도 그대로라 기존 쿼리는 바뀌지 않는다. 쿼리 튜닝 파라미터는 사실상 prism.nprobe 하나이고, 기본값 0은 재현율 약 95%를 목표로 자동 선택한다.
CREATE EXTENSION pg_vectorsearch;
-- 기존 pgvector 컬럼에 그대로 PRISM 인덱스 생성
CREATE INDEX documents_embedding_prism
ON documents USING prism (embedding vec32_l2_ops);
-- 0 = 자동(재현율 약 0.95). 올리면 재현율, 내리면 속도
SET prism.nprobe = 40;WHERE 필터를 걸면 LIMIT보다 적은 행이 반환될 수 있다는 알려진 이슈가 있다. 메타데이터 필터 검색이 많은 서비스는 특히 확인한다.prism_rebalance 또는 REINDEX가 필요하다.EXPLAIN으로 플래너가 PRISM을 쓰는지 확인하고, 자기 데이터로 재현율을 직접 재 본 다음 HNSW를 지운다.자주 묻는 질문
pg_vectorsearch와 pgvector는 무엇이 다른가요?
pgvector의 대표 인덱스 HNSW는 벡터를 그래프로 연결하는 방식이고, pg_vectorsearch의 PRISM은 비슷한 벡터를 파티션으로 묶어 RaBitQ로 압축 저장하는 방식이다. pg_vectorsearch는 pgvector 컬럼과 연산자를 그대로 쓸 수 있어 두 확장을 함께 설치할 수 있다.
pg_vectorsearch를 운영 환경에 써도 되나요?
아직 아니다. 0.1.0은 알파 단계로 테스트용이라고 명시돼 있고, 필터 검색 결과 부족, 변경이 많을 때의 재현율 저하 같은 알려진 이슈가 있다. 프리릴리스 간 업그레이드도 보장되지 않는다.
pg_vectorsearch는 어떤 포스트그레SQL 버전을 지원하나요?
README 기준 포스트그레SQL 18 이상과 개발 헤더가 필요하다. GCC 11+ 또는 Clang 14+ C11 컴파일러와 Meson 빌드 시스템으로 빌드하며, AVX2·AVX512·NEON SIMD 최적화가 들어 있다.
pgvectorscale은 이제 어떻게 되나요?
타이거데이터는 벡터 검색 개발의 대부분을 pg_vectorsearch로 옮기고, 현재 운영 환경에서 안정적으로 쓰이는 pgvectorscale은 유지보수 모드로 전환한다고 밝혔다. 신규 프로젝트라면 장기적으로 어느 쪽을 쓸지 계획에 반영하는 것이 좋다.

댓글 0