HNSW 벡터 인덱스

HNSW vector index

여러 층의 근접 그래프를 따라 질의 벡터의 이웃을 찾습니다.

···
html
<div class="v"><header><b>HNSW LAYERS</b><span id="state"></span></header><main><div class="hlevels" id="hlevels"></div><div class="hkey">upper jumps → lower refinement</div></main><footer>sparse graph → dense graph</footer></div>
css
.v{width:min(92vw,660px);height:min(86vh,310px);box-sizing:border-box;padding:clamp(9px,2.5vmin,18px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:7px;color:var(--fg);font:500 clamp(15px,4.5vmin,19px)/1.25 var(--font-sans, sans-serif)}.v header,.v footer{display:flex;justify-content:space-between;align-items:center;gap:8px;white-space:nowrap}.v header b{color:var(--accent);font-size:.9em}.v header span,.v footer{color:var(--muted);font-size:.82em}.v main{flex:1;min-height:0;position:relative;overflow:hidden}.v .mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.v .active{background:var(--accent)!important;color:var(--bg)!important;border-color:var(--accent)!important}.v .muted{opacity:.45} .hlevels{height:76%;display:flex;flex-direction:column;justify-content:space-around;gap:3px}.hrow{display:flex;align-items:center;gap:5px}.hrow small{width:40px;color:var(--muted);font-size:.72em}.hnode{height:clamp(20px,5vmin,30px);min-width:clamp(20px,5vmin,30px);border:1px solid var(--line);border-radius:50%;display:grid;place-items:center;font:600 .75em ui-monospace,monospace}.hline{flex:1;height:1px;background:var(--line)}.hkey{text-align:center;color:var(--muted);font-size:.75em}
js
const rows=[["A","C"],["A","B","C"],["A","B","D","C"]];let step=0;function draw(){document.getElementById("hlevels").innerHTML=rows.map((row,layer)=>"<div class=hrow><small>L"+(2-layer)+"</small>"+row.map((node,i)=>"<b class='hnode "+(layer===Math.floor(step/2)&&i===(step%2?row.length-1:0)?"active":"")+"'>"+node+"</b>"+(i<row.length-1?"<i class=hline></i>":"")).join("")+"</div>").join("");document.getElementById("state").textContent=["entry","long jump","refine","neighbor","fine search","nearest"][step];step=(step+1)%6}draw();setInterval(draw,850)

HNSW는 벡터를 이웃 관계로 연결한 그래프를 여러 층에 배치합니다. 위층의 드문 연결로 먼 지역을 빠르게 건너뛴 다음, 아래층에서 더 촘촘한 이웃을 탐색합니다.

모든 점과 거리를 계산하지 않아도 되지만 결과는 근사값입니다. 그래프 연결 수와 탐색 후보 폭은 재현율, 메모리 사용량, 검색 시간에 영향을 줍니다.

언제 쓰나

큰 벡터 집합에서 빠른 근사 이웃 검색을 설계하거나 인덱스를 비교할 때 씁니다.

페이지로 열기 ↗