Skip to content

Instantly share code, notes, and snippets.

@sigridjineth
Created December 8, 2023 01:59
Show Gist options
  • Save sigridjineth/3597317f95373c27d42e2040fdaf3cce to your computer and use it in GitHub Desktop.
Save sigridjineth/3597317f95373c27d42e2040fdaf3cce to your computer and use it in GitHub Desktop.
vdbqdrant indexing
  • VDB (벡터 데이터베이스)는 세그먼트 수준에서 optimize가 이루어집니다. 하기 장표의 예시는 Rust 기반 VDB인 Qdrant의 Optimizer에 대한 것입니다. 일반적으로 다른 데이터베이스와 마찬가지로 배치 전략으로 인덱스를 빌드하는 것이 각각 수행하는 것보다 일반적입니다. 공식 문서에서는 해당 구조를 처음부터 완전히 재구축하는 것이 필요하다고 명시하기도 합니다.

  • Milvus와 Qdrant 모두 데이터를 저장하는 기본 단위로 segment를 명시합니다. 세그먼트 최적화 과정은 copy-on-write segment 기법이 사용되는데 만약 기존의 인덱스를 다시 빌드해야 한다고 하면 기존의 새로운 세그먼트 데이터를 copy하여 새로운 세그먼트를 생성하고 새로운 세그먼트에 대한 변경사항을 적용합니다. 이러한 과정을 통하여 데이터를 수정할 때 데이터 무결성을 유지할 수 있습니다. 인덱스를 전체 리빌딩하는 과정이 있더라도 기존의 인덱스에서 계속 접근 가능하기 때문에 장애가 발생하기 어렵습니다.

  • 세그먼트 최적화 과정이 필요한 이유는, 일반적으로 세그먼트 단위로 독립적으로 검색될 수 있어 전체 데이터베이스를 검색하는 것보다 훨씬 빠른 검색이 가능하다는 전제에도 시작합니다. 세그먼트 별로 각기 다른 시점에서 최적화를 수행할 수 있으므로 전체 데이터베이스를 full rebuild해야 하는 상황도 피할 수 있습니다. 다만 embedding data point의 수가 1만 개 미만일 때는 특정한 인덱싱 전략을 사용하는 것보다는 단순하게 BF (brute force) 전략을 사용하는 것이 효과적일 수 있고, 세그먼트 크기가 일정한 threshold를 초과하면 Qdrant는 읽기 전용의 메모리 매핑된 파일로 데이터를 저장하도록 세부적인 하이퍼 파라미터를 조정할 수 있습니다. 혹은 벡터의 크기가 일정한 임계값을 초과할 경우, 벡터 임베딩을 활성화하도록 조정할 수도 있습니다.

  • 또한 구성 파일 외에도 각 컬렉션에 대해서도 최적화가 가능한지 (override 가능 여부) 도 살펴봐야하고, 위에서 언급한 내용 외에도 세그먼트 개수를 정해서 자주 업데이트 되는 데이터에 대하여 임시 세그먼트 개수를 최대 5개까지 허용하고 만약 5개를 넘는다면 하나의 세그먼트로 병합하도록 설정하는 것도 가능합니다. 예를 들면 문서의 개수가 1천 - 1만개 단위, 벡터의 개수가 million scale 단위 수준에서 조정이 가능하다면, 세그먼트 당 메모리에 저장될 수 있는 memory mapping threshold의 크기를 20만 KB까지 넉넉히 둘 수 있고, 만약 고객이 많은 양의 벡터를 다룰 것이라고 예상된다면 해당 collection은 유연하게 조정할 수 있어야 합니다.

  • On-disk (DiskANN) 옵션의 사용도 여기에 중요한 이유인데, 만약 사용자가 메타데이터 필터링 옵션에 따라서 임베딩을 검색하고자 할 경우 어떤 전략을 바탕으로 검색하는 지에 대한 이해도 필요합니다. 임베딩 벡터 값과 페이로드를 포함한 Data Point (Entity) 를 기존의 ANN에 대한 이해에 따라 On-Memory에 모두 로드하게 될 경우 과도하게 RAM의 사용량을 차지할 가능성이 있습니다. 따라서 페이로드를 포함하여 검색을 희망할 경우 처음에 Segment 단위를 저장할 때 memmap 옵션에 대한 고민을 수행하는 것이 좋습니다. Qdrant의 Optimizer는 메타데이터를 기반으로 검색을 수행할 때 Optimizer가 prefiltering을 수행하는데 반해, RDB의 vector extension으로 주목받고 있는 pgvector (postgresql vector extension) 은 SQL WHERE 문을 포함한 query 검색을 먼저 수행하고 View를 모두 만들어 인메모리로 로드하고 나서야 벡터 search가 이루어집니다 (post-filtering)

  • 일반적인 VDB는 이러한 옵션들을 허용할 텐데, 이러한 튜닝의 가정은 비즈니스 별로 필요하며 어떤 VDB가 튜닝의 옵션을 얼마나 허용하는지에 대한 깊이 있는 이해도 동반되어야 합니다. 벡터의 양 자체가 많아지는 AI Native 시대에는 Foundation 모델의 중요도와 같은 선상에서 벡터의 양을 flexible하게 다룰 수 있는 Ops 인프라 역시 주목해야 합니다.

@sigridjineth
Copy link
Author

image

@sigridjineth
Copy link
Author

Screenshot 2023-12-08 at 10 58 50 AM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment