[Qdrant] 벡터 검색과 필터
일반적으로 벡터 인덱스는 사전 필터링을 적용하기 어렵다고 알려져있지만, Qdrant의 경우에는 이를 공식적으로 지원한다.
일단 qdrant의 경우에는 벡터 검색에 필터링을 적용하는 기법이 2가지 존재한다.
옵티마이저는 필터 대상 필드의 카디널리티에 기반해서 실제 동작 방식을 결정한다.
필터 가능한 인덱스 (Filterable Index)
qdrant가 자랑하는 기능이다.
이건 그냥 HNSW 그래프 탐색 중에 필터링을 동적으로 하면서 거르고 가는 방법이다.
근데 필터링으로 막 거르다보면 탐색 경로가 끊기기가 쉬우니, qdrant의 경우에는 특수한 방법론을 통해 노드 간에 엣지를 추가해서, 탐색 경로를 인위적으로 확장하는 방식을 취한다.
이 기능은 대규모 데이터셋에 대해서도 어느 정도 과부하 없이 버틸 수 있다.
사전 필터링 (Pre-filtering)
혹은 HNSW보다는 Payload Index에 좀 더 의존해서 필터링이 되게 할 수도 있다.
여기선 일단 HNSW에 접근하지 않고, 우선 Payload 인덱스에 의존해서 벡터 데이터들을 로드한다.
그리고 로드한 데이터들을 기준으로 해서 유사도 연산을 해서 최종 데이터를 고른다.
통째로 로드한 데이터를 기준으로 또 연산을 하는거라, 필터링해온 대상 값의 크기가 크지 않을 때만 효율적인 방법이다. 그렇지 않다면 상기한 filterable index가 더 좋은 방법일 수 있다.
참조
https://blog.vasnetsov.com/posts/categorical-hnsw/
https://qdrant.tech/articles/vector-search-filtering/
https://qdrant.tech/documentation/concepts/indexing/
https://github.com/orgs/qdrant/discussions/322