HNSW 알고리즘만 구현해 놓은 C++ 헤더 전용 라이브러리다. Python 바인딩을 제공하며, HNSW 논문 저자인 Yury Malkov 가 직접 만들었다.
faiss 처럼 여러 인덱스 방식을 한데 담은 라이브러리와 달리, 한 알고리즘만 다루는 대신 그 경로를 얇게 유지한 것이 특징이다. 의존성이 거의 없어 빌드가 간단하고, 질의당 오버헤드가 작다.
언제 faiss 대신 쓰나
faiss 는 IVF, PQ 압축, GPU 실행, 여러 인덱스 조합 등 선택지가 넓다. 데이터가 아주 크거나 메모리를 줄여야 하면 그쪽이 맞다.
반대로 다음 조건에서는 hnswlib 이 유리하다.
- 인덱스가 메모리에 다 올라간다
- 알고리즘은 HNSW 로 정해져 있다
- 질의 지연이 밀리초 단위에서 문제가 된다
같은 HNSW 라도 faiss 를 거치면 추상화 계층을 통과하는 비용이 붙는다. 검색 자체가 몇 밀리초인 상황에서는 이 차이가 전체 지연에서 눈에 띄는 비중이 된다. 네이버가 4ms 도 느리다고 보고 hnswlib 으로 옮긴 사례가 이 이유다.
제약
- HNSW 만 지원한다. 인덱스 방식을 바꾸려면 라이브러리를 바꿔야 한다
- 벡터를 전부 메모리에 올린다. 압축이 없으므로 데이터가 커지면 메모리가 그대로 비용이 된다
- 삭제는 표시만 하는 방식(soft delete)이라, 삭제가 잦으면 인덱스를 다시 만들어야 한다
- 인덱스 구축 파라미터(
M,ef_construction)는 만든 뒤에 바꿀 수 없다. 검색 시 정확도와 속도를 조절하는ef만 질의 시점에 조정한다
milvus, weaviate 같은 벡터 데이터베이스가 내부 엔진의 하나로 hnswlib 을 쓰기도 한다.