Java'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. Kullanımdan önce önizlemeye kaydolmanız gerekir. Bu makale aşağıdaki adımları kapsar:
- NoSQL için Azure Cosmos DB'de Vektör Arama önizlemesine kaydolma
- Vektör araması için Azure Cosmos DB kapsayıcısını ayarlama
- Yazma vektör ekleme ilkesi
- Kapsayıcı dizin oluşturma ilkesine vektör dizinleri ekleme
- Vektör dizinleri ve vektör ekleme ilkesi ile kapsayıcı oluşturma
- Depolanan veriler üzerinde vektör araması gerçekleştirme.
- 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
- Mevcut bir NoSQL için Azure Cosmos DB hesabı.
- Azure aboneliğiniz yoksa NoSQL için Azure Cosmos DB'yi ücretsiz deneyin.
- Mevcut bir Azure aboneliğiniz varsa Yeni bir NoSQL için Azure Cosmos DB hesabı oluşturun.
- Azure Cosmos DB Java SDK'sının en son sürümü.
Ö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:
NoSQL için Azure Cosmos DB kaynak sayfanıza gidin.
"Ayarlar" menü öğesinin altındaki "Özellikler" bölmesini seçin.
"NoSQL için Azure Cosmos DB'de Vektör Arama" seçeneğini belirleyin.
Önizlemeye kaydolmak istediğinizi onaylamak için özelliğin açıklamasını okuyun.
Ö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.
Vektör aramasında yer alan adımları anlama
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 eklemelerini içerecek iki özellik de tanımladık. 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.
- Vektör araması yapmak istediğiniz alanlar için vektör eklemeleri oluşturun ve depolayın.
- Vektör ekleme ilkesinde vektör ekleme yollarını belirtin.
- 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]
}
İlk olarak nesnesini oluşturun CosmosContainerProperties
.
CosmosContainerProperties collectionDefinition = new CosmosContainerProperties(UUID.randomUUID().toString(), "Partition_Key_Def");
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:
// 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);
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. Ş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. Bu örnekte dizin oluşturma ilkesi aşağıdakine benzer olacaktır:
IndexingPolicy indexingPolicy = new IndexingPolicy();
indexingPolicy.setIndexingMode(IndexingMode.CONSISTENT);
ExcludedPath excludedPath = new ExcludedPath("/*");
indexingPolicy.setExcludedPaths(Collections.singletonList(excludedPath));
IncludedPath includedPath1 = new IncludedPath("/name/?");
IncludedPath includedPath2 = new IncludedPath("/description/?");
indexingPolicy.setIncludedPaths(ImmutableList.of(includedPath1, includedPath2));
// 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);
Son olarak kapsayıcıyı kapsayıcı dizin ilkesi ve vektör dizin ilkesiyle oluşturun.
database.createContainer(collectionDefinition).block();
Ö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 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. Java'da bir örnek aşağıda verilmişti:
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()));
}
Sonraki adımlar
- VectorDistance sistem işlevi
- Vektör dizin oluşturma
- Vektör araması için NoSQL için Azure Cosmos DB kurulumu.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin