홈으로 돌아가기

pgvector vs pgvectorscale vs VectorChord: 비교

PostgreSQL 벡터 검색 확장 기능 비교 분석: pgvector, pgvectorscale 및 VectorChord. HNSW, StreamingDiskANN, RaBitQ 알고리즘 설명. Docker 인프라, 1M 레코드 벌크 로딩, 벤치마크 준비.

PostgreSQL 벡터 인덱스 대결: 누가 더 빠른가?
Advertisement 728x90

pgvector vs pgvectorscale vs VectorChord: 포스트그레스에서의 벡터 검색 성능 비교

벡터 검색은 텍스트를 수치적 임베딩으로 변환하고, 유사한 의미를 가진 문서를 거리 기반 메트릭을 통해 찾아냅니다. 유사한 의미를 가진 단어들은 N차원 공간에서 서로 가까운 위치에 집합됩니다. 전형적인 예시로, '왕 - 남자 + 여자 ≈ 여왕'이라는 벡터 연산이 있습니다.

주요 측정 지표

  • 코사인 유사도: 벡터 간 각도; 정규화된 벡터는 유클리드 거리와 동일한 결과를 제공합니다.
  • 유클리드 거리: 두 점 사이의 직선 거리.

포스트그레스 확장 프로그램은 IVFFlat, HNSW 및 특화 알고리즘을 활용해 ANN(근사 최근접 이웃) 검색을 구현합니다.

벡터 검색 확장 프로그램 중 가장 인기 있는 것들

pgvector

오픈소스 C 확장 프로그램으로 vector 타입을 지원합니다. 코사인 유사도, L2 거리, 내적 연산을 모두 지원합니다. 인덱스 유형:

Google AdInline article slot
  • IVFFlat: 벡터 클러스터링 기반.
  • HNSW: 계층적 그래프 구조, 상향식 대규모 탐색.

전체 인덱스를 RAM에 로드해야 합니다.

pgvectorscale

pgvector 위에 구축된 러스트 기반 레이어(기반 기술: PGRX). 데이터를 SSD에 저장하는 StreamingDiskANN 인덱스(디스크ANN의 변형)를 도입하여 메모리 사용량을 줄였습니다. 또한 SBQ(통계적 이진 압축) 기술을 적용했습니다.

성능 개선 주장: 768 차원의 5000만 벡터에서 16배 높은 처리량을 달성.

Google AdInline article slot

pgvecto.rs

완전히 러스트로 작성되었으며, 이진 형식, FP16, INT8 형식을 지원하며 최대 65,535 차원까지 가능합니다. VBASE 알고리즘이 하이브리드 쿼리(벡터 + 필터 + 조인)에 최적화되어 있습니다.

VectorChord

TensorChord가 개발한 pgvecto.rs의 후속 제품입니다. RaBitQ(랜덤 이진 압축)와 재정렬 기법을 결합하여 동일한 비용으로 26배 더 많은 데이터를 저장할 수 있습니다.

모든 확장 프로그램은 표준 vector 타입을 사용하므로 마이그레이션 호환성이 보장됩니다.

Google AdInline article slot

테스트 환경 설정

Docker Compose를 이용해 세 가지 데이터베이스를 배포합니다.

  • pgvectorscale (timescale/timescaledb-ha:pg18):
services:
  postgres:
    image: timescale/timescaledb-ha:pg18
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/home/postgres/pgdata
      - ./db_init_pgv:/docker-entrypoint-initdb.d

초기화 스크립트:

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS vectorscale;
  • VectorChord (tensorchord/vchord-postgres:pg18-v1.1.1):
CREATE EXTENSION IF NOT EXISTS vchord CASCADE;

오케스트레이션을 위한 Makefile:

COMPOSE := docker compose
PGV_FILE := docker-compose-pgv.yml
PGVS_FILE := docker-compose-pgvs.yml
VC_FILE := docker-compose-vc.yml

up-pgv:
	$(COMPOSE) -f $(PGV_FILE) up --build -d
up-pgvs:
	$(COMPOSE) -f $(PGVS_FILE) up --build -d
up-vc:
	$(COMPOSE) -f $(VC_FILE) up --build -d
up: up-pgv up-pgvs up-vc

고유한 서비스 이름과 포트 번호는 필수입니다.

대량 작업을 위한 리포지토리 확장

BaseRepositorybulk_create 메서드:

async def bulk_create(self, schemas: list[CreateSchemaType]) -> list[ModelType]:
    instances = [
        self.model(**self._normalize_embedding_format(schema.model_dump()))
        for schema in schemas
    ]
    self.session.add_all(instances)
    await self.session.flush()
    return instances

BulkCreateRequest 스키마:

class BulkCreateRequest(BaseModel):
    documents: Annotated[
        list[DocumentCreate],
        Field(..., description='생성할 문서 목록', min_length=1, max_length=500)
    ]

엔드포인트:

@router.post('/bulk', response_model=list[DocumentResponse], status_code=status.HTTP_201_CREATED)
async def bulk_create_documents(request: BulkCreateRequest):
    async with transaction() as session:
        repo = DocumentRepository(session)
        created_docs = await repo.bulk_create(request.documents)
        return created_docs

벤치마킹 준비

데이터셋: 허깅페이스의 ag_news (헤드라인 → 임베딩, 카테고리 → 메타데이터). 목표: 100만 건의 레코드.

의존성 설치:

uv add --dev datasets ollama aiohttp tqdm

테스트 구성 요소:

  • 데이터셋에서 배치 로딩
  • ollama를 통한 임베딩 생성
  • DB에 대량 삽입
  • 검색 쿼리의 지연 시간 측정

테스트 클래스 구조는 모든 확장 프로그램 간 병렬 비교를 가능하게 합니다.

핵심 요약

  • 호환성: 모든 확장 프로그램은 vector 타입을 사용하므로 코드 이식성이 뛰어납니다.
  • 확장성: pgvectorscale과 VectorChord는 디스크 저장을 지원하지만, pgvector는 RAM 기반입니다.
  • 압축 기술: RaBitQ(26배 데이터 밀도), 대용량 데이터셋에는 SBQ가 적합합니다.
  • 하이브리드 검색: pgvecto.rs의 VBASE는 필터 + 조인을 동시에 처리할 수 있습니다.
  • 성능: StreamingDiskANN은 5000만 이상 벡터에서 16배 높은 처리량을 제공합니다.

— Editorial Team

Advertisement 728x90

다음 읽기