벡터 인덱스
벡터 인덱스 (Vector Indexing)
벡터 인덱스는 벡터 데이터베이스의 핵심 구성 요소예요. 유사도 검색 속도를 크게 높여주면서도 정확도 손실은 최소화하고(HNSW), 혹은 작은 메모리로 많은 데이터 부분집합을 효율적으로 저장합니다(Flat). 데이터가 커지면 flat으로 시작했다가 임계값을 넘으면 동적으로 HNSW로 전환되는 dynamic 인덱스도 있어요.
출처: 공식문서
벡터 인덱스가 뭐예요?
벡터 데이터베이스에서 벡터 인덱스는 벡터 임베딩을 체계적으로 정리해 효율적인 유사도 검색을 가능하게 하는 데이터 구조예요. 벡터 인덱스를 잘 구성하는 것은 성능에 매우 중요하며, 단순한 flat부터 HNSW나 HFresh 같은 정교한 방식까지 각각 목적이 달라요.
Weaviate의 벡터 우선(vector-first) 저장 시스템은 모든 저장 연산을 벡터 인덱스와 함께 처리해요. 이렇게 하면 의미론적·맥락 기반 검색이 가능할 뿐 아니라, (수평 확장이나 충분한 샤드가 있다면) 성능 저하 없이 아주 많은 양의 데이터를 저장할 수 있어요.
Weaviate가 지원하는 벡터 인덱스 유형은 다음과 같아요.
- HNSW 인덱스: 더 복잡한 인덱스로 빌드가 느리지만, 쿼리가 로그 시간 복잡도를 가져 대규모 데이터셋에 잘 확장돼요.
- Flat 인덱스: 작은 데이터셋을 위한 단순하고 가벼운 인덱스예요.
- Dynamic 인덱스: 객체 수가 늘어나면 flat에서 HNSW로 자동 전환해 주는 인덱스예요.
- HFresh 인덱스: 클러스터 기반 인덱스로, 중심(centroid) 인덱스에 HNSW를 사용하며 대부분의 데이터를 디스크에 유지해 메모리 효율이 뛰어나요.
왜 벡터 인덱싱이 필요할까요?
벡터 임베딩은 의미를 표현하는 훌륭한 방법이에요. 벡터를 어떻게 인덱싱하는지 이해하는 것이 벡터 데이터베이스를 제대로 쓰는 데 핵심이에요. 임베딩은 텍스트·이미지·비디오 등 다양한 데이터 유형의 의미를 담을 수 있는 요소들의 배열인데, 이 요소의 개수를 차원(dimension) 이라고 불러요. 차원이 높은 벡터는 더 많은 정보를 담지만 다루기는 더 어렵죠.
벡터 데이터베이스는 고차원 벡터를 다루기 쉽게 만들어 줘요. 벡터는 다차원 공간의 좌표와 같아요. 예를 들어 단어를 2차원 공간에 표현한 아주 단순한 벡터를 생각해 볼게요.
아래 그래프에서 Apple과 Banana는 서로 가까이, Newspaper와 Magazine은 서로 가까이 있지만 Apple과는 멀리 떨어져 있어요. 이렇게 벡터의 공간적 거리가 곧 유사도를 나타내는 거예요. 유사도 검색을 실행하면 Weaviate 같은 벡터 DB는 쿼리를 벡터화한 버전으로, 쿼리 벡터와 유사한 벡터를 가진 객체를 찾아요.
더 알아보기 (Learn more)
- Weaviate 벡터 인덱스 원문: Vector Indexing
- HNSW 인덱스 상세: Vector index config