본문 바로가기
Q&A해결2026년 4월 21일1분 읽기

pgvector 0.10으로 올렸더니 HNSW 검색 결과가 0.9 때와 달라졌습니다

A
AI엔지니어
조회 731댓글 1

RAG 시스템 운영 중인데 pgvector 0.9 → 0.10 업그레이드 후 같은 쿼리 임베딩으로 검색해도 결과 순서가 바뀌고 일부 문서가 누락됩니다.

인덱스는 HNSW이고 m=16, ef_construction=64 그대로입니다. 인덱스 reindex도 했는데 차이가 그대로네요. 검색 정확도가 떨어진 느낌입니다.

0.10에서 뭐가 바뀐 건지, 어떻게 해야 0.9 수준 정확도로 돌아갈 수 있나요?

댓글 1

김김영삼6개월 전

0.10에서 HNSW 검색 동작이 두 가지 의미 있게 바뀌었습니다.

1) ef_search 기본값 변경

0.9까지는 세션별 SET hnsw.ef_search의 기본이 40이었는데, 0.10부터는 인덱스 생성 시점의 ef_construction을 따라 동적으로 조정합니다. ef_search가 작아지면 더 빠르지만 recall이 떨어집니다.

-- 현재 값 확인
SHOW hnsw.ef_search;

-- 0.9 수준 정확도로 복원
SET hnsw.ef_search = 100;
-- 또는 영구 적용
ALTER DATABASE mydb SET hnsw.ef_search = 100;

2) Distance 계산 정밀도 변경

0.10부터 SIMD 가속(AVX-512)이 도입되면서 일부 distance 계산이 미세하게 다릅니다. 거의 같은 거리의 문서들 사이에서 순서가 바뀔 수 있습니다.

실무 점검 순서:

-- 1) 정확도 측정 (ground truth 대비)
WITH gt AS (
SELECT id FROM docs ORDER BY emb <=> query_emb LIMIT 50
),
hnsw AS (
SELECT id FROM docs ORDER BY emb <=> query_emb LIMIT 10
)
SELECT count(*) FROM hnsw WHERE id IN (SELECT id FROM gt);
-- 결과 / 10 = recall@10

권장 설정 (RAG 운영 기준):

  • ef_search: 80~120 (recall 95% 이상 목표)
  • m: 16~32 (벡터 차원 1024 이하면 16, 1536 이상이면 24~32)
  • ef_construction: 64~200 — 빌드 시간만 느려지고 검색은 영향 없음
  • HNSW 인덱스는 SET maintenance_work_mem = '4GB' 후 빌드

iterative scan (0.10 신기능)

0.10에서 hnsw.iterative_scan = strict_order 옵션이 추가됐습니다. recall이 부족할 때 자동으로 추가 노드를 탐색해 결과를 보완합니다.

SET hnsw.iterative_scan = 'strict_order';
SET hnsw.max_scan_tuples = 20000;

지연시간이 약간 늘지만 recall이 0.95+ 수준으로 안정됩니다.

0.9 → 0.10 마이그레이션 체크리스트:

  1. ef_search 값 명시적으로 80~120 설정
  2. iterative_scan 활성화 검토
  3. recall 측정 자동화 — 매일 무작위 샘플 100건으로 ground truth 대비
  4. 인덱스 reindex 후 ANALYZE 잊지 말기
  5. 거리 계산 차이가 신경 쓰이면 SET enable_simd = off (성능은 떨어짐)

RAG 정확도 회귀는 모니터링이 핵심입니다. recall 자동 측정 파이프라인부터 갖추세요.

Ctrl+Enter로 등록