pgvector에서 IVFFlat 인덱싱

발행: (2025년 12월 17일 오후 12:36 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

번역할 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.

pgvector에서 IVFFlat란?

IVFFlat (Inverted File with Flat Vectors)는 ANN 인덱스입니다. 모든 벡터와 쿼리 벡터를 비교하는 전수조사(brute‑force scan) 대신, IVFFlat은 벡터들을 여러 “리스트”(또는 클러스터)로 나눕니다. 쿼리 시에는 가장 관련성이 높은 리스트들만 검색됩니다.

주요 장점

  • 대규모 데이터셋에서 빠른 유사도 검색
  • 근사 결과이지만 정확도를 조정할 수 있음
  • 고차원 임베딩에 적합

IVFFlat은 어떻게 작동하나요?

IVFFlat은 중심점 기반 클러스터링 방식을 사용합니다.

1. 학습 단계

  • 벡터들을 k‑means 로 클러스터링하여 리스트로 나눕니다.
  • 각 리스트는 하나의 중심점(centroid)을 나타냅니다.

2. 인덱스 구조

  • 각 벡터는 가장 가까운 중심점/리스트에 할당됩니다.
  • 인덱스는 벡터들의 리스트(역 리스트)를 저장합니다.

3. 쿼리 실행

  • 쿼리 벡터를 모든 중심점과 비교합니다.
  • 가장 유사한 probes 개수만큼의 리스트를 선택합니다.
  • 선택된 리스트에 포함된 벡터들만 비교합니다.

우리가 제어할 수 있는 항목

  • lists – 클러스터(리스트) 수
  • probes – 쿼리 시 검색하는 클러스터 수

프로브 수를 늘리면 정확도는 향상되지만 속도는 감소합니다.

pgvector에서 IVFFlat 인덱스 구현

1. pgvector 설치 (아직 설치되지 않은 경우)

CREATE EXTENSION IF NOT EXISTS vector;

2. 벡터 임베딩이 포함된 테이블 생성

CREATE TABLE documents (
    id        bigserial PRIMARY KEY,
    embedding vector(768)
);

3. IVFFlat 인덱스 생성

CREATE INDEX vector_ivfflat_idx
ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 1000);

Note:

  • 인덱스는 충분한 행을 삽입한 후에 생성하는 것이 좋습니다 (k‑means 학습을 위해).
  • 리스트당 최소 1 000개의 행을 목표로 합니다.

4. IVFFlat을 사용한 쿼리

예시 코사인 유사도 검색:

SET ivfflat.probes = 20;

SELECT id
FROM documents
ORDER BY embedding '[0.5, 0.3, …]'
LIMIT 10;

원한다면 전역 설정:

ALTER SYSTEM SET ivfflat.probes = 20;

IVFFlat에서 프로브 튜닝

  • 프로브는 쿼리 시 스캔되는 IVF 리스트의 개수를 제어합니다.
  • 프로브를 낮추면 → 더 빠르지만 정확도가 떨어집니다(검색되는 클러스터가 적음).
  • 프로브를 높이면 → 정확도가 향상되지만 속도가 감소합니다.
  • 속도와 재현율 사이의 우선순위에 따라 최적값을 선택하세요.

권장 범위

낮은 프로브 (1–10)

  • ✅ 가장 빠른 검색 성능
  • ✅ 실시간 또는 고처리량 워크로드에 이상적
  • ❌ 정확도와 재현율이 낮음
  • ❌ 클러스터가 거칠면 유사 벡터를 놓칠 수 있음

중간 프로브 (~전체 리스트의 10 %)

  • ✅ 속도와 정확도의 균형
  • ✅ 대부분의 프로덕션 워크로드에 적합
  • ✅ 큰 성능 손실 없이 좋은 재현율
  • ❌ 낮은 프로브 설정보다 약간 느림

높은 프로브 (50–100 % 리스트)

  • ✅ 거의 정확한 검색 결과 (높은 재현율)
  • ✅ 품질에 민감한 워크로드에 적합 (예: 검색 관련성)
  • ❌ 많은 리스트를 스캔하므로 훨씬 느림
  • ❌ ANN 인덱싱의 성능 이점을 감소시킴

유지 관리 작업: REINDEX, ANALYZE, VACUUM

IVFFlat 인덱스는 검색 성능을 안정적으로 유지하기 위해 정기적인 유지 관리가 필요합니다.

1. ANALYZE – 쿼리 계획 개선

대량 삽입이 끝난 후 ANALYZE를 실행하거나 autovacuum/analyze에 의존합니다.

ANALYZE documents;

-- 테이블의 마지막 ANALYZE 시점을 확인
SELECT relname, last_analyze, last_autoanalyze
FROM pg_stat_all_tables
WHERE relname = 'documents';

2. REINDEX – 대규모 데이터 변경 후 필요

많은 벡터가 삽입되거나 삭제되면 중심점이 흐트러져 성능이 저하될 수 있습니다.

REINDEX INDEX vector_ivfflat_idx;

-- 재구축 중에도 테이블을 계속 사용할 수 있게 함
REINDEX INDEX CONCURRENTLY vector_ivfflat_idx;

REINDEX 시점

  • 수백만 개의 새로운 행을 삽입한 후
  • 대량의 데이터를 삭제한 후
  • 검색 정확도가 눈에 띄게 감소할 경우

3. VACUUM – 저장소 정리 유지

정기적인 VACUUM은 테이블과 인덱스의 건강을 유지하는 데 도움이 됩니다.

VACUUM (VERBOSE, ANALYZE) documents;

연속적인 유지 관리를 위해 autovacuum을 활성화하십시오.

결론

IVFFlat은 pgvector에서 사용할 수 있는 강력한 ANN 인덱싱 방법으로, 성능, 메모리 효율성 및 단순성의 균형을 제공합니다. 적절한 구성 및 유지 관리가 이루어지면, IVFFlat은 외부 데이터베이스 없이도 PostgreSQL 내부에서 고성능 벡터 검색을 제공할 수 있습니다.

Back to Blog

관련 글

더 보기 »

창고 활용에 대한 종합 가이드

소개 창고는 근본적으로 3‑D 박스일 뿐입니다. Utilisation은 실제로 그 박스를 얼마나 사용하고 있는지를 측정하는 지표입니다. While logistics c...