pgvector
무엇인가
pgvector는 PostgreSQL에 벡터 타입과 유사도 검색 연산자, 근사 최근접 이웃 인덱스를 추가하는 C로 작성된 확장이다. 벡터 검색을 별도 서비스로 분리하지 않고 관계형 스키마 안에서 처리하는 계열에 속한다. 임베딩을 담은 컬럼은 일반 컬럼과 같은 테이블에 놓이고, 같은 트랜잭션·백업·권한 체계의 적용을 받는다.
어떻게 동작하나
확장은 데이터베이스마다 CREATE EXTENSION vector로 한 번 활성화한다. 컬럼 타입은 vector(단정밀도), halfvec(반정밀도), bit(이진), sparsevec(희소) 네 가지다. 거리 연산자는 <->(L2), <#>(음수 내적), <=>(코사인), <+>(L1), <~>(해밍), <%>(재커드)이며, 각각 대응하는 연산자 클래스(vector_l2_ops, halfvec_l2_ops, sparsevec_l2_ops 등)를 통해 인덱스에 연결된다. 인덱스는 HNSW와 IVFFlat 두 종류다. HNSW는 다층 그래프를 만들며 m(레이어당 최대 연결 수, 기본 16)과 ef_construction(기본 64)으로 빌드하고, 검색 시 hnsw.ef_search(기본 40)로 후보 목록 크기를 정한다. IVFFlat은 벡터를 리스트로 나누고 lists와 ivfflat.probes로 탐색 범위를 조절한다. 벡터는 COPY로 벌크 적재할 수 있고, avg 집계로 그룹 평균 벡터를 계산한다.
무엇과 다른가
전용 벡터 데이터베이스는 별도 프로세스와 별도 클라이언트, 별도 백업을 요구하고 원본 데이터와의 동기화 파이프라인을 필요로 한다. pgvector는 그 자리를 PostgreSQL 내부로 옮겨, 벡터와 메타데이터를 한 테이블에서 JOIN하고 ACID 트랜잭션과 시점 복구(PITR)를 그대로 적용한다. 인덱스를 만들지 않으면 완전 탐색으로 정확한 최근접 이웃을 반환하고, HNSW나 IVFFlat 인덱스를 추가하면 재현율 일부를 포기하는 대신 속도를 얻으며 같은 쿼리의 결과가 달라질 수 있다.
어떻게 쓰나
설치 후 각 데이터베이스에서 CREATE EXTENSION vector를 실행하고, CREATE TABLE items (embedding vector(3))처럼 차원을 지정한 컬럼을 만든다. 질의는 SELECT * FROM items ORDER BY embedding <-> '[...]' LIMIT 5 형태로 정렬과 개수 제한을 쓰고, 인덱스는 CREATE INDEX ON items USING hnsw (embedding vector_l2_ops)처럼 거리 함수별로 따로 만든다. 검색 파라미터는 SET hnsw.ef_search = 100, SET ivfflat.probes = 10으로 세션에 지정하거나 SET LOCAL로 단일 쿼리에만 적용한다. <#>는 음수 내적을 반환하므로 ORDER BY ASC로 최근접을 얻고, 코사인 유사도는 1에서 <=> 결과를 뺀 값이다.
전제와 한계
Postgres 13 이상이 필요하고, Windows에서는 Visual Studio의 C++ 지원을 설치한 뒤 x64 Native Tools Command Prompt에서 nmake로 빌드한다. HNSW 인덱스의 차원 상한은 vector 2,000, halfvec 4,000, bit 64,000이고 sparsevec는 비영 원소 1,000개까지다. IVFFlat은 vector 2,000, halfvec 4,000, bit 64,000까지 지원한다. IVFFlat은 테이블에 데이터가 들어간 뒤에 만들어야 하고 lists와 probes를 데이터 규모에 맞게 조정해야 재현율이 확보된다. HNSW는 빌드 시간이 길고 메모리를 많이 쓰며, 그래프가 maintenance_work_mem에 들어갈 때 빌드가 빨라진다.
유사 도구
- paradedbPostgres에 커스텀 인덱스를 추가해 전문 검색·벡터 검색·집계를 한 데이터베이스 안에서 처리하는 Rust 확장이다. 별도 검색 시스템을 두지 않는다.
- zvecC++로 작성된 인프로세스 벡터 데이터베이스다. 서버 없이 애플리케이션에 임베드되며 밀집·희소 벡터 검색과 전문 검색, 하이브리드 질의를 한 프로세스 안에서 처리한다.
- RediSearchRedis 해시에 보조 인덱스와 전문 검색, 벡터 유사도 검색, 집계를 붙이는 쿼리·인덱싱 엔진이다. Redis 8부터 코어에 포함된다.
- meilisearchRust로 작성된 검색 엔진 서버다. 전문 검색과 시맨틱 검색을 결합한 하이브리드 검색을 RESTful HTTP API로 제공한다.
- helix-db그래프와 벡터를 한 엔진에 담은 Rust OLTP 데이터베이스다. 객체 스토리지 위에서 동작하며 벡터·전문 검색을 내장하고 KV·문서·관계형 데이터도 함께 다룬다.
- orama브라우저·서버·엣지에서 도는 TypeScript 검색 엔진 라이브러리다. 전문 검색·벡터 검색·하이브리드 검색을 2KB 미만 코어로 처리한다.