다음을 통해 공유


Azure Cosmos DB for NoSQL의 벡터 검색

적용 대상: NoSQL

이제 NoSQL용 Azure Cosmos DB는 효율적인 벡터 인덱싱 및 검색을 제공합니다. 이 기능은 고차원 벡터를 처리하도록 설계되어 어떤 규모에서도 효율적이고 정확한 벡터 검색이 가능합니다. 이제 데이터와 함께 문서에 직접 벡터를 저장할 수 있습니다. 데이터베이스의 각 문서에는 기존의 스키마가 없는 데이터뿐만 아니라 문서의 다른 속성으로 고차원 벡터도 포함될 수 있습니다. 데이터와 벡터를 함께 배치하면 벡터가 나타내는 데이터와 동일한 논리적 단위에 저장되므로 효율적인 인덱싱 및 검색이 가능합니다. 벡터와 데이터를 함께 유지하면 데이터 관리, 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의 통합 벡터 데이터베이스에서는 원본 데이터와 함께 포함을 저장, 인덱싱 및 쿼리할 수 있습니다. 이 방식은 별도의 순수 벡터 데이터베이스에 데이터를 복제하는 데 드는 추가 비용을 제거합니다. 또한 이 아키텍처는 벡터 포함과 원본 데이터를 함께 유지하므로 다중 모드 데이터 작업을 더 쉽게 수행하고 데이터 일관성, 규모 및 성능을 향상시킬 수 있습니다.

벡터 인덱싱 및 검색 기능 사용

NoSQL용 Azure Cosmos DB에서 벡터 인덱싱 및 검색을 수행하려면 Azure Cosmos DB의 기능 페이지에서 사용하도록 설정해야 합니다. 등록하려면 아래 단계를 따릅니다.

  1. Azure Cosmos DB for NoSQL 리소스 페이지로 이동합니다.
  2. "설정" 메뉴 항목 아래에서 "기능" 창을 선택합니다.
  3. "NoSQL용 Azure Cosmos DB의 벡터 검색" 기능을 선택합니다.
  4. 기능에 대한 설명을 읽어 사용하도록 설정할지 확인합니다.
  5. "사용"을 선택하여 벡터 인덱싱 및 검색 기능을 켭니다.

참고 항목

등록 요청은 자동 승인됩니다. 그러나 계정에서 완전히 활성화하는 데 15분이 걸릴 수 있습니다.

또는 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

참고 항목

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

주의할 사항:

  • flatquantizedFlat 인덱스 형식은 Azure 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"
        }
    ]
}

Important

삽입 성능을 최적화하기 위해 인덱싱 정책의 "excludedPaths" 섹션에 벡터 패스가 추가되었습니다. "excludedPaths"에 벡터 패스를 추가하지 않으면 RU 요금이 높아지고 벡터 삽입 대기 시간이 길어집니다.

Important

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

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

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

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

Important

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

현재 제한 사항

NoSQL용 Azure Cosmos DB의 벡터 인덱싱 및 검색에는 몇 가지 제한 사항이 있습니다.

  • quantizedFlatdiskANN 인덱스를 사용하려면 1,000개 이상의 벡터를 인덱싱하여 정량화가 정확한지 확인해야 합니다. 1,000개 미만의 벡터가 인덱싱되는 경우 전체 검사가 대신 사용되며 RU 요금이 더 높을 수 있습니다.
  • flat 인덱스 형식으로 인덱스가 생성된 벡터는 최대 505차원일 수 있습니다. quantizedFlat 또는 DiskANN 인덱스 형식으로 인덱스가 생성된 벡터는 최대 4,096차원일 수 있습니다.
  • 인덱스는 quantizedFlat DiskANN과 동일한 양자화 메서드를 사용합니다.
  • 벡터 삽입 속도는 제한되어야 합니다. 매우 큰 수집(5M 벡터를 초과)에는 추가 인덱스 빌드 시간이 필요할 수 있습니다.
  • 공유 처리량 데이터베이스는 지원되지 않습니다.
  • 현재 분석 저장소(및 Synapse Link) 및 공유 처리량이 있는 계정에서는 벡터 인덱싱 및 검색이 지원되지 않습니다.
  • 컨테이너에서 벡터 인덱싱 및 검색을 사용하도록 설정하면 사용하지 않도록 설정할 수 없습니다.

다음 단계