컬렉션
Qdrant 벡터 데이터베이스에서의 컬렉션 개념은 MYSQL의 테이블 구조와 유사하며, 동일 유형의 벡터 데이터를 균일하게 저장하는 데 사용됩니다. 컬렉션에 저장된 각 데이터는 Qdrant에서 점이라고 합니다. 여기서 점은 수학적인 기하학적 공간 개념과 유사하며, 기하학적 공간 내 벡터의 표현을 나타냅니다(데이터의 일부로 간주하십시오).
동일한 컬렉션 내에서 각 점의 벡터는 동일한 차원을 가져야하며 단일 메트릭을 사용하여 비교해야 합니다. 명명된 벡터를 사용하여 하나의 점에 여러 벡터를 포함할 수 있으며, 각 벡터는 자체의 차원과 메트릭 요구 사항을 가져야 합니다.
거리 메트릭은 벡터 간 유사성을 측정하는 데 사용됩니다. 메트릭의 선택은 주로 벡터가 어떻게 얻어졌는지(특히 신경망 인코더의 훈련에 사용된 방법)에 따라 달라집니다.
Qdrant에서는 다음과 같은 인기 있는 메트릭 유형을 지원합니다:
- 내적: Dot
- 코사인 유사도: Cosine
- 유클리드 거리: Euclid
검색 효율성을 향상시키기 위해, 코사인 유사도는 정규화된 벡터의 내적을 통해 얻어집니다. 업로드시에는 벡터가 자동으로 정규화됩니다. 메트릭 및 벡터 크기에 추가로, 각 컬렉션은 컬렉션 최적화, 인덱스 구축 및 정리를 제어하기 위해 자체 설정 값을 사용합니다. 이러한 설정은 해당 요청을 통해 언제든지 변경할 수 있습니다.
Multi-Tenancy 설정
몇 개의 컬렉션이 생성되어야 합니까? 대부분의 경우, 대부분의 사용자는 추가 구성이 필요한 복수 페이로드 기반 파티셔닝을 이용하여 단일 컬렉션만 사용하는 것으로 충분할 것입니다. 이 방법은 Multi-Tenancy로 알려져 있습니다. 대부분의 사용자에게 효율적이지만 추가 구성이 필요합니다. Multi-Tenancy 설정에 대해 배워보세요.
언제 여러 컬렉션을 생성해야 합니까? 사용자가 제한된 경우 및 격리가 필요한 경우입니다. 이 방식은 더 유연하지만, 많은 컬렉션을 만들게 될 경우 리로스 과도로 인한 과부하가 발생할 수 있습니다. 또한, 성능 면에서도 서로 간섭하지 않도록 보장해야 합니다.
컬렉션 생성
PUT /collections/{collection_name}
{
"vectors": {
"size": 300,
"distance": "Cosine"
}
}
필수 옵션 외에도 다음 컬렉션 옵션에 대해 사용자 정의 값을 지정할 수 있습니다:
-
hnsw_config
- 인덱스 세부 정보에 대한 참조는 인덱스 섹션을 참조하십시오. -
wal_config
- Write-ahead Logging 관련 구성. 자세한 정보는 WAL을 참조하십시오. -
optimizers_config
- Optimizer 세부 정보에 대한 참조는 Optimizer 섹션을 참조하십시오. -
shard_number
- 컬렉션이 가져야 할 샤드 수를 정의합니다. 자세한 정보는 분산 배포 섹션을 참조하십시오. -
on_disk_payload
- 페이로드 데이터를 저장할 위치를 정의합니다. 설정을true
로 설정하면 페이로드를 디스크에만 저장합니다. 큰 페이로드 처리 시 RAM 사용량을 제한하는 데 매우 유용할 수 있습니다. -
quantization_config
- 양자화에 대한 자세한 내용은 양자화를 참조하십시오.
선택적 컬렉션 매개변수의 기본 매개변수는 구성 파일에 정의되어 있습니다.
컬렉션 및 벡터 매개변수에 대한 자세한 정보는 스키마 정의 및 구성 파일를 참조하십시오.
버전 v1.2.0부터 사용 가능합니다.
벡터는 매우 빠른 액세스를 위해 RAM에 저장됩니다. on_disk
매개변수는 벡터 구성에서 설정할 수 있습니다. true로 설정하면 모든 벡터가 디스크에 저장됩니다. 이는 많은 양의 데이터를 가져올 때 메모리 매핑을 사용할 수 있어 유용합니다.
다른 컬렉션에서 컬렉션 생성
버전 v1.0.0부터 사용 가능합니다.
기존 컬렉션에서 컬렉션을 초기화할 수 있습니다.
같은 데이터 세트에 대한 다양한 구성을 빠르게 시도하는 데 유용할 수 있습니다.
새로운 컬렉션에서 벡터 구성을 설정할 때, 원본 컬렉션과 동일한 크기와 거리 기능을 가진 벡터를 보장해야 합니다.
PUT /collections/{collection_name}
{
"vectors": {
"size": 300,
"distance": "Cosine"
},
"init_from": {
"collection": {from_collection_name}
}
}
다중 벡터 컬렉션
v0.10.0에서 사용 가능
각 레코드는 여러 벡터를 가질 수 있습니다. 이 기능을 통해 여러 벡터를 컬렉션에 저장할 수 있습니다. 레코드 내에서 벡터를 구별하려면 컬렉션을 만들 때 고유한 이름을 정의하십시오. 이 스키마에 따른 각각의 명명된 벡터는 자체적인 거리와 크기를 가지고 있습니다:
PUT /collections/{collection_name}
{
"vectors": {
"image": {
"size": 4,
"distance": "Dot"
},
"text": {
"size": 8,
"distance": "Cosine"
}
}
}
특별한 경우로, 벡터 저장없이도 컬렉션을 만들 수 있습니다.
v1.1.1에서 사용 가능
각 명명된 벡터에 대해 hnsw_config
또는 quantization_config
를 선택적으로 지정하여 컬렉션 구성에서 벗어날 수 있습니다. 이는 벡터 레벨에서 검색 성능을 최적화하는 데 사용할 수 있습니다.
v1.2.0에서 사용 가능
벡터는 빠른 액세스를 위해 메모리에 저장됩니다. 각 벡터에 대해 on_disk
를 true
로 설정하여 항상 모든 벡터를 디스크에 저장할 수 있습니다. 이는 대량의 데이터 적재에 적합한 메모리 맵핑을 가능하게 합니다.
컬렉션 삭제
DELETE /collections/{collection_name}
컬렉션 매개변수 업데이트
동적 매개변수 업데이트는 벡터의 초기 로딩을 더 효율적으로 만드는 데 도움이 될 수 있습니다. 예를 들어, 업로드 중에 색인화를 비활성화하고 업로드 완료 후 즉시 활성화할 수 있습니다. 이렇게 하면 색인을 다시 구축하는 데 추가 계산 리소스를 낭비하지 않게 됩니다.
다음 명령은 10000kB보다 큰 벡터를 포함하는 세그먼트에 대해 색인화를 활성화합니다:
PATCH /collections/{collection_name}
{
"optimizers_config": {
"indexing_threshold": 10000
}
}
다음과 같은 매개변수를 업데이트할 수 있습니다:
-
optimizers_config
- 옵티마이저에 대한 자세한 설명을 참조하세요. -
hnsw_config
- 색인에 대한 자세한 설명을 참조하세요. -
quantization_config
- 양자화에 대한 자세한 설명을 참조하세요. -
vectors
- 각각의hnsw_config
,quantization_config
,on_disk
설정을 포함한 특정 벡터 구성. -
params
-write_consistency_factor
및on_disk_payload
를 포함한 기타 컬렉션 매개변수.
완전한 API 사양은 스키마 정의에서 확인할 수 있습니다.
v1.4.0부터 사용 가능
Qdrant 1.4에서는 컬렉션을 재생성하지 않고도 런타임에서 더 많은 컬렉션 매개변수를 업데이트할 수 있습니다. HNSW 색인, 양자화 및 디스크 구성을 변경할 수 있으며, 세그먼트(색인 및 양자화 데이터를 포함)는 업데이트된 매개변수와 일치하도록 백그라운드에서 자동으로 다시 구축됩니다.
다음 예시에서는 my_vector
에 대한 전체 컬렉션 및 HNSW 색인 및 양자화 매개변수가 업데이트됩니다:
PATCH /collections/{collection_name}
{
"vectors": {
"my_vector": {
"hnsw_config": {
"m": 32,
"ef_construct": 123
},
"quantization_config": {
"product": {
"compression": "x32",
"always_ram": true
}
},
"on_disk": true
}
},
"hnsw_config": {
"ef_construct": 123
},
"quantization_config": {
"scalar": {
"type": "int8",
"quantile": 0.8,
"always_ram": false
}
}
}
참고: 명명된 벡터가 없는 컬렉션에서 벡터 매개변수를 업데이트하려면 빈 (""
) 이름을 사용할 수 있습니다.
기존 옵티마이저를 기다리는 동안 이 엔드포인트에 대한 호출은 차단될 수 있습니다. 색인을 다시 구축하는 경우 상당한 오버헤드가 발생할 수 있으므로 본 기능을 프로덕션 데이터베이스에서 사용하지 않는 것이 좋습니다.
컬렉션 정보
Qdrant는 기존 컬렉션의 구성 매개변수를 결정하여 점들의 분포와 색인 상황을 더 잘 이해할 수 있도록 합니다.
GET /collections/{collection_name}
{
"result": {
"status": "green",
"optimizer_status": "ok",
"vectors_count": 1068786,
"indexed_vectors_count": 1024232,
"points_count": 1068786,
"segments_count": 31,
"config": {
"params": {
"vectors": {
"size": 384,
"distance": "Cosine"
},
"shard_number": 1,
"replication_factor": 1,
"write_consistency_factor": 1,
"on_disk_payload": false
},
"hnsw_config": {
"m": 16,
"ef_construct": 100,
"full_scan_threshold": 10000,
"max_indexing_threads": 0
},
"optimizer_config": {
"deleted_threshold": 0.2,
"vacuum_min_vector_number": 1000,
"default_segment_number": 0,
"max_segment_size": null,
"memmap_threshold": null,
"indexing_threshold": 20000,
"flush_interval_sec": 5,
"max_optimization_threads": 1
},
"wal_config": {
"wal_capacity_mb": 32,
"wal_segments_ahead": 0
}
},
"payload_schema": {}
},
"status": "ok",
"time": 0.00010143
}
만약 벡터가 컬렉션에 삽입되면 status
필드는 최적화 중에 "yellow"로 변경될 수 있으며 모든 점이 성공적으로 처리된 후 "green"으로 바뀔 것입니다.
다음과 같은 색깔 상태를 만날 수 있습니다:
- ?
green
: 컬렉션은 준비됨 - ?
yellow
: 컬렉션은 최적화 중 - ?
red
: 엔진이 복구 불가능한 오류를 만남
다른 관심 있는 속성들은 다음과 같습니다:
-
points_count
- 컬렉션에 저장된 객체(벡터 및 페이로드)의 총 수 -
vectors_count
- 컬렉션에 있는 벡터의 총 수. 각 객체에 여러 벡터가 있는 경우, 이 값은points_count
와 같지 않을 수 있습니다. -
indexed_vectors_count
- HNSW 색인에 저장된 벡터의 총 수. Qdrant는 모든 벡터를 색인에 저장하지 않으며, 주어진 구성에 따라 인덱스 세그먼트를 생성할 수 있는 벡터만 저장합니다.
HNSW에서 벡터 색인화
indexed_vectors_count
의 값이 vectors_count
보다 작을 수 있습니다. 이는 최적화 도구의 구성에 따라 의도적인 동작입니다. 색인화되지 않은 벡터의 크기가 indexing_threshold
(KB)를 초과하면 새로운 색인 세그먼트가 생성됩니다. 컬렉션이 매우 작거나 벡터 차원이 낮은 경우, HNSW 세그먼트가 생성되지 않을 수 있으며 indexed_vectors_count
는 0
이 될 수 있습니다.
기존 컬렉션에 새로운 색인 세그먼트를 만들려면 컬렉션 매개변수의 indexing_threshold
값을 줄일 수 있습니다.
컬렉션 별칭
운영 환경에서 새로운 신경망 버전으로 업그레이드하는 등 다양한 버전의 벡터 간에 원할한 전환 필요할 수 있습니다.
이러한 경우, 서비스를 중지하고 새로운 벡터를 사용하여 컬렉션을 다시 빌드하는 것은 현실적이지 않을 수 있습니다. 별칭은 기존 컬렉션의 추가적인 이름입니다. 질의는 컬렉션 이름 대신 별칭을 사용하여 완전히 실행될 수 있습니다.
따라서 두 번째 컬렉션을 백그라운드에서 빌드한 다음, 별칭을 이전 컬렉션에서 새 컬렉션으로 전환할 수 있습니다. 별칭 변경은 원자적이기 때문에 전환 과정에서 동시 요청이 영향을 받지 않습니다.
별칭 만들기
POST /collections/aliases
{
"actions": [
{
"create_alias": {
"alias_name": "production_collection",
"collection_name": "example_collection"
}
}
]
}
별칭 삭제
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"alias_name": "production_collection"
}
}
]
}
컬렉션 전환
여러 별칭 작업을 원자적으로 실행할 수 있습니다. 예를 들어, 다음 명령을 사용하여 기본 컬렉션을 전환할 수 있습니다:
POST /collections/aliases
{
"actions": [
{
"delete_alias": {
"alias_name": "production_collection"
}
},
{
"create_alias": {
"alias_name": "production_collection",
"collection_name": "new_collection"
}
}
]
}
리스트 컬렉션 별칭
GET /collections/{collection_name}/aliases
모든 별칭 나열
GET /aliases
모든 컬렉션 나열
GET /collections