본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

HNSW와 IVFFlat: 인덱스 고르기

~22 min · pgvector, indexes, performance

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

pgvector가 제공하는 두 인덱스

  • HNSW(Hierarchical Navigable Small World) — 그래프 기반 ANN이야. 재현율이 높고 구축은 느리지만 데이터를 계속 추가할 수 있어. 2026년의 기본 선택이야.
  • IVFFlat(Inverted File with Flat compression) — 파티션 기반이야. 빨리 만들 수 있지만 재현율이 낮고 데이터가 늘면 주기적으로 다시 구축해야 해.

매개변수 고르기

HNSW에서는 m이 그래프 연결 수를 정하고 기본값은 16이야. ef_construction은 구축에 들이는 작업량이며 기본값은 64고. 검색할 때 SET hnsw.ef_search = 40을 조절하면 지연 시간과 재현율을 맞바꿀 수 있어. IVFFlat에서는 생성 시점의 lists와 검색 시점의 ivfflat.probes가 비슷한 역할을 해.

여기서 재현율이 뜻하는 것

ANN 인덱스는 근사치로 찾아. 재현율은 실제 상위 k개 결과 가운데 인덱스가 찾아낸 비율이야. HNSW는 기본 설정에서도 보통 0.95–0.99를 내지만, probes가 낮은 IVFFlat은 0.7까지 떨어질 수 있어. 수치를 믿기 전에 별도로 떼어 둔 쿼리 집합을 사용해 정확한 전체 탐색과 비교해.

Code

HNSW 인덱스 생성·sql
-- Cosine
CREATE INDEX chunks_embedding_hnsw_cos
    ON chunks USING hnsw (embedding vector_cosine_ops)
    WITH (m = 16, ef_construction = 64);

-- L2
-- CREATE INDEX ... USING hnsw (embedding vector_l2_ops)    WITH (...);
-- Inner product
-- CREATE INDEX ... USING hnsw (embedding vector_ip_ops)    WITH (...);

SET hnsw.ef_search = 40;   -- 높이면 recall 높아지고 query 느려짐
상위 k개 코사인 쿼리·sql
-- vector_cosine_ops 의 <=> operator 는 cosine DISTANCE.
SELECT id, source, chunk_index, text, 1 - (embedding <=> $1) AS similarity
FROM   chunks
ORDER BY embedding <=> $1
LIMIT  10;

External links

Exercise

행 10만 개를 넣고 기본 설정으로 HNSW를 만든 뒤 쿼리 100개의 시간을 재. 인덱스를 지우고 lists=100, probes=10인 IVFFlat으로 같은 실험을 해. 인덱스 없는 ORDER BY 결과를 표본의 정답으로 삼아 중앙 지연 시간과 대략적인 재현율을 비교해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.