컬렉션

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_disktrue로 설정하여 항상 모든 벡터를 디스크에 저장할 수 있습니다. 이는 대량의 데이터 적재에 적합한 메모리 맵핑을 가능하게 합니다.

컬렉션 삭제

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_factoron_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_count0이 될 수 있습니다.

기존 컬렉션에 새로운 색인 세그먼트를 만들려면 컬렉션 매개변수의 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