다음을 통해 공유


Azure Cosmos DB for NoSQL의 벡터 검색(미리 보기)

적용 대상: NoSQL

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

Azure Cosmos DB for NoSQL은 벡터 인덱싱 방법을 선택할 때 제공되는 유연성을 제공합니다.

  • "플랫" 또는 k-가장 가까운 인접 항목의 정확한 검색(무차별 암호 대입이라고도 함)은 더 작고 집중된 벡터 검색에 대해 100% 검색 재현율을 제공할 수 있습니다. 특히 쿼리 필터 및 파티션 키와 결합할 경우 더욱 그렇습니다.
  • kNN 검색의 효율성을 높이기 위해 DiskANN 기반 양자화 방법을 사용하여 벡터를 압축하는 양자화된 플랫 인덱스입니다.
  • DiskANN은 어떤 규모에서도 효율적이고 정확도가 높은 벡터 검색을 지원하기 위해 Microsoft Research에서 개발한 최첨단 벡터 인덱싱 알고리즘 도구 모음입니다.

여기에서 벡터 인덱싱에 대해 자세히 알아봅니다.

Azure Cosmos DB의 벡터 검색은 WHERE 절을 사용하여 지원되는 다른 모든 Azure Cosmos DB NoSQL 쿼리 필터 및 인덱스와 결합될 수 있습니다. 이를 통해 벡터 검색이 사용자의 애플리케이션과 가장 관련성이 높은 데이터가 될 수 있습니다.

이 기능은 Azure Cosmos DB의 핵심 기능을 향상시켜 AI 애플리케이션에서 벡터 데이터 및 검색 요구 사항을 처리하는 데 더욱 다양한 기능을 제공합니다.

벡터 저장소란?

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

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

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

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

벡터 검색 미리 보기 기능에 등록

Azure Cosmos DB for NoSQL에 대한 벡터 검색에는 Azure Cosmos DB의 기능 페이지에 미리 보기 기능 등록이 필요합니다. 등록하려면 아래 단계를 따릅니다.

  1. Azure Cosmos DB for NoSQL 리소스 페이지로 이동합니다.

  2. "설정" 메뉴 항목 아래에서 "기능" 창을 선택합니다.

  3. "Azure Cosmos DB for NoSQL의 벡터 검색"을 선택합니다.

  4. 기능 설명을 읽고 미리 보기에 등록할지 확인합니다.

  5. 미리 보기에 등록하려면 "사용"을 선택합니다.

참고 항목

등록 요청은 자동 승인되지만 적용되는 데 몇 분 정도 걸릴 수 있습니다.

참고 항목

DiskANN은 초기 제한 미리 보기로 제공되며 이 양식을 작성해야 합니다. DiskANN 인덱스를 사용하도록 리소스가 온보딩되면 Azure Cosmos DB 팀 멤버가 연락을 드릴 것입니다.

또는 Azure CLI를 사용하여 계정의 기능을 업데이트하여 NoSQL 벡터 검색을 지원합니다.

az cosmosdb update \
     --resource-group <resource-group-name> \
     --name <account-name> \
     --capabilities EnableNoSQLVectorSearch

컨테이너 벡터 정책

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

  • "path": 벡터를 포함하는 속성(필수)입니다.
  • "datatype": 벡터 속성의 데이터 형식(기본값은 Float32)입니다. 
  • "dimensions": 경로에 있는 각 벡터의 차원 또는 길이입니다. 경로의 모든 벡터는 동일한 차원 수를 가져야 합니다. (기본값 1536).
  • "distanceFunction": 거리/유사성을 계산하는 데 사용되는 메트릭입니다. 지원되는 메트릭은 다음과 같습니다.
    • cosine: -1(가장 유사하지 않음)부터 +1(가장 유사함)까지의 값을 갖습니다.
    • dotproduct는 -inf(가장 유사하지 않음)부터 +inf(가장 유사함)까지의 값을 갖습니다.
    • euclidean: 0(가장 유사함)부터 +inf)(가장 유사하지 않음)까지의 값을 갖습니다.

참고 항목

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

컨테이너 벡터 정책은 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 사용량이 적습니다. 다음 형식의 벡터 인덱스 정책을 지정할 수 있습니다.

Type 설명 최대 차원
flat 다른 인덱싱된 속성과 동일한 인덱스에 벡터를 저장합니다. 505
quantizedFlat 인덱스에 저장하기 전에 벡터를 양자화(압축)합니다. 이는 약간의 정확도를 희생하면서 대기 시간과 처리량을 개선할 수 있습니다. 4096
diskANN 빠르고 효율적인 근사 검색을 위해 DiskANN을 기반으로 인덱스를 만듭니다. 4096

주의할 사항:

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

  • quantizedFlat 인덱스는 인덱스에 양자화된(압축된) 벡터를 저장합니다. quantizedFlat 인덱스를 사용한 벡터 검색도 무차별 검색이지만 벡터가 인덱스에 추가되기 전에 양자화되므로 정확도가 100%보다 약간 낮을 수 있습니다. 그러나 quantized flat을 사용한 벡터 검색은 flat 인덱스의 벡터 검색보다 대기 시간이 짧고 처리량이 높으며 RU 비용이 낮아야 합니다. 이는 소규모 시나리오 또는 쿼리 필터를 사용하여 벡터 검색 범위를 상대적으로 작은 벡터 집합으로 좁히는 시나리오에 적합한 옵션입니다. 컨테이너에 벡터가 1,000개 이상이고 벡터가 100,000개 미만인 경우 quantizedFlat을 사용해야 합니다.

  • diskANN 인덱스는 Microsoft Research에서 개발한 고성능 벡터 인덱스 알고리즘 도구 모음인 DiskANN을 사용하여 벡터에 대해 특별히 정의된 별도의 인덱스입니다. DiskANN 인덱스는 높은 정확도를 유지하면서 가장 낮은 대기 시간, 가장 높은 처리량, 가장 낮은 RU 비용 쿼리를 제공할 수 있습니다. 그러나 DiskANN은 ANN(Approximous Nearest Neighbors) 인덱스이므로 정확도가 quantizedFlat 또는 flat보다 낮을 수 있습니다. DiskANN은 초기 제한 미리 보기로 제공되며 이 양식을 작성해야 합니다.

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

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

참고 항목

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

Important

현재 벡터 검색 미리 보기에서는 벡터 정책 경로에 중첩 경로나 와일드카드 문자를 사용하지 마세요. 벡터 정책에 대한 바꾸기 작업은 현재 지원되지 않습니다.

VectorDistance()를 사용하여 쿼리로 벡터 검색 수행

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

SELECT c.title, VectorDistance(c.contentVector, [1,2,3]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3])   

현재 제한 및 제약 조건

Azure Cosmos DB for NoSQL의 벡터 인덱싱 및 검색에는 공개 미리 보기의 초기 단계에 있는 동안 몇 가지 제한 사항이 있습니다.

  • 벡터 인덱스 정책에서는 경로당 최대 하나의 인덱스 형식을 지정할 수 있습니다.
  • 컨테이너당 최대 하나의 DiskANN 인덱스 형식을 지정할 수 있습니다.
  • 벡터 인덱싱은 새 컨테이너에서만 지원됩니다.
  • flat 인덱스 형식으로 인덱스가 생성된 벡터는 최대 505차원일 수 있습니다. quantizedFlat 또는 DiskANN 인덱스 형식으로 인덱스가 생성된 벡터는 최대 4,096차원일 수 있습니다.
  • quantizedFlat(은)는 DiskANN과 동일한 양자화 방법을 사용하며 현재는 구성할 수 없습니다.
  • 현재 공유 처리량 데이터베이스는 벡터 검색 미리 보기 기능을 사용할 수 없습니다.
  • DiskANN의 초기 미리 보기를 사용하는 동안 수집 속도가 제한되어야 합니다.

다음 단계