다음을 통해 공유


Azure Cosmos DB for MongoDB vCore의 벡터 저장소

Azure Cosmos DB for MongoDB(vCore)의 통합 벡터 데이터베이스를 사용하여 AI 기반 애플리케이션을 Azure Cosmos DB에 저장된 데이터와 원활하게 연결합니다. 이 통합에는 Azure OpenAI 포함을 사용하여 빌드한 앱이 포함될 수 있습니다. 고유하게 통합된 벡터 데이터베이스를 사용하면 벡터 데이터가 만들어진 원래 데이터와 함께 Azure Cosmos DB for MongoDB(vCore)에 직접 저장된 고차원 벡터 데이터를 효율적으로 저장, 인덱싱 및 쿼리할 수 있습니다. 이를 통해 데이터를 대체 벡터 저장소로 전송할 필요가 없으며 추가 비용이 발생합니다.

벡터 저장소란?

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

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

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

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

Azure Cosmos DB for MongoDB(vCore)는 강력한 벡터 검색 기능을 제공하므로 복잡한 데이터 세트 간에 고속 유사성 검색을 수행할 수 있습니다. Azure Cosmos DB for MongoDB에서 벡터 검색을 수행하려면 먼저 벡터 인덱스를 만들어야 합니다. Cosmos DB는 현재 세 가지 유형의 벡터 인덱스를 지원합니다.

  • DiskANN(권장): 대규모 데이터 세트에 적합하며, 효율적인 메모리 사용을 위해 SSD를 활용하는 동시에 근사한 가장 인접한(ANN) 검색에서 높은 회수율을 유지합니다.
  • HNSW: 정확도와 리소스 효율성의 균형을 맞추는 그래프 기반 구조로 높은 회수가 필요한 보통 크기의 데이터 세트에 적합합니다.
  • IVF: 클러스터링을 사용하여 광범위한 데이터 세트의 검색 속도를 최적화하고 대상 클러스터 내에서 검색을 집중하여 성능을 가속화합니다.

DiskANN 인덱스는 M40 계층 이상에서 사용할 수 있습니다. DiskANN 인덱을 만들려면 매개 변수를 "kind" 아래 템플릿을 따르도록 "vector-diskann" 설정합니다.

{ 
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": { 
                "kind": "vector-diskann", 
                "dimensions": <integer_value>,
                "similarity": <string_value>,
                "maxDegree" : <integer_value>, 
                "lBuild" : <integer_value>, 
            } 
        } 
    ] 
}
필드 형식 설명
index_name string 인덱스의 고유 이름입니다.
path_to_property string 벡터가 포함된 속성의 경로입니다. 이 경로는 최상위 속성이거나 속성에 대한 점 표기법 경로일 수 있습니다. 벡터는 인 number[] 덱싱되고 벡터 검색 결과에 사용되어야 합니다. double[]과 같은 다른 유형을 사용하면 문서가 인덱싱되지 않습니다. 인덱싱되지 않은 문서는 벡터 검색 결과에서 반환되지 않습니다.
kind string 만들 벡터 인덱스의 형식입니다. 가능한 옵션은 vector-ivf, vector-hnsw, vector-diskann입니다.
dimensions 정수 벡터 유사성의 차원 수입니다. DiskANN은 최대 2,000개의 차원을 지원하며, 향후 지원은 40,000개 이상에 대해 계획되어 있습니다.
similarity string 인덱스와 함께 사용할 유사성 메트릭입니다. 가능한 옵션은 COS(코사인 거리), L2(유클리드 거리) 및 IP(내적)입니다.
maxDegree 정수 그래프의 노드당 최대 가장자리 수입니다. 이 매개 변수의 범위는 20에서 2048까지입니다(기본값은 32). 높은 maxDegree 차원 및/또는 높은 정확도 요구 사항이 있는 데이터 세트에 적합합니다.
lBuild 정수 DiskANN 인덱스를 생성할 때 평가되는 후보 인접 항목의 수를 설정합니다. 10에서 500(기본값: 50)까지의 이 매개 변수는 정확도와 계산 오버헤드의 균형을 조정합니다. 값이 높을수록 인덱스 품질과 정확도가 향상되지만 빌드 시간이 늘어납니다.

DiskANN을 사용하여 벡터 검색 수행

벡터 검색을 수행하려면 집계 파이프라인 단계를 사용하고 $search 연산자와 쿼리합니다 cosmosSearch . DiskANN은 지리 공간적 또는 텍스트 기반 필터와 같은 선택적 필터링을 사용하여 대규모 데이터 세트 전반에서 고성능 검색을 허용합니다.

{
  "$search": {
    "cosmosSearch": {
      "path": "<path_to_property>",
      "query": "<query_vector>",  
      "k": <num_results_to_return>,  
      "filter": {"$and": [
        { "<attribute_1>": { "$eq": <value> } },
        {"<location_attribute>": {"$geoWithin": {"$centerSphere":[[<longitude_integer_value>, <latitude_integer_value>], <radius>]}}}
      ]}
    }
  }
},
필드 형식 설명
lSearch 정수 검색할 동적 후보 목록의 크기를 지정합니다. 기본값은 40구성 가능한 범위에서 10 1000. 값을 늘리면 회수가 향상되지만 검색 속도가 감소할 수 있습니다.
k 정수 반환할 검색 결과 수를 정의합니다. 값은 k 0보다 작거나 같 lSearch아야 합니다.

새 클러스터에서 DiskANN 사용

새로 프로비전된 Azure Cosmos DB for MongoDB(vCore) 클러스터에서 DiskANN Vector Index를 사용하도록 설정하려면 다음 단계에 따라 Azure CLI를 통해 클러스터 수준 등록을 수행합니다.

  1. Azure CLI에 로그인
az login
  1. 클러스터의 기능 플래그에 대한 현재 설정을 검색합니다. 이렇게 하면 새 기능을 추가하는 동안 기존 플래그를 유지할 수 있습니다.
az resource show --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version>
  1. DiskANNIndex 기존 기능을 제거하지 않고 미리 보기 기능 목록에 플래그를 추가합니다.
az resource patch --ids "/subscriptions/<sub id>/resourceGroups/<resource group name>/providers/Microsoft.DocumentDB/mongoClusters/<resource name of your Cosmos DB for MongoDB cluster>" --api-version <cluster's api version> --properties "{\"previewFeatures\": [\"GeoReplicas\", \"DiskANNIndex\"]}" 

필터링과 함께 DiskANN 인덱스 사용 예제

데이터베이스에 벡터 추가

지리 공간 필터와 함께 벡터 검색을 사용하려면 벡터 포함 및 위치 좌표가 모두 포함된 문서를 추가합니다. 고유한 모델, Azure OpenAI Embeddings 또는 다른 API(예: Azure의 Hugging Face)를 사용하여 포함을 만들 수 있습니다.

from pymongo import MongoClient

client = MongoClient("<your_connection_string>")
db = client["test"]
collection = db["testCollection"]

documents = [
    {"name": "Eugenia Lopez", "bio": "CEO of AdventureWorks", "is_open": 1, "location": [-118.9865, 34.0145], "contentVector": [0.52, 0.20, 0.23]},
    {"name": "Cameron Baker", "bio": "CFO of AdventureWorks", "is_open": 1, "location": [-0.1278, 51.5074], "contentVector": [0.55, 0.89, 0.44]},
    {"name": "Jessie Irwin", "bio": "Director of Our Planet initiative", "is_open": 0, "location": [-118.9865, 33.9855], "contentVector": [0.13, 0.92, 0.85]},
    {"name": "Rory Nguyen", "bio": "President of Our Planet initiative", "is_open": 1, "location": [-119.0000, 33.9855], "contentVector": [0.91, 0.76, 0.83]}
]

collection.insert_many(documents)

DiskANN 벡터 인덱스 만들기

다음 예제에서는 필터링 기능을 사용하여 DiskANN 벡터 인덱스를 설정하는 방법을 보여 줍니다. 여기에는 유사성 검색을 위한 벡터 인덱스 만들기, 벡터 및 지리 공간적 속성이 있는 문서 추가, 추가 필터링을 위한 인덱싱 필드가 포함됩니다.

db.command({
    "createIndexes": "testCollection",
    "indexes": [
        {
            "name": "DiskANNVectorIndex",
            "key": {
                "contentVector": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "dimensions": 3,
                "similarity": "COS",
                "maxDegree": 32,
                "lBuild": 64
            }
        },
        { 
            "name": "is_open",
            "key": { 
                "is_open": 1 
            }      
        },
        {
            "name": "locationIndex",
            "key": {
                "location": 1
            }
        }
    ]
})

이 명령은 유사성 검색을 사용하도록 설정하여 필드에 exampleCollectionDiskANN 벡터 인덱스(DiskANN 벡터 인덱 contentVector 스)를 만듭니다. 또한 다음을 추가합니다.

  • 비즈니스가 열려 있는지 여부에 따라 결과를 필터링할 수 있는 필드의 인덱 is_open 스입니다.
  • 지리적 근접성을 기준으로 필터링할 필드의 location 지리 공간적 인덱스입니다.

특정 지리적 반경 내에서 유사한 벡터가 있는 문서를 찾으려면 유사성 검색을 queryVector 지정하고 지리 공간 필터를 포함합니다.

query_vector = [0.52, 0.28, 0.12]
pipeline = [
    {
        "$search": {
            "cosmosSearch": {
                "path": "contentVector",
                "vector": query_vector,
                "k": 5,
                "filter": {
                    "$and": [
                        {"is_open": {"$eq": 1}},
                        {"location": {"$geoWithin": {"$centerSphere": [[-119.7192861804, 34.4102485028], 100 / 3963.2]}}}
                    ]
                }
            }
        }
    }
]

results = list(collection.aggregate(pipeline))
for result in results:
    print(result)

이 예제에서 벡터 유사성 검색은 지정된 COS 유사성 메트릭을 기반으로 가장 가까운 상위 k 벡터를 반환하는 반면, 100마일 반경 내에 열려 있는 비즈니스만 포함하도록 결과를 필터링합니다.

[
  {
    similarityScore: 0.9745354109084544,
    document: {
      _id: ObjectId("645acb54413be5502badff94"),
      name: 'Eugenia Lopez',
      bio: 'CEO of AdventureWorks',
      is_open: 1,
      location: [-118.9865, 34.0145],
      contentVector: [0.52, 0.20, 0.23]
    }
  },
  {
    similarityScore: 0.9006955671333992,
    document: {
      _id: ObjectId("645acb54413be5502badff97"),
      name: 'Rory Nguyen',
      bio: 'President of Our Planet initiative',
      is_open: 1,
      location: [-119.7302, 34.4005],
      contentVector: [0.91, 0.76, 0.83]
    }
  }
]

이 결과는 100마일 반경 및 개방형 비즈니스로 제한되는 상위 유사한 문서를 queryVector보여줍니다. 각 결과에는 유사성 점수와 메타데이터가 포함되며, Cosmos DB for MongoDB의 DiskANN이 보강된 위치 구분 검색 환경에 대한 결합된 벡터 및 지리 공간적 쿼리를 지원하는 방법을 보여 줍니다.

벡터 인덱스 정의 가져오기

컬렉션에서 벡터 인덱스 정의를 검색하려면 listIndexes 명령을 사용합니다.

db.exampleCollection.getIndexes();

이 예에서는 인덱스를 만드는 데 사용된 모든 cosmosSearch 매개 변수와 함께 vectorIndex가 반환됩니다.

[
  { v: 2, key: { _id: 1 }, name: '_id_', ns: 'test.exampleCollection' },
  {
    v: 2,
    key: { vectorContent: 'cosmosSearch' },
    name: 'vectorSearchIndex',
    cosmosSearch: {
      kind: <index_type>, // options are `vector-ivf`, `vector-hnsw`, and `vector-diskann`
      numLists: 3,
      similarity: 'COS',
      dimensions: 3
    },
    ns: 'test.exampleCollection'
  }
]

필터링된 벡터 검색(미리 보기)

이제 $lt, $lte, $eq, $neq, $gte, $gt, $in, $nin$regex 같은 지원되는 쿼리 필터를 사용하여 벡터 검색을 실행할 수 있습니다. Azure 구독의 "미리 보기 기능" 탭에서 "필터링 벡터 검색" 기능을 사용하도록 설정합니다. 여기에서 미리 보기 기능에 대해 자세히 알아보세요.

먼저 벡터 인덱스 외에도 필터에 대한 인덱스도 정의해야 합니다. 예를 들어 속성에 필터 인덱스를 정의할 수 있습니다.

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

다음으로, 아래와 같이 "filter" 용어를 벡터 검색에 추가할 수 있습니다. 이 예제에서 필터는 "title" 속성이 ["not in this text", "or this text"] 목록에 없는 문서를 찾습니다.


db.exampleCollection.aggregate([
  {
      '$search': {
          "cosmosSearch": {
              "vector": "<query_vector>",
              "path": <path_to_vector>,
              "k": num_results,
              "filter": {<property_to_filter>: {"$nin": ["not in this text", "or this text"]}}
          },
          "returnStoredSource": True }},
      {'$project': { 'similarityScore': { '$meta': 'searchScore' }, 'document' : '$$ROOT' }
}
]);

Important

미리 보기 상태로 제공되는 동안, 필터링된 벡터 검색을 수행하려면 벡터 인덱스 매개 변수를 조정하여 정확도를 더 높여야 할 수 있습니다. 예를 들어 HNSW를 사용할 때 m, efConstruction 또는 efSearch를 늘리거나 IVF를 사용할 때 numLists 또는 nProbes를 늘리면 더 나은 결과를 얻을 수 있습니다. 사용하기 전에 구성을 테스트하여 결과가 만족스러운지 확인해야 합니다.

LLM 오케스트레이션 도구 사용

의미 체계 커널과 함께 벡터 데이터베이스로 사용

의미 체계 커널을 사용하여 Azure Cosmos DB for MongoDB vCore 및 LLM에서 정보 검색을 오케스트레이션합니다. 여기서 자세히 알아봅니다.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

LangChain과 함께 벡터 데이터베이스로 사용

LangChain을 사용하여 Azure Cosmos DB for MongoDB vCore 및 LLM에서 정보 검색을 오케스트레이션합니다. 여기서 자세히 알아봅니다.

LangChain에서 의미 체계 캐시로 사용

LangChain 및 Azure Cosmos DB for MongoDB(vCore)를 사용하여 이전에 기록된 LLM 응답을 사용하여 의미 체계 캐싱을 오케스트레이션하여 LLM API 비용을 절감하고 응답 대기 시간을 줄일 수 있습니다. 여기에서 자세히 알아보세요.

기능 및 제한 사항

  • 지원되는 거리 측정법: L2(유클리드), 내적 및 코사인.
  • 지원되는 인덱싱 방법: IVFFLAT, HNSW 및 DiskANN(미리 보기)
  • 크기가 최대 2,000차원인 벡터를 인덱싱합니다.
  • 인덱싱은 경로당 하나의 벡터에만 적용됩니다.
  • 벡터 패스당 하나의 인덱스만 만들 수 있습니다.

요약

이 가이드에서는 벡터 인덱스를 만들고, 벡터 데이터가 있는 문서를 추가하고, 유사성 검색을 수행하고, 인덱스 정의를 검색하는 방법을 보여 줍니다. 통합 벡터 데이터베이스를 사용하면 Azure Cosmos DB for MongoDB vCore에서 직접 고차원 벡터 데이터를 효율적으로 저장, 인덱싱 및 쿼리할 수 있습니다. 또한 벡터 포함을 통해 데이터의 잠재력을 최대한 활용할 수 있으며 더욱 정확하고 효율적이며 강력한 애플리케이션을 빌드할 수 있습니다.

다음 단계