Aracılığıyla paylaş


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

UYGULANANLAR: NoSQL

NoSQL için Azure Cosmos DB'de vektör araması şu anda bir önizleme özelliğidir. Kullanmadan önce önizlemeye kaydolmanız gerekir. Bu makale aşağıdaki adımları kapsar:

  1. NoSQL için Azure Cosmos DB'de Vektör Arama önizlemesine kaydolma
  2. Vektör araması için Azure Cosmos DB kapsayıcısını ayarlama
  3. Yazma vektör ekleme ilkesi
  4. Kapsayıcı dizin oluşturma ilkesine vektör dizinleri ekleme
  5. Vektör dizinleri ve vektör ekleme ilkesi ile kapsayıcı oluşturma
  6. Depolanan veriler üzerinde vektör araması gerçekleştirme.
  7. Bu kılavuz, vektör verileri oluşturma, verileri dizine ekleme ve ardından kapsayıcıdaki verileri sorgulama işleminde yol gösterir.

Önkoşullar

Önizlemeye kaydolma

NoSQL için Azure Cosmos DB için vektör araması için önizleme özelliği kaydı gerekir. Kaydolmak için aşağıdaki adımları izleyin:

  1. NoSQL için Azure Cosmos DB kaynak sayfanıza gidin.

  2. "Ayarlar" menü öğesinin altındaki "Özellikler" bölmesini seçin.

  3. "NoSQL için Azure Cosmos DB'de Vektör Arama" seçeneğini belirleyin.

  4. Önizlemeye kaydolmak istediğinizi onaylamak için özelliğin açıklamasını okuyun.

  5. Önizlemeye kaydolmak için "Etkinleştir" seçeneğini belirleyin.

Not

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

Aşağıdaki adımlarda Cosmos DB NoSQL hesabı ayarlamayı ve veritabanı oluşturmayı bildiğiniz varsayılır. Vektör arama özelliği şu anda mevcut kapsayıcılarda desteklenmediğinden yeni bir kapsayıcı oluşturmanız ve kapsayıcı oluşturma sırasında kapsayıcı düzeyinde vektör ekleme ilkesini ve vektör dizin oluşturma ilkesini belirtmeniz gerekir.

Şimdi İnternet tabanlı bir kitapçı için veritabanı oluşturma ve her kitap için Başlık, Yazar, ISBN ve Açıklama depoladığınız bir örnek alalım. Ayrıca vektör eklemeleri içerecek iki özellik tanımlayacağız. Birincisi, kitabın metin içeriğinden oluşturulan metin eklemelerini içeren "contentVector" özelliğidir (örneğin, ekleme oluşturmadan önce "title" "author" "isbn" ve "description" özelliklerini birleştirmek). İkincisi ise kitabın kapağındaki görüntülerden oluşturulan "coverImageVector"dır.

  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ümlerinde kapsayıcımızda depolanan öğeler için aşağıdaki yapıyı göz önünde bulunduracağız:

{
"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.

Ardından bir kapsayıcı vektör ilkesi tanımlamanız gerekir. Bu ilke, Azure Cosmos DB sorgu altyapısını VectorDistance sistem işlevlerindeki vektör özelliklerinin nasıl işleneceğini bildirmek için kullanılan bilgileri sağlar. Bu ayrıca, bir tane belirtmeyi seçerseniz vektör dizin oluşturma ilkesine gerekli bilgileri bildirir. Aşağıdaki bilgiler, kapsanan vektör ilkesine dahildir:

  • "path": Vektörleri içeren özellik yolu
  • "datatype": Vektör öğelerinin türü (varsayılan Float32)
  • "boyutlar": Yoldaki her vektörünün uzunluğu (varsayılan olarak 1536)
  • "distanceFunction": Uzaklığı/benzerliği hesaplamak için kullanılan ölçüm (varsayılan Kosinüs)

Kitap ayrıntıları içeren örneğimizde vektör ilkesi örnek JSON gibi görünebilir:

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 verildikten sonra, vektör dizinlerinin dizin oluşturma ilkesine eklenmesi gerekir. Bu örnekte dizin oluşturma ilkesi şuna benzer olacaktır:

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

Önemli

Şu anda NoSQL için Azure Cosmos DB'de vektör araması yalnızca yeni kapsayıcılarda desteklenmektedir. Kapsayıcı oluşturma sırasında hem kapsayıcı vektör ilkesini hem de herhangi bir vektör dizin oluşturma ilkesini ayarlamanız gerekir çünkü daha sonra değiştirilemez. Her iki ilke de önizleme özelliğinde gelecekte yapılacak bir geliştirmeyle değiştirilebilir.

Vektör ilkesiyle kapsayıcı oluşturma

Şu anda NoSQL için Azure Cosmos DB'nin vektör arama özelliği yalnızca yeni kapsayıcılarda desteklendiğinden, kapsayıcı oluşturma sırasında vektör ilkesini uygulamanız gerekir ve daha sonra değiştirilemez.

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ırılıyor

İstenen vektör ilkesine sahip bir kapsayıcı oluşturduktan ve kapsayıcıya vektör verileri ekledikten sonra, sorgudaki Vektör Uzaklığı sistem işlevini kullanarak vektör araması yapabilirsiniz. Açıklamaya bakarak yemek tarifleriyle ilgili kitaplar aramak istediğinizi varsayalım. Öncelikle sorgu metninizin eklemelerini almanız gerekir. Bu durumda, sorgu metni için eklemeler oluşturmak isteyebilirsiniz: "yemek tarifi". Arama sorgunuz için ekleme işlemini yaptıktan sonra, bunu vektör arama sorgusundaki VectorDistance işlevinde kullanabilir ve burada gösterildiği gibi sorgunuza benzer tüm öğeleri alabilirsiniz:

SELECT 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))