본문으로 건너뛰기
Weaviate Blog조회 1

HFresh로 메모리 부담 낮춘 벡터 검색

HFresh는 HNSW의 검색 품질을 활용하면서 posting을 디스크에 저장해 벡터 색인의 메모리 사용량을 낮춥니다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

HNSW는 낮은 지연 시간과 높은 처리량을 제공하지만 그래프와 벡터 캐시를 메모리에 유지하므로 벡터 수가 커질수록 메모리 부담이 커집니다. HFresh는 HNSW 기반의 RQ8 centroid 색인을 메모리에 두고 RQ1로 압축한 posting을 디스크에 저장한 뒤, 쿼리와 가까운 posting만 읽고 원본 벡터로 상위 후보를 재채점합니다. posting의 분할·병합·벡터 재배치를 백그라운드에서 점진적으로 처리해 전체 색인 재구축 없이 업데이트를 반영하며, DBpedia OpenAI 1M 실험에서 Go heap 사용량은 HFresh 239 MB, 비압축 HNSW 6.67 GB로 측정됐습니다. 대신 비슷한 recall에서 HNSW 계열보다 QPS가 낮으므로 최고 처리량이 필요한 경우에는 HNSW가, 메모리 절약과 대규모 mutable dataset이 중요한 경우에는 HFresh가 적합합니다.

섹션별 상세

01
HNSW는 상위의 희소한 그래프에서 하위의 조밀한 그래프로 내려가며 유사 벡터가 있는 영역을 좁혀 낮은 지연 시간과 높은 처리량을 얻습니다. 그러나 그래프와 vector cache를 메모리에 유지하므로 데이터셋이 수백만 개에서 수십억 개 벡터로 커질수록 색인 메모리 요구량이 핵심 제약이 됩니다. HFresh는 최고 처리량을 일부 양보하는 대신 전체 색인을 메모리에 올리지 않는 선택지를 제공해 제한된 자원이나 대규모 데이터셋에 대응합니다.
HNSW의 상위·중간·하위 계층과 각 계층의 그래프 연결을 나타낸 도식입니다.
Diagram상위 계층은 노드 수가 적고 장거리 연결을 사용해 탐색 범위를 빠르게 좁히며, 하위 계층은 더 조밀한 연결로 세부 검색을 수행합니다. 이 계층적 이동 구조가 HNSW의 빠른 벡터 검색을 만들지만, 전체 그래프와 벡터 데이터를 메모리에 유지해야 하는 구조적 부담도 함께 보여줍니다.
02
HFresh는 모든 벡터를 하나의 전역 그래프에 연결하는 대신 가까운 벡터를 작은 posting으로 나누고 이를 LSM store의 디스크 영역에 저장합니다. 쿼리가 들어오면 메모리의 centroid HNSW가 관련 posting을 먼저 고르고, 선택된 posting만 디스크에서 읽어 RQ1 벡터로 후보를 만든 뒤 상위 후보의 원본 벡터를 가져와 정확한 거리를 다시 계산합니다. 이 2단계 경로는 전체 데이터셋을 읽는 대신 선택된 영역만 처리하므로 벡터 수가 수십억 개로 늘어날 때도 디스크 I/O와 지연을 통제하는 구조를 만듭니다.
메모리의 RQ8 centroid HNSW가 디스크의 RQ1 posting들을 가리키는 HFresh 구조입니다.
DiagramHFresh는 압축된 centroid 색인과 메타데이터만 메모리에 두고 실제 벡터 묶음은 여러 posting으로 나눠 디스크에 저장합니다. 각 centroid가 대응하는 posting을 가리키므로 쿼리가 전체 벡터를 메모리에 유지하지 않고 관련 영역만 불러오는 구조가 드러납니다.
HFresh가 centroid 라우팅, RQ1 후보 생성, 원본 벡터 재채점을 거치는 3단계 검색 경로입니다.
Diagram쿼리 벡터는 먼저 RQ8 HNSW centroid 색인에서 관련 posting을 선택하고, 선택된 posting의 RQ1 벡터를 스캔해 후보를 만듭니다. 이후 상위 후보의 비압축 원본 벡터를 읽어 정확한 거리를 계산하므로 압축으로 디스크 I/O를 줄이면서 최종 순위의 정밀도를 보완합니다.
03
HFresh는 SPFresh의 핵심인 지역 단위 유지보수를 Weaviate의 기존 구성요소에 맞게 조정해 전체 재구축 없이 업데이트를 반영합니다. 너무 커진 posting은 stale entry를 정리한 뒤 Balanced K-Means로 두 그룹으로 나누고 새 centroid를 만들며, 너무 작아진 posting은 가까운 posting과 병합합니다. 분할이나 병합 뒤 경계가 바뀌어 더 적합한 영역이 생기면 LIRE 방식의 재배치가 벡터를 옮기므로, 삽입과 삭제가 누적돼도 작은 비동기 작업으로 색인 균형을 회복합니다.
너무 커진 하나의 posting을 Balanced K-Means로 두 개의 균형 잡힌 posting으로 나누는 과정입니다.
Diagram기존 posting의 벡터를 두 그룹으로 분할하고 각각에 새 centroid를 배정해 한 영역에 벡터가 과도하게 몰리는 현상을 줄입니다. HFresh는 이 작업을 백그라운드에서 수행해 posting별 디스크 읽기량과 centroid 라우팅 정밀도를 지속적으로 관리합니다.
작아진 posting을 인접 posting에 병합해 하나의 영역으로 합치는 과정입니다.
Diagram삭제나 데이터 분포 변화로 posting이 지나치게 작아지면 가까운 posting에 벡터를 합치고 불필요한 centroid를 제거합니다. 이 병합은 posting 수가 불필요하게 늘어나는 단편화를 막고 검색 시 관리해야 할 영역 수를 안정적으로 유지합니다.
한 벡터를 현재 posting에서 더 가까운 인접 posting으로 재배치하는 과정입니다.
Diagram분할이나 병합으로 posting 경계가 바뀌면 일부 벡터가 다른 centroid 아래에 더 적합해질 수 있습니다. HFresh는 해당 벡터만 점진적으로 재배치해 전체 색인을 다시 만들지 않고 지역적 불균형과 검색 품질 저하를 보정합니다.
04
HFresh의 centroid 계층에는 SPTAG 대신 운영 환경에서 검증된 HNSW를 사용하고, centroid에는 RQ8, 디스크 posting에는 RQ1을 적용합니다. RQ8은 centroid 메모리를 4배 줄이면서 쿼리를 잘못된 영역으로 보내는 오류를 억제하고, RQ1은 32-bit float 대비 벡터 저장 공간을 최대 32배 줄여 posting 읽기와 1차 후보 계산 비용을 낮춥니다. 다만 RQ1 점수는 최종 순위가 아니라 후보 선별용이며, HFresh는 상위 후보를 비압축 원본 벡터로 재채점해 최종 검색 품질을 보완합니다.
05
필터 검색에서는 조건을 만족하는 document ID를 bitmap allow list로 관리하고, 선택도가 높은지에 따라 검색 경로를 나눕니다. 일치 ID가 5,000개 미만이면 centroid 라우팅과 posting 스캔을 건너뛰고 해당 원본 벡터만 직접 읽어 정확한 거리를 계산하며, 더 넓은 필터에서는 posting 메타데이터로 검색 가능 영역을 좁힌 뒤 ACORN을 활용한 centroid HNSW 탐색과 posting 내부의 allow list 검사를 이어갑니다. 이후 압축 벡터로 후보를 만들고 원본 벡터로 재채점하므로 posting 복제 때문에 같은 일치 벡터가 중복 선택되는 상황도 추적하면서 불필요한 디스크 읽기를 줄입니다.
python
from weaviate.classes.config import Configure, VectorDistancescollection = client.collections.create( name="Article", vector_config=Configure.Vectors.self_provided( name="Title", vector_index_config=Configure.VectorIndex.hfresh( distance_metric=VectorDistances.COSINE, ), ),)

Python client에서 collection의 vector index를 HFresh로 설정하고 COSINE distance metric을 지정합니다.

DBpedia OpenAI 1M 데이터셋에서 색인별 Go heap 사용량을 비교한 막대그래프입니다.
ChartHFresh의 heap 사용량은 239 MB로 비압축 HNSW의 6.67 GB보다 크게 낮고, HNSW with RQ1의 715 MB와 HNSW with RQ8의 2.38 GB보다도 낮습니다. 이 수치는 HFresh가 RQ8 centroid와 메타데이터만 메모리에 유지하고 RQ1 posting을 디스크에 두는 구조가 메모리 절감으로 이어짐을 뒷받침합니다.
HFresh와 HNSW 계열 색인의 recall에 따른 QPS 변화를 비교한 그래프입니다.
Chart그래프에서 HNSW와 HNSW with RQ8은 비슷한 recall 구간에서 HFresh보다 높은 QPS를 보이며, HFresh의 처리량 비용을 나타냅니다. HFresh는 posting 디스크 읽기와 원본 벡터 재채점 때문에 처리량이 낮지만, 메모리 사용량을 크게 줄이는 선택지로 위치합니다.
06
DBpedia OpenAI 1M 데이터셋에서 Go heap 사용량은 비압축 HNSW 6.67 GB, HNSW with RQ1 715 MB, HNSW with RQ8 2.38 GB, HFresh 239 MB로 측정됐습니다. 같은 실험의 QPS-recall 곡선에서는 비슷한 recall에서 HNSW와 양자화 HNSW가 HFresh보다 높은 처리량을 보였는데, HNSW는 메모리 그래프만 탐색하는 반면 HFresh는 posting과 원본 후보를 디스크에서 읽기 때문입니다. 별도의 256차원 벡터 10억 개 구축 시험에서는 32 vCPUs와 256 GB RAM 환경에서 재시작 후 VM 메모리 54 GB, Go heap 47 GB, import 후 디스크 2.28 TB가 기록됐지만 이 시험에서는 recall과 QPS를 측정하지 않았습니다.

용어 해설

계층형 탐색 가능한 소세계 그래프(HNSW)
HNSW는 벡터를 여러 그래프 계층에 배치해 유사한 벡터를 빠르게 찾는 근사 최근접 이웃 색인입니다. 상위의 희소한 그래프에서 넓게 이동한 뒤 하위의 조밀한 그래프에서 후보를 좁히며, 빠른 탐색과 높은 검색 품질을 제공하는 대신 그래프와 벡터 캐시를 메모리에 유지해야 합니다.
회전 양자화(Rotational Quantization)
Rotational Quantization은 벡터를 압축하기 쉬운 좌표계로 회전한 뒤 각 차원의 표현 정밀도를 낮추는 기법입니다. HFresh는 centroid에는 RQ8을, 디스크의 posting 벡터에는 RQ1을 적용해 라우팅 정확도와 저장 공간 절약 사이의 역할별 균형을 맞춥니다.
포스팅 영역(Posting)
Posting은 벡터 공간에서 서로 가까운 벡터를 묶은 작은 영역으로, HFresh에서는 각 영역의 벡터를 디스크에 저장합니다. 쿼리마다 모든 벡터를 읽지 않고 centroid 색인이 선택한 posting만 불러오므로 디스크 읽기 범위와 지연을 제한하는 단위가 됩니다.
경량 증분 재균형(LIRE)
LIRE는 분할이나 병합 이후 벡터가 더 적합한 centroid 또는 인접 posting으로 이동했는지 점검하는 SPFresh의 재배치 절차입니다. 전체 색인을 다시 만들지 않고 일부 벡터를 점진적으로 옮겨 posting 경계와 검색 품질을 지속적으로 보정합니다.
균형 K-Means(Balanced K-Means)
Balanced K-Means는 지나치게 커진 posting의 벡터를 두 개의 균형 잡힌 그룹으로 나누는 클러스터링 방식입니다. HFresh는 이 결과로 두 개의 새 centroid를 만들고 기존 posting을 대체해 디스크 읽기량과 라우팅 정밀도의 악화를 억제합니다.

기술

  • Weaviate
  • HFresh
  • HNSW
  • SPFresh
  • SPTAG
  • ACORN
  • Rotational Quantization
  • Balanced K-Means
  • LIRE
  • Python client

활용 사례

  • 제한된 메모리 환경의 벡터 검색
  • 수십억 개 벡터를 저장하는 대규모 검색
  • 삽입과 삭제가 빈번한 mutable dataset
  • 제품 브랜드·가격·재고 조건을 함께 적용하는 전자상거래 검색
  • Weaviate Cloud Free Tier의 Cost Optimized profile
AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 09. 09.수집 2026. 09. 09.출처 타입 RSS

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.