색인 (Index)
Qdrant의 중요한 특징 중 하나는 벡터 색인과 전통적인 색인을 효과적으로 결합하는 것입니다. 이는 필터링 조건 하에서 효율적인 벡터 검색을 가능케 하는 것에 있어서 단순히 벡터 색인만으로는 충분하지 않기 때문에 중요합니다. 간단히 말해, 벡터 색인은 벡터 검색을 가속화하고, 페이로드 색인은 필터링을 가속화합니다.
단락 내의 색인은 독립적으로 존재하지만, 색인 자체의 매개변수는 전체 세트에 대해 구성됩니다.
모든 단락에 자동으로 색인이 생성되는 것은 아닙니다. 이는 최적화 설정의 요구 사항에 따라 다르며, 일반적으로 저장된 점의 수에 따라 달라집니다.
페이로드 색인 (Payload Index)
Qdrant의 페이로드 색인은 전통적인 문서 지향 데이터베이스의 색인과 유사합니다. 이 색인은 특정 필드 및 유형을 위해 구축되며, 해당 필터 조건에 따라 빠르게 점을 검색하는 데 사용됩니다.
또한 이를 사용하여 필터 조건의 기수를 정확하게 추정하여 쿼리 플래너가 검색 전략을 선택하는 데 도움을 줍니다.
색인을 만들려면 추가 계산 리소스 및 메모리가 필요하므로 색인화할 필드를 신중하게 선택하는 것이 중요합니다. Qdrant는 이 선택을 대신하여 사용자에게 위임합니다.
필드를 인덱싱 가능하게 하려면 다음 방법을 사용할 수 있습니다:
PUT /collections/{collection_name}/index
{
"field_name": "색인화할 필드의 이름",
"field_schema": "keyword"
}
사용 가능한 필드 유형은 다음과 같습니다:
-
keyword
- 필터 조건과 일치하는 키워드 페이로드를 위해. -
integer
- 정수 페이로드를 위한 것으로, 일치 및 범위 필터 조건에 영향을 미칩니다. -
float
- 부동 소수점 페이로드를 위한 것으로, 범위 필터 조건에 영향을 미칩니다. -
bool
- 부동 소수점 페이로드를 위한 것으로, 일치 필터 조건에 영향을 미칩니다 (버전 1.4.0부터 사용 가능). -
geo
- 지리적 페이로드를 위한 것으로, 지리적 경계 상자 및 지리적 반지름 필터 조건에 영향을 미칩니다. -
text
- 키워드/문자열 페이로드에 적합한 특별한 색인 유형으로, 전체 텍스트 검색 필터 조건에 영향을 미칩니다.
페이로드 색인은 추가 메모리를 사용할 수 있으므로 필터 조건에서 사용되는 필드만 색인화하는 것이 좋습니다. 많은 필드를 기반으로 필터링해야 하는 경우 메모리 제약으로 모든 필드를 색인화할 수 없다면, 검색 결과를 가장 제한하는 필드를 선택하는 것이 좋습니다. 일반적으로 페이로드 값이 유일한 경우, 색인 사용이 더 효과적일 것입니다.
전체 텍스트 색인 (Full-text Index)
버전 0.10.0부터 사용 가능
Qdrant는 문자열 페이로드에 대한 전체 텍스트 검색을 지원합니다. 전체 텍스트 색인을 사용하면 페이로드 필드에 단어나 구전의 존재에 기반하여 점을 필터링할 수 있습니다.
전체 텍스트 색인을 구성하는 것은 약간 복잡하며, 토큰화 매개변수를 지정할 수 있습니다. 토큰화는 문자열을 토큰으로 분리한 다음 이러한 토큰을 역색인으로 색인하는 과정입니다.
전체 텍스트 색인을 만들려면 다음 방법을 사용할 수 있습니다:
PUT /collections/{collection_name}/index
{
"field_name": "색인화할 필드 이름",
"field_schema": {
"type": "text",
"tokenizer": "word",
"min_token_len": 2,
"max_token_len": 20,
"lowercase": true
}
}
사용 가능한 토큰화 방법은 다음과 같습니다:
-
word
- 문자열을 공백, 구두점 및 특수 문자를 기준으로 분리합니다. -
whitespace
- 공백을 기준으로 문자열을 분리합니다. -
prefix
- 공백, 구두점 및 특수 문자를 기준으로 문자열을 분리한 다음, 각 단어에 대해 접두사 색인을 생성합니다. 예를 들어hello
는h
,he
,hel
,hell
,hello
로 색인화됩니다. -
multilingual
- charabia 패키지를 기반으로 한 특별한 유형의 토큰화입니다. 여러 언어 및 라틴 문자가 아닌 알파벳 및 공백 구분 기호를 포함하는 언어의 올바른 토큰화와 어간 변화를 허용합니다. 지원되는 언어 및 정규화 옵션의 완전한 목록에 대해서는 charabia 문서를 참조하십시오. 기본 빌드 구성에서 qdrant는 이 모든 언어를 지원하지 않습니다. 그렇게 하면 바이너리 파일의 크기가 증가하게 됩니다. 중국어, 일본어, 한국어는 기본적으로 사용되지 않지만,--features multiling-chinese, multiling-japanese, multiling-korean
플래그를 사용하여 소스 코드에서 qdrant를 빌드하여 활성화할 수 있습니다.
쿼리에 대한 전체 텍스트 일치 예제에 대해서는 전체 텍스트 색인을 사용한 예제를 참조하십시오.
벡터 색인
벡터 색인은 특정 수학적 모델을 기반으로한 벡터를 기반으로 하는 데이터 구조입니다. 벡터 색인을 사용하면 대상 벡터와 유사한 여러 벡터를 효율적으로 조회할 수 있습니다.
현재 Qdrant는 벡터 색인으로 HNSW만을 사용합니다.
HNSW (Hierarchical Navigable Small World Graph)는 그래프 기반 색인 알고리즘입니다. 특정 규칙에 따라 그래프의 다층 내비게이션 구조를 구축합니다. 이 구조에서 상위 층은 더 희박하며 노드 사이의 거리가 더 멀고, 하위 층은 더 밀도가 높으며 노드 사이의 거리가 더 가깝습니다. 검색은 가장 먼저 최상위 층에서 시작되며, 해당 층에서 대상에 가장 가까운 노드를 찾은 후 다음 층으로 이동하여 또 다른 검색을 수행합니다. 여러 번의 반복을 거쳐 빠르게 대상 위치에 접근할 수 있습니다.
성능 향상을 위해 HNSW는 그래프 각 층의 최대 노드 차수를 m
으로 제한하고, 색인 구축 중에 ef_construct
를 사용하거나 대상을 검색하는 동안 ef
를 사용하여 검색 범위를 지정할 수 있습니다.
이러한 매개변수는 설정 파일에서 구성할 수 있습니다.
storage:
hnsw_index:
m: 16
ef_construct: 100
full_scan_threshold: 10000
데이터 수집 생성 과정에서 ef
매개변수를 구성할 수 있으며, 기본적으로 ef_construct
와 동일합니다.
HNSW는 다음과 같은 이유로 선택되었습니다. 먼저, HNSW는 대상 검색 중에 Qdrant가 필터를 수정할 수 있게 하는 호환성이 높습니다. 두 번째로, 공개 벤치마크 테스트에 따르면 가장 정확하고 빠른 알고리즘 중 하나입니다.
v1.1.1부터 사용 가능
hnsw_config
를 설정하여 컬렉션 및 명명된 벡터에 대한 HNSW 매개변수를 최적화하여 검색 성능을 향상시킬 수 있습니다.
필터 가능한 색인
개별 페이로드 색인 및 벡터 색인만으로는 검색에 대한 필터 사용을 완전히 충족시키기 어렵습니다.
필터가 약한 경우에는 HNSW 색인을 직접 사용할 수 있습니다. 필터가 엄격한 경우에는 페이로드 색인을 사용하고 완전히 리스코어링할 수 있습니다. 그러나 중간 경우에 이 접근 방식은 효과적이지 않습니다.
한편으로는 너무 많은 벡터에 대한 완전 스캔을 수행할 여유가 없습니다. 또 다른 한편으로는 지나치게 엄격한 필터를 사용하는 경우 HNSW 그래프가 붕괴하기 시작합니다.
추가 엣지를 추가함으로써 HNSW 색인을 효과적으로 사용하여 이웃 벡터를 검색하고 그래프 내에서 검색하면서 필터를 적용할 수 있습니다.
이 방식은 조건 확인의 오버헤드를 최소화하며, 검색에 참여하는 포인트의 일부에 대해 조건을 계산하기만 하면 되기 때문에 효율적입니다.