Python'da NoSQL için Azure Cosmos DB'de dizin ve sorgu vektörleri

Bu makalede vektör verileri oluşturma, verilerin dizinini oluşturma ve ardından kapsayıcıdaki verileri sorgulama açıklanmaktadır.

Vektör dizin oluşturma ve arama özelliğini kullanmadan önce NoSQL için Azure Cosmos DB'de vektör aramasını etkinleştirmeniz gerekir. Azure Cosmos DB kapsayıcısını vektör araması için ayarladıktan sonra bir vektör ekleme ilkesi oluşturursunuz. Ardından, kapsayıcı dizin oluşturma ilkesine vektör dizinleri eklersiniz. Ardından vektör dizinleri ve vektör ekleme ilkesi içeren bir kapsayıcı oluşturursunuz. Son olarak, depolanan veriler üzerinde vektör araması yaparsınız.

Prerequisites

Özelliği etkinleştirme

NoSQL için Azure Cosmos DB'de vektör aramasını etkinleştirmek için şu adımları izleyin:

  1. NoSQL için Azure Cosmos DB kaynak sayfanıza gidin.
  2. Sol bölmedeki Ayarlar'ın altında Özellikler'i seçin.
  3. Vektör Arama için NoSQL API'yi seçin.
  4. Özelliği etkinleştirmek istediğinizi onaylamak için özelliğin açıklamasını okuyun.
  5. NoSQL için Azure Cosmos DB'de vektör aramasını açmak için Etkinleştir'i seçin.

Tip

Alternatif olarak, Hesabınızın özelliklerini NoSQL için Azure Cosmos DB vektör aramasını destekleyecek şekilde güncelleştirmek için Azure CLI'yi kullanın.

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

Kayıt isteği otomatik olarak onaylanır, ancak geçerlilik kazanması 15 dakika sürebilir.

Aşağıdaki adımlarda , NoSQL için Azure Cosmos DB hesabı ayarlamayı ve veritabanı oluşturmayı bildiğiniz varsayılır. Vektör arama özelliği şu anda mevcut kapsayıcılarda desteklenmiyor. Yeni bir kapsayıcı oluşturmanız gerekir. Kapsayıcıyı oluşturduğunuzda, kapsayıcı düzeyinde vektör ekleme ilkesini ve vektör dizin oluşturma ilkesini belirtirsiniz.

Şimdi İnternet tabanlı bir kitapçı için veritabanı oluşturma örneği ele alalım. Her kitap için başlık, yazar, ISBN ve açıklama bilgilerini depolamak istiyorsunuz. Vektör eklemelerini içerecek şekilde aşağıdaki iki özelliği de tanımlamanız gerekir:

  • özelliği, contentVector kitabın metin içeriğinden oluşturulan metin eklemelerini içerir. Örneğin, ekleme oluşturmadan önce title, author, isbn ve description özelliklerini birleştirirsiniz.
  • Özellik coverImageVector , kitabın kapağındaki görüntülerden oluşturulur.

Vektör araması yapmak için şunları yaparsınız:

  1. Vektör araması yapmak istediğiniz alanlar için vektör eklemeleri oluşturun ve depolayın.
  2. Vektör ekleme ilkesinde vektör ekleme yollarını belirtin.
  3. Kapsayıcı için dizin oluşturma ilkesine istediğiniz vektör dizinlerini ekleyin.

Bu makalenin sonraki bölümleri için kapsayıcınızda depolanan öğeler için aşağıdaki yapıyı göz önünde bulundurun:

{
  "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] 
}

Kapsayıcınız için vektör ekleme ilkesi oluşturma

Şimdi bir kapsayıcı vektör ilkesi tanımlamanız gerekir. Bu ilke, Azure Cosmos DB sorgu altyapısını sistem işlevlerindeki VectorDistance vektör özelliklerinin nasıl işleneceğini bildirmek için kullanılan bilgileri sağlar. Bu ilke, bir tane belirtmeyi seçerseniz vektör dizin oluşturma ilkesine de gerekli bilgileri sağlar.

Kapsayıcı vektör ilkesine aşağıdaki bilgiler dahildir:

Parametre Description
path Vektörleri içeren özellik yolu.
datatype Vektör öğelerinin türü. Varsayılan değer: Float32.
dimensions Yoldaki her vektörün uzunluğu. Varsayılan değer: 1536.
distanceFunction Uzaklığı/benzerliği hesaplamak için kullanılan ölçüm. Varsayılan değer: Cosine.

Kitap ayrıntıları içeren örnekte vektör ilkesi aşağıdaki örneğe benzer olabilir:

vector_embedding_policy = { 
    "vectorEmbeddings": [ 
        { 
            "path": "/coverImageVector", 
            "dataType": "float32", 
            "distanceFunction": "dotproduct", 
            "dimensions": 8 
        }, 
        { 
            "path": "/contentVector", 
            "dataType": "float32", 
            "distanceFunction": "cosine", 
            "dimensions": 10 
        } 
    ]    
} 

Dizin oluşturma ilkesinde vektör dizini oluşturma

Vektör ekleme yollarına karar verdikten sonra dizin oluşturma ilkesine vektör dizinleri eklemeniz gerekir. Dizin oluşturma ilkesi aşağıdaki örneğe benzer:

indexing_policy = { 
    "includedPaths": [ 
        { 
            "path": "/*" 
        } 
    ], 
    "excludedPaths": [ 
        {"path": "/\"_etag\"/?"},
        {"path": "/coverImageVector/*"},
        {"path": "/contentVector/*"}
    ], 
    "vectorIndexes": [ 
        {"path": "/coverImageVector", 
         "type": "quantizedFlat" 
        }, 
        {"path": "/contentVector", 
         "type": "quantizedFlat" 
        } 
    ] 
} 

Important

Vektör yolu, ekleme için iyileştirilmiş performans sağlamak amacıyla dizin oluşturma ilkesinin excludedPaths bölümüne eklenir. Vektör yolunun excludedPaths eklenmemesi, istek birimi ücretinin artmasına ve vektör eklemeleri için gecikme yaşanmasına neden olur.

Şu anda NoSQL için Azure Cosmos DB'de vektör araması yalnızca yeni kapsayıcılarda desteklenmektedir. Kapsayıcıyı oluştururken hem kapsayıcı vektör ilkesini hem de herhangi bir vektör dizin oluşturma ilkesini ayarlamanız gerekir çünkü daha sonra değiştiremezsiniz.

Vektör politikasıyla kapsayıcı oluşturma

Şu anda NoSQL için Azure Cosmos DB vektör arama özelliği yalnızca yeni kapsayıcılarda desteklenmektedir. Kapsayıcıyı oluşturduğunuzda vektör ilkesini uygularsınız. İlkeyi daha sonra değiştiremezsiniz.

try:     
    container = db.create_container_if_not_exists( 
                    id=CONTAINER_NAME, 
                    partition_key=PartitionKey(path='/id'), 
                    indexing_policy=indexing_policy, 
                    vector_embedding_policy=vector_embedding_policy) 
    print('Container with id \'{0}\' created'.format(id)) 

except exceptions.CosmosHttpResponseError: 
        raise 

Vektör benzerliği arama sorgusu çalıştırma

İstediğiniz vektör ilkesine sahip bir kapsayıcı oluşturduktan ve kapsayıcıya vektör verileri ekledikten sonra, vektör araması yapmak için sorgudaki VectorDistance sistem işlevini kullanın.

Açıklamaya bakarak yemek tarifleriyle ilgili kitaplar aramak istediğinizi varsayalım. Öncelikle sorgu metninizin embedding'lerini almanız gerekir. Bu durumda, sorgu metni food recipeiçin eklemeler oluşturmak isteyebilirsiniz. Arama sorgunuz için ekleme işlemini yaptıktan sonra, sorgunuza benzer tüm öğeleri almak için bunu vektör arama sorgusundaki işlevde kullanabilirsiniz 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])   

Bu sorgu, kitap başlıklarını ve sorgunuzla ilgili benzerlik puanlarını alır. Python'da bir örnek aşağıda verilmişti:

query_embedding = [1,2,3,4,5,6,7,8,9,10] 
# Query for items 
for item in container.query_items( 
            query='SELECT c.title, VectorDistance(c.contentVector,@embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.contentVector,@embedding)', 
            parameters=[ 
                {"name": "@embedding", "value": query_embedding} 
            ], 
            enable_cross_partition_query=True): 
    print(json.dumps(item, indent=True))