다음을 통해 공유


Microsoft Fabric의 Cosmos DB에서 인덱스 벡터 데이터(미리 보기)

중요합니다

이 기능은 프리뷰 상태입니다.

Microsoft Fabric의 Cosmos DB는 이제 효율적인 벡터 인덱싱 및 검색을 제공합니다. 이 기능은 모든 규모에서 효율적이고 정확한 벡터 검색을 가능하게 하는 다차원 고차원 벡터를 처리하도록 설계되었습니다. 이제 데이터와 함께 문서에 직접 벡터를 저장할 수 있습니다. 데이터베이스의 각 문서에는 기존의 스키마 없는 데이터뿐만 아니라 문서의 다른 속성으로 다중 모달 고차원 벡터도 포함될 수 있습니다. 데이터와 벡터를 함께 배치하면 벡터가 나타내는 데이터와 동일한 논리적 단위에 저장되므로 효율적인 인덱싱 및 검색이 가능합니다. 벡터와 데이터를 함께 유지하면 데이터 관리, AI 애플리케이션 아키텍처 및 벡터 기반 작업의 효율성이 간소화됩니다.

패브릭의 Cosmos DB는 벡터 인덱싱 방법을 선택할 때 제공하는 유연성을 제공합니다.

  • "플랫" 또는 k-가장 인접한 항목의 정확한 검색(무차별 암호 대입이라고도 함)은 더 작고 집중된 벡터 검색에 대해 100% 검색 재현율을 제공할 수 있습니다. 특히 쿼리 필터 및 파티션 키와 결합할 경우 더욱 그렇습니다.

  • kNN 검색의 효율성을 높이기 위해 DiskANN 기반 양자화 방법을 사용하여 벡터를 압축하는 양자화된 플랫 인덱스입니다.

  • DiskANN은 모든 규모에서 효율적이고 높은 정확도의 다중 모달 벡터 검색을 구동하기 위해 Microsoft Research에서 개발한 최신 벡터 인덱싱 알고리즘 모음입니다.

Cosmos DB에서 벡터 검색은 WHERE 절을 사용하여 지원되는 다른 모든 NoSQL 쿼리 필터 및 인덱스와 결합할 수 있습니다. 이 조합을 사용하면 벡터 검색이 애플리케이션에 가장 관련성이 큰 데이터가 될 수 있습니다.

이 기능은 Cosmos DB의 핵심 기능을 향상시켜 AI 애플리케이션에서 벡터 데이터 및 검색 요구 사항을 보다 다양하게 처리할 수 있도록 합니다.

벡터 저장소란?

벡터 저장소 또는 벡터 데이터베이스는 벡터 포함을 저장하고 관리하도록 설계된 데이터베이스로, 높은 차원 공간에서 데이터의 수학 표현입니다. 이 공간에서 각 차원은 데이터의 기능에 해당하며, 정교한 데이터를 나타내기 위해 수만 개의 차원이 사용될 수 있습니다. 이 공간에서 벡터의 위치는 해당 특성을 나타냅니다. 단어, 구 또는 전체 문서, 이미지, 오디오 및 기타 유형의 데이터를 모두 벡터화할 수 있습니다.

벡터 저장소는 어떻게 작동하나요?

벡터 저장소에서는 벡터 검색 알고리즘을 사용하여 포함을 인덱싱하고 쿼리합니다. 잘 알려진 벡터 검색 알고리즘에는 HNSW(Hierarchical Navigable Small World), IVF(Inverted File), DiskANN 등이 있습니다. 벡터 검색은 속성 필드의 정확한 일치가 아닌 데이터 특성을 기반으로 유사한 항목을 찾는 데 도움이 되는 방법입니다. 이 기술은 유사한 텍스트 검색, 관련 이미지 찾기, 권장 사항 제공 또는 변칙 징후 검색과 같은 애플리케이션에 유용합니다. 이는 임베딩 API를 사용하여, 기계 학습 모델로 생성한 데이터의 벡터 임베딩을 쿼리하는 데 사용됩니다. 임베딩 API의 예로는 Azure OpenAI 임베딩 또는 Azure의 Hugging Face가 있습니다. 벡터 검색은 데이터 벡터와 쿼리 벡터 사이의 거리를 측정합니다. 쿼리 벡터에 가장 가까운 데이터 벡터는 의미상 가장 유사한 것으로 확인된 벡터입니다.

Fabric의 Cosmos DB에 있는 통합 벡터 데이터베이스에서 원본 데이터와 함께 포함을 저장, 인덱싱 및 쿼리할 수 있습니다. 이 방식은 별도의 순수 벡터 데이터베이스에 데이터를 복제하는 데 드는 추가 비용을 제거합니다. 또한 이 아키텍처는 벡터 포함과 원본 데이터를 함께 유지하므로 다중 모드 데이터 작업을 더 쉽게 수행하고 데이터 일관성, 규모 및 성능을 향상시킬 수 있습니다.

컨테이너 벡터 정책

Fabric에서 Cosmos DB를 사용하여 벡터 검색을 수행하려면 컨테이너에 대한 벡터 정책을 정의해야 합니다. 이 정책은 컨테이너의 문서에 있는 벡터에 대한 효율적인 유사성 검색을 수행하기 위해 데이터베이스 엔진에 대한 필수 정보를 제공합니다. 또한 이 구성은 벡터 인덱싱 정책에 필요한 정보를 지정하도록 선택하는 경우 이를 알려줍니다. 포함된 벡터 정책에는 다음 정보가 포함됩니다.

  • path: 벡터를 포함하는 속성(필수)입니다.

  • datatype: 벡터 속성의 데이터 형식입니다. 지원되는 형식은 float32 (기본값), int8uint8.

  • dimensions: 경로에 있는 각 벡터의 차원 또는 길이입니다. 경로의 모든 벡터는 동일한 차원 수를 가져야 합니다. (기본값 1536).

  • distanceFunction: 거리/유사성을 계산하는 데 사용되는 메트릭입니다. 지원되는 메트릭은 다음과 같습니다.

    • cosine- $-1$(최소 유사)에서 $+1$(가장 유사한) 값이 있습니다.

    • dot product- $-\infty$(최소 유사)에서 $+\infty$(가장 유사)의 값을 가집니다.

    • euclidean값이 $0$(가장 유사)에서 $+\infty$(최소 유사)인 경우

비고

각 고유 경로에는 최대 하나의 정책이 있을 수 있습니다. 그러나 모두 다른 경로를 대상으로 하는 경우 여러 정책을 지정할 수 있습니다.

컨테이너 벡터 정책은 JSON 개체로 설명할 수 있습니다. 다음은 유효한 컨테이너 벡터 정책의 두 가지 예입니다.

단일 벡터 패스가 있는 정책

{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    }
  ]
}

두 개의 벡터 패스가 있는 정책

{
  "vectorEmbeddings": [
    {
      "path": "/vector1",
      "dataType": "float32",
      "distanceFunction": "cosine",
      "dimensions": 1536
    },
    {
      "path": "/vector2",
      "dataType": "int8",
      "distanceFunction": "dotproduct",
      "dimensions": 100
    }
  ]
}

컨테이너 벡터 정책 설정에 대한 자세한 내용 및 예제는 벡터 인덱싱 정책 샘플을 참조하세요.

벡터 인덱싱 정책

벡터 인덱스는 VectorDistance 시스템 함수를 사용하여 벡터 검색을 수행할 때 효율성을 높입니다. 벡터 검색은 벡터 인덱스를 사용할 때 대기 시간이 짧고 처리량이 높으며 RU 사용량이 적습니다. 다음과 같은 유형의 벡터 인덱스 정책을 지정할 수 있습니다.

설명 최대 크기
flat 다른 인덱싱된 속성과 동일한 인덱스에 벡터를 저장합니다. 505
quantizedFlat 인덱스에 저장하기 전에 벡터를 양자화(압축)합니다. 이 정책은 적은 양의 정확도로 대기 시간 및 처리량을 향상시킬 수 있습니다. 4096
diskANN DiskANN을 기반으로 빠르고 효율적인 근사 검색을 위한 인덱스를 만듭니다. 4096

비고

quantizedFlatdiskANN 인덱스는 적어도 1,000개 이상의 벡터를 삽입해야 합니다. 이 최소값은 양자화 프로세스의 정확도를 보장하는 것입니다. 1,000개 미만의 벡터가 있는 경우 전체 검사가 대신 실행되고 벡터 검색 쿼리에 대한 RU 요금이 높아집니다.

주의할 사항:

  • flat 인덱스 형식은 quantizedFlat Cosmos DB의 인덱스를 사용하여 벡터 검색 중에 각 벡터를 저장하고 읽습니다. flat 인덱스를 사용한 벡터 검색은 무차별 검색이며 100% 정확도 또는 재현율을 생성합니다. 즉, 데이터 세트에서 가장 유사한 벡터를 찾을 수 있습니다. 그러나 플랫 인덱스의 505 벡터에 대한 차원에는 제한이 있습니다.

  • quantizedFlat 인덱스는 인덱스에 양자화된(압축된) 벡터를 저장합니다. quantizedFlat 인덱스를 사용한 벡터 검색도 무차별 검색이지만 벡터가 인덱스에 추가되기 전에 양자화되므로 정확도가 100%보다 약간 낮을 수 있습니다. 그러나 quantized flat을 사용한 벡터 검색은 flat 인덱스의 벡터 검색보다 대기 시간이 짧고 처리량이 높으며 RU 비용이 낮아야 합니다. 이 인덱스는 더 작은 시나리오 또는 쿼리 필터를 사용하여 벡터 검색 범위를 비교적 작은 벡터 집합으로 좁히는 시나리오에 적합한 옵션입니다. quantizedFlat 인덱싱할 벡터 수가 실제 파티션당 약 50,000개 이하인 경우 권장됩니다. 그러나 이 권장 사항은 일반적인 지침일 뿐이며 각 시나리오가 다를 수 있으므로 실제 성능을 테스트해야 합니다.

  • diskANN 인덱스는 Microsoft Research에서 개발한 고성능 벡터 인덱스 알고리즘 도구 모음인 DiskANN을 사용하여 벡터에 대해 특별히 정의된 별도의 인덱스입니다. DiskANN 인덱스는 높은 정확도를 유지하면서 가장 낮은 대기 시간, 가장 높은 처리량, 가장 낮은 RU 비용 쿼리를 제공할 수 있습니다. 일반적으로 실제 파티션당 50,000개 이상의 벡터가 있는 경우 DiskANN은 모든 인덱스 형식 중 가장 성능이 높습니다.

유효한 벡터 인덱스 정책의 예는 다음과 같습니다.

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/_etag/?"
    },
    {
      "path": "/vector1/*"
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "diskANN"
    }
  ]
}
{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*"
    }
  ],
  "excludedPaths": [
    {
      "path": "/_etag/?"
    },
    {
      "path": "/vector1/*",
    },
    {
      "path": "/vector2/*",
    }
  ],
  "vectorIndexes": [
    {
      "path": "/vector1",
      "type": "quantizedFlat"
    },
    {
      "path": "/vector2",
      "type": "diskANN"
    }
  ]
}

중요합니다

삽입에 최적화된 성능을 보장하기 위해 excludedPaths 인덱싱 정책 섹션에 추가된 벡터 경로입니다. 벡터 경로를 excludedPaths 추가하지 않으면 벡터 삽입에 대한 요청 단위 요금 및 대기 시간이 높아질 수 있습니다.

중요합니다

와일드카드 문자(*, [])는 현재 벡터 정책 또는 벡터 인덱스에서 지원되지 않습니다.

VECTORDISTANCE를 사용하여 쿼리를 통해 벡터 검색을 수행합니다.

원하는 벡터 정책을 사용하여 컨테이너를 만들고 컨테이너에 벡터 데이터를 삽입한 후에는 쿼리의 기본 제공 VECTORDISTANCE 함수 를 사용하여 벡터 검색을 수행할 수 있습니다. 유사성 점수를 별칭 score(으)로 프로젝션하고 가장 유사한 것부터 가장 덜 유사한 것 순서로 정렬하는 NoSQL 쿼리의 예는 다음과 같습니다.

SELECT TOP 10
  c.title,
  VECTORDISTANCE(c.contentVector, [1,2,3]) AS score 
FROM
  container c
ORDER BY
  VECTORDISTANCE(c.contentVector, [1,2,3])   

중요합니다

항상 쿼리 문에 TOP N 절을 사용합니다SELECT. 그렇지 않으면 벡터 검색이 더 많은 결과를 반환하려고 시도하여 쿼리에 RU(요청 단위)가 더 많이 발생하고 필요한 것보다 대기 시간이 더 깁니다.