다음을 통해 공유


Java의 Azure Cosmos DB for NoSQL의 인덱스 및 쿼리 벡터

적용 대상: NoSQL

Azure Cosmos DB for NoSQL의 벡터 검색은 현재 미리 보기 기능입니다. 사용하기 전에 미리 보기에 등록해야 합니다. 이 문서에서는 다음 단계를 다룹니다.

  1. Azure Cosmos DB for NoSQL의 벡터 검색 미리 보기에 등록
  2. 벡터 검색을 위한 Azure Cosmos DB 컨테이너 설정
  3. 벡터 임베딩 정책 작성
  4. 컨테이너 인덱싱 정책에 벡터 인덱스 추가
  5. 벡터 인덱스 정책과 벡터 임베딩 정책을 사용하여 컨테이너 만들기
  6. 저장된 데이터에 대해 벡터 검색을 수행합니다.
  7. 이 가이드에서는 벡터 데이터를 만들고, 데이터를 인덱싱하고, 컨테이너에서 데이터를 쿼리하는 과정을 안내합니다.

필수 조건

미리 보기 등록

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

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

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

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

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

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

참고 항목

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

다음 단계에서는 사용자가 Cosmos DB NoSQL 계정을 설정하고 데이터베이스를 만드는 방법을 알고 있다고 가정합니다. 현재 기존 컨테이너에서는 벡터 검색 기능이 지원되지 않으므로 새로운 컨테이너를 만들고 컨테이너 수준의 벡터 포함 정책과 컨테이너 만들 때 벡터 인덱싱 정책을 지정해야 합니다.

인터넷 기반 서점을 위한 데이터베이스를 만들고 각 책에 대한 제목, 작성자, ISBN 및 설명을 저장하는 예를 들어 보겠습니다. 또한 벡터 임베딩을 포함하는 두 가지 속성을 정의해 봅니다. 첫 번째 속성은 책의 텍스트 콘텐츠에서 만들어진 텍스트 임베딩을 포함하는 "contentVector"입니다(예: 임베딩을 만들기 전에 "title" "author" "isbn" 및 "description" 속성 연결). 두 번째 속성은 책 표지 이미지에서 생성된 "coverImageVector"입니다.

  1. 벡터 검색을 수행하려는 필드에 대한 벡터 임베딩을 만들고 저장합니다.
  2. 벡터 임베딩 정책에서 벡터 임베딩 경로를 지정합니다.
  3. 컨테이너의 인덱싱 정책에 원하는 벡터 인덱스를 포함합니다.

이 문서의 후속 섹션에서는 컨테이너에 저장된 항목에 대한 아래 구조를 고려합니다.

{
"title": "book-title", 
"author": "book-author", 
"isbn": "book-isbn", 
"description": "book-description", 
"contentVector": [2, -1, 4, 3, 5, -2, 5, -7, 3, 1], 
"coverImageVector": [0.33, -0.52, 0.45, -0.67, 0.89, -0.34, 0.86, -0.78] 
} 

먼저, CosmosContainerProperties 개체를 만듭니다.

CosmosContainerProperties collectionDefinition = new CosmosContainerProperties(UUID.randomUUID().toString(), "Partition_Key_Def");

컨테이너에 대한 벡터 포함 정책을 만듭니다.

다음으로 컨테이너 벡터 정책을 정의해야 합니다. 이 정책은 VectorDistance 시스템 함수에서 벡터 속성을 처리하는 방법을 Azure Cosmos DB 쿼리 엔진에 알리는 데 사용하는 정보를 제공합니다. 또한 사용자가 지정하려는 경우를 위해 벡터 인덱싱 정책에 필요한 정보를 알려 줍니다. 포함된 벡터 정책에는 다음 정보가 포함됩니다.

  • "path": 벡터가 포함된 속성 경로
  • "datatype": 벡터 요소의 형식(기본값 Float32)
  • "dimensions": 경로에 있는 각 벡터의 길이(기본값 1536)
  • "distanceFunction": 거리/유사성을 계산하는 데 사용되는 메트릭(기본값 코사인)

도서 세부 정보가 포함된 예의 경우 벡터 정책은 JSON 예와 유사할 수 있습니다.

// Creating vector embedding policy
CosmosVectorEmbeddingPolicy cosmosVectorEmbeddingPolicy = new CosmosVectorEmbeddingPolicy();

CosmosVectorEmbedding embedding1 = new CosmosVectorEmbedding();
embedding1.setPath("/coverImageVector");
embedding1.setDataType(CosmosVectorDataType.FLOAT32);
embedding1.setDimensions(8L);
embedding1.setDistanceFunction(CosmosVectorDistanceFunction.COSINE);

CosmosVectorEmbedding embedding2 = new CosmosVectorEmbedding();
embedding2.setPath("/contentVector");
embedding2.setDataType(CosmosVectorDataType.FLOAT32);
embedding2.setDimensions(10L);
embedding2.setDistanceFunction(CosmosVectorDistanceFunction.DOT_PRODUCT);

cosmosVectorEmbeddingPolicy.setCosmosVectorEmbeddings(Arrays.asList(embedding1, embedding2, embedding3));

collectionDefinition.setVectorEmbeddingPolicy(cosmosVectorEmbeddingPolicy);

인덱싱 정책에서 벡터 인덱스 만들기

벡터 임베딩 경로가 결정되면 벡터 인덱스를 인덱싱 정책에 추가해야 합니다. 현재 Azure Cosmos DB for NoSQL의 벡터 검색 기능은 새 컨테이너에서만 지원되므로 컨테이너 만들 때 벡터 정책을 적용해야 하며 나중에 수정할 수 없습니다. 이 예에서 인덱싱 정책은 다음과 같습니다.

IndexingPolicy indexingPolicy = new IndexingPolicy();
indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT);
ExcludedPath excludedPath1 = new ExcludedPath("/coverImageVector/*");
ExcludedPath excludedPath2 = new ExcludedPath("/contentVector/*");
indexingPolicy.setExcludedPaths(ImmutableList.of(excludedPath1, excludedPath2));

IncludedPath includedPath1 = new IncludedPath("/*");
indexingPolicy.setIncludedPaths(Collections.singletonList(includedPath1));

// Creating vector indexes
CosmosVectorIndexSpec cosmosVectorIndexSpec1 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec1.setPath("/coverImageVector");
cosmosVectorIndexSpec1.setType(CosmosVectorIndexType.QUANTIZED_FLAT.toString());

CosmosVectorIndexSpec cosmosVectorIndexSpec2 = new CosmosVectorIndexSpec();
cosmosVectorIndexSpec2.setPath("/contentVector");
cosmosVectorIndexSpec2.setType(CosmosVectorIndexType.DISK_ANN.toString());

indexingPolicy.setVectorIndexes(Arrays.asList(cosmosVectorIndexSpec1, cosmosVectorIndexSpec2, cosmosVectorIndexSpec3));

collectionDefinition.setIndexingPolicy(indexingPolicy);

마지막으로 컨테이너 인덱스 정책과 벡터 인덱스 정책을 사용하여 컨테이너를 만듭니다.

database.createContainer(collectionDefinition).block();

Important

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

Important

현재 Azure Cosmos DB for NoSQL의 벡터 검색은 새 컨테이너에서만 지원됩니다. 나중에 수정할 수 없으므로 컨테이너를 만들 때 컨테이너 벡터 정책과 벡터 인덱싱 정책을 모두 설정해야 합니다. 두 정책 모두 향후 미리 보기 기능을 개선할 때 수정할 수 있습니다.

벡터 유사성 검색 쿼리 실행

원하는 벡터 정책으로 컨테이너를 만들고 컨테이너에 벡터 데이터를 삽입한 후에는 쿼리에서 벡터 거리 시스템 함수를 사용하여 벡터 쿼리를 수행할 수 있습니다. 설명을 보고 음식 조리법에 관한 책을 검색한다고 가정하면 먼저 쿼리 텍스트에 대한 포함을 가져와야 합니다. 이 경우 쿼리 텍스트("음식 조리법")에 대한 임베딩을 생성할 수 있습니다. 검색 쿼리에 대한 임베딩이 있으면 벡터 검색 쿼리의 VectorDistance 함수에서 이를 사용하고 다음과 같이 쿼리와 유사한 모든 항목을 가져올 수 있습니다.

SELECT TOP 10 c.title, VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10]) AS SimilarityScore   
FROM c  
ORDER BY VectorDistance(c.contentVector, [1,2,3,4,5,6,7,8,9,10])   

이 쿼리는 사용자의 쿼리에 대한 유사성 점수와 함께 책 제목을 쿼리합니다. 다음은 Java의 예입니다.

float[] embedding = new float[10];
for (int i = 0; i < 10; i++) {
    array[i] = i + 1;
}
ArrayList<SqlParameter> paramList = new ArrayList<SqlParameter>();
  paramList.add(new SqlParameter("@embedding", embedding));
  SqlQuerySpec querySpec = new SqlQuerySpec("SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore  FROM c ORDER BY VectorDistance(c.contentVector,@embedding)", paramList);
  CosmosPagedIterable<Family> filteredFamilies = container.queryItems(querySpec, new CosmosQueryRequestOptions(), Family.class);

  if (filteredFamilies.iterator().hasNext()) {
      Family family = filteredFamilies.iterator().next();
      logger.info(String.format("First query result: Family with (/id, partition key) = (%s,%s)",family.getId(),family.getLastName()));
  }

다음 단계