검색 실험
pgvector 인덱스를 HNSW로 바꾸고 검색 지연이 줄어든 과정
사내 문서 4만 건에 IVFFlat을 쓰다가 재현율이 떨어지는 문제를 겪었습니다. HNSW로 옮기면서 m과 ef_search를 어떻게 정했는지 실제 지연 시간과 함께 정리했습니다.
문제
문서가 늘면서 lists 값을 다시 맞추지 않으면 재현율@10이 0.81까지 내려갔습니다. 인덱스를 다시 만들 때마다 검색 품질이 흔들렸습니다.
바꾼 설정
- m = 16, ef_construction = 64
- ef_search는 질의마다 40으로 시작
create index on docs using hnsw (embedding vector_cosine_ops) with (m = 16, ef_construction = 64);
set hnsw.ef_search = 40;
결과
p95 지연이 180ms에서 62ms로 줄었고 재현율@10은 0.95를 유지했습니다. 같은 설정으로 재현한 기록이 이 글 아래에 이어져 있습니다.
이어진 기록 4개
기록 잇기- 적용1
- 수정1
- 검증1
- 질문1
적용 사내 위키 검색에 같은 설정을 적용했습니다
원본pgvector 인덱스를 HNSW로 바꾸고 검색 지연이 줄어든 과정
- 환경
- PostgreSQL 16 · pgvector 0.8 · 문서 1.2만 건
- 변경
- m = 16, ef_search = 40
- 결과
- p95 지연 180ms에서 64ms
수정 ef_search를 질의 길이에 따라 바꾸도록 고쳤습니다
원본pgvector 인덱스를 HNSW로 바꾸고 검색 지연이 줄어든 과정
- 환경
- Supabase · Edge Functions
- 변경
- 짧은 질의 20, 긴 질의 80
- 결과
- 재현율@10 0.94 유지
검증 같은 데이터 규모로 재현했고 수치가 비슷했습니다
원본pgvector 인덱스를 HNSW로 바꾸고 검색 지연이 줄어든 과정
- 환경
- 로컬 Docker · 문서 4만 건
- 결과
- p95 71ms
질문 인덱스를 만드는 동안 쓰기가 막히지 않았나요?
댓글 2개
로그인하면 댓글을 달 수 있어요 읽는 데는 로그인이 필요 없어요.


김도현
사내 위키에도 그대로 적용해 봤어요. 기록으로 남겼습니다.
한지우작성자
재현해 주셔서 고마워요. 문서 수가 다른데도 비슷하네요.