MongoDB için Azure Cosmos DB sanal çekirdeğinde vektör deposu
Yapay zeka tabanlı uygulamalarınızı Azure Cosmos DB'de depolanan verilerinize sorunsuz bir şekilde bağlamak için MongoDB için Azure Cosmos DB'de Tümleşik Vektör Veritabanı'nı (sanal çekirdek) kullanın. Bu tümleştirme, Azure OpenAI eklemelerini kullanarak oluşturduğunuz uygulamaları içerebilir. Yerel olarak tümleştirilmiş vektör veritabanı, doğrudan MongoDB için Azure Cosmos DB'de (sanal çekirdek) depolanan yüksek boyutlu vektör verilerini ve vektör verilerinin oluşturulduğu özgün verileri verimli bir şekilde depolamanızı, dizinlemenizi ve sorgulamanızı sağlar. Verilerinizi alternatif vektör depolarına aktarma gereksinimini ortadan kaldırır ve ek maliyetler doğurabilir.
Vektör deposu nedir?
Vektör deposu veya vektör veritabanı , yüksek boyutlu bir alanda verilerin matematiksel temsilleri olan vektör eklemelerini depolamak ve yönetmek için tasarlanmış bir veritabanıdır. Bu alanda, her boyut verilerin bir özelliğine karşılık gelir ve gelişmiş verileri temsil etmek için on binlerce boyut kullanılabilir. Vektörlerin bu boşluktaki konumu, özelliklerini temsil eder. Sözcükler, tümcecikler veya belgelerin tamamı, görüntüler, ses ve diğer veri türlerinin tümü vektörleştirilebilir.
Vektör deposu nasıl çalışır?
Vektör deposunda, eklemeleri dizine almak ve sorgulamak için vektör arama algoritmaları kullanılır. Bazı iyi bilinen vektör arama algoritmaları Hiyerarşik Gezinilebilir Küçük Dünya (HNSW), Ters Dosya (IVF), DiskANN vb. içerir. Vektör arama, bir özellik alanında tam eşleşmeler yerine veri özelliklerine göre benzer öğeleri bulmanıza yardımcı olan bir yöntemdir. Bu teknik, benzer metin arama, ilgili görüntüleri bulma, önerilerde bulunma ve hatta anomalileri algılama gibi uygulamalarda kullanışlıdır. EklemeLER API'sini kullanarak makine öğrenmesi modeli kullanarak oluşturduğunuz verilerinizin vektör eklemelerini (sayı listeleri) sorgulamak için kullanılır. Ekleme API'lerine örnek olarak Azure OpenAI Eklemeleri veya Azure'da Yüz Tanımayı Kucaklama verilebilir. Vektör araması, veri vektörleri ile sorgu vektörünüzün arasındaki mesafeyi ölçer. Sorgu vektörünüzün en yakın veri vektörleri, en benzer olduğu saptanan vektörlerdir.
MongoDB için Azure Cosmos DB'deki Tümleşik Vektör Veritabanı'nda (sanal çekirdek), eklemeler özgün verilerin yanı sıra depolanabilir, dizine eklenebilir ve sorgulanabilir. Bu yaklaşım, verileri ayrı bir saf vektör veritabanında çoğaltmanın ek maliyetini ortadan kaldırır. Ayrıca bu mimari, vektör eklemeleri ve özgün verileri bir arada tutarak çok modalı veri işlemlerini daha iyi kolaylaştırır ve daha fazla veri tutarlılığı, ölçeklendirme ve performans sağlar.
Vektör Benzerliği Araması Gerçekleştirme
MongoDB için Azure Cosmos DB (sanal çekirdek), karmaşık veri kümelerinde yüksek hızlı benzerlik aramaları gerçekleştirmenize olanak sağlayan güçlü vektör arama özellikleri sağlar. MongoDB için Azure Cosmos DB'de vektör araması yapmak için önce bir vektör dizini oluşturmanız gerekir. Cosmos DB şu anda üç tür vektör dizinini destekler:
- DiskANN (Önerilen): En yakın komşu (ANN) aramalarında yüksek geri çağırmayı korurken verimli bellek kullanımı için SSD'lerden yararlanan büyük ölçekli veri kümeleri için idealdir.
- HNSW: Doğruluğu ve kaynak verimliliğini dengeleyen graf tabanlı bir yapıya sahip yüksek geri çağırma gerektiren orta ölçekli veri kümeleri için uygundur.
- IVF: Geniş veri kümelerinde arama hızını iyileştirmek için kümeleme kullanır ve hedeflenen kümelerdeki aramalara odaklanarak performansı hızlandırır.
DiskANN dizinleri M40 katmanlarında ve üzerinde kullanılabilir. DiskANN dizinini oluşturmak için parametresini "kind"
"vector-diskann"
aşağıdaki şablonu izleyerek ayarlayın:
{
"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>,
}
}
]
}
Alan | Tür | Veri Akışı Açıklaması |
---|---|---|
index_name |
Dize | Dizinin benzersiz adı. |
path_to_property |
Dize | Vektörünü içeren özelliğin yolu. Bu yol bir üst düzey özellik veya özelliğin noktalı bir gösterimi yolu olabilir. Vektörlerin dizine alınması ve vektör arama sonuçlarında kullanılması için bir number[] olması gerekir. gibi double[] başka bir tür kullanmak, belgenin dizine alınmasını engeller. Dizine alınamayan belgeler vektör araması sonucunda döndürülmeyecektir. |
kind |
Dize | Oluşturulacak vektör dizininin türü. Seçenekler , vector-hnsw ve vector-diskann şeklindedirvector-ivf . |
dimensions |
integer | Vektör benzerliği için boyut sayısı. DiskANN 2000'e kadar boyutu destekler ve gelecekte 40.000'den fazla boyut için destek planlanacaktır. |
similarity |
Dize | Dizinle kullanılacak benzerlik ölçümü. Olası seçenekler (kosinüs uzaklığı), L2 (Öklid uzaklığı) ve IP (iç ürün) olabilir COS . |
maxDegree |
integer | Grafikteki düğüm başına en fazla kenar sayısı. Bu parametre 20 ile 2048 arasında değişir (varsayılan değer 32'dir). Daha yüksek maxDegree , yüksek boyutluluk ve/veya yüksek doğruluk gereksinimleri olan veri kümeleri için uygundur. |
lBuild |
integer | DiskANN dizin oluşturma sırasında değerlendirilen aday komşu sayısını ayarlar. 10 ile 500 arasında değişen bu parametre (varsayılan değer 50'dir), doğruluk ve hesaplama ek yükünü dengeler: yüksek değerler dizin kalitesini ve doğruluğunu artırır ancak derleme süresini artırır |
DiskANN ile vektör araması yapma
Vektör araması yapmak için toplama işlem hattı aşamasını $search
kullanın ve işleciyle sorgulayın cosmosSearch
. DiskANN, jeo-uzamsal veya metin tabanlı filtreler gibi isteğe bağlı filtreleme ile büyük veri kümelerinde yüksek performanslı aramalara olanak tanır.
{
"$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>]}}}
]}
}
}
},
Alan | Tür | Açıklama |
---|---|---|
lSearch |
integer | Arama için dinamik aday listesinin boyutunu belirtir. Varsayılan değer, ile arasında yapılandırılabilir bir aralıkla 10 1000 şeklindedir40 . Değerin artırılması geri çekmeyi artırır ancak arama hızını azaltabilir. |
k |
integer | Döndürülecek arama sonuçlarının sayısını tanımlar. Değerin k değerinden küçük veya eşit lSearch olması gerekir. |
Yeni bir kümede DiskANN'yi etkinleştirme
MongoDB için Yeni Sağlanan Azure Cosmos DB (sanal Çekirdek) kümesinde DiskANN Vektör Dizini'ni etkinleştirmek için, Azure CLI aracılığıyla küme düzeyinde kayıt gerçekleştirmek için şu adımları izleyin:
- Azure CLI'da oturum açma
az login
- Kümenizdeki özellik bayrakları için geçerli ayarları alın. Bu, yeni özelliği eklerken mevcut bayrakları korumanızı sağlar.
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>
DiskANNIndex
Mevcut özellikleri kaldırmadan önizleme özellikleri listesine bayrağını ekleyin.
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\"]}"
Filtreleme ile DiskANN Dizini kullanma örneği
Veritabanınıza vektör ekleme
Vektör aramasını jeo-uzamsal filtrelerle kullanmak için hem vektör eklemeleri hem de konum koordinatlarını içeren belgeler ekleyin. Eklemeleri kendi modelinizi, Azure OpenAI Embeddings'i veya başka bir API'yi (Azure'da Yüz Tanıma gibi) kullanarak oluşturabilirsiniz.
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 vektör dizini oluşturma
Aşağıdaki örnekte, filtreleme özelliklerine sahip bir DiskANN vektör dizininin nasıl ayarlanacağı gösterilmektedir. Buna benzerlik araması için vektör dizini oluşturma, vektör ve jeo-uzamsal özelliklere sahip belgeler ekleme ve ek filtreleme için dizin oluşturma alanları dahildir.
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
}
}
]
})
Bu komut, içinde contentVector
alanında exampleCollection
bir DiskANN vektör dizini oluşturur ve benzerlik aramalarını etkinleştirir. Ayrıca şunları da ekler:
- İşletmelerin
is_open
açık olup olmadığına göre sonuçları filtrelemenize olanak sağlayan alandaki bir dizin. - Coğrafi yakınlık ölçütüne göre filtrelemek için alandaki jeo-uzamsal dizin
location
.
Vektör Araması Gerçekleştirme
Belirli bir coğrafi yarıçap içinde benzer vektörlere sahip belgeleri bulmak için benzerlik aramasını queryVector
belirtin ve jeo-uzamsal filtre ekleyin.
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)
Bu örnekte vektör benzerlik araması, belirtilen COS
benzerlik ölçümüne göre en k
yakın vektörleri döndürürken sonuçları yalnızca 100 mil yarıçapı içindeki açık işletmeleri içerecek şekilde filtrelemektedir.
[
{
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]
}
}
]
Bu sonuç, 100 mil yarıçapı ve açık işletmelerle kısıtlanmış, ile en çok benzer belgeleri queryVector
gösterir. Her sonuç, MongoDB için Cosmos DB'deki DiskANN'nin zenginleştirilmiş, konuma duyarlı arama deneyimleri için birleştirilmiş vektör ve jeo-uzamsal sorguları nasıl desteklediğini gösteren benzerlik puanı ve meta verileri içerir.
Vektör dizini tanımlarını alma
Vektör dizini tanımınızı koleksiyondan almak için komutunu listIndexes
kullanın:
db.exampleCollection.getIndexes();
Bu örnekte, vectorIndex
dizini oluşturmak için kullanılan tüm cosmosSearch
parametrelerle döndürülür:
[
{ 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'
}
]
Filtrelenmiş vektör araması (önizleme)
Artık , , , , $eq
, $gte
$gt
$neq
$nin
$in
ve $regex
gibi $lt
desteklenen herhangi bir sorgu filtresiyle vektör aramaları yürütebilirsiniz. $lte
Azure Aboneliğinizin "Önizleme Özellikleri" sekmesinde "vektör aramasını filtreleme" özelliğini etkinleştirin. Önizleme özellikleri hakkında daha fazla bilgiyi burada bulabilirsiniz.
İlk olarak, vektör dizinine ek olarak filtreniz için bir dizin tanımlamanız gerekir. Örneğin, bir özellikte filtre dizinini tanımlayabilirsiniz
db.runCommand({
"createIndexes": "<collection_name",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Ardından, aşağıda gösterildiği gibi terimi vektör aramanıza ekleyebilirsiniz "filter"
. Bu örnekte filtre, özelliğinin "title"
listesinde ["not in this text", "or this text"]
olmadığı belgeleri arıyor.
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' }
}
]);
Önemli
Önizleme aşamasındayken, filtrelenmiş vektör araması daha yüksek doğruluk elde etmek için vektör dizini parametrelerinizi ayarlamanızı gerektirebilir. Örneğin, m
, , efConstruction
veya efSearch
HNSW veya kullanırken ya da numLists
nProbes
IVF kullanırken daha iyi sonuçlara yol açabilir. Sonuçların tatmin edici olduğundan emin olmak için kullanmadan önce yapılandırmanızı test etmelisiniz.
LLM Düzenleme araçlarını kullanma
Anlam Çekirdeği ile vektör veritabanı olarak kullanma
MongoDB sanal çekirdeği ve LLM'niz için Azure Cosmos DB'den bilgi alma işleminizi yönetmek için Anlam Çekirdeği'ni kullanın. Buradan daha fazla bilgi edinin.
LangChain ile vektör veritabanı olarak kullanma
MongoDB sanal çekirdeği ve LLM'niz için Azure Cosmos DB'den bilgi alma işleminizi yönetmek için LangChain'i kullanın. Buradan daha fazla bilgi edinin.
LangChain ile anlamsal önbellek olarak kullanma
Daha önce kaydedilmiş LLM yanıtlarını kullanarak LLM API maliyetlerinden tasarruf etmenizi ve yanıt gecikme süresini azaltmanızı sağlayan AnlamSal Önbelleğe Alma'yı düzenleme amacıyla MongoDB için LangChain ve Azure Cosmos DB 'yi (sanal çekirdek) kullanın. Daha fazla bilgi edinmek için buraya bakın.
Özellikler ve sınırlamalar
- Desteklenen uzaklık ölçümleri: L2 (Öklid), iç ürün ve kosinüs.
- Desteklenen dizin oluşturma yöntemleri: IVFFLAT, HNSW ve DiskANN (Önizleme)
- 2.000 boyuta kadar dizin vektörleri.
- Dizin oluşturma, yol başına yalnızca bir vektör için geçerlidir.
- Vektör yolu başına yalnızca bir dizin oluşturulabilir.
Özet
Bu kılavuzda vektör dizini oluşturma, vektör verileri içeren belgeler ekleme, benzerlik araması yapma ve dizin tanımını alma işlemleri gösterilmektedir. Tümleşik vektör veritabanımızı kullanarak yüksek boyutlu vektör verilerini doğrudan MongoDB için Azure Cosmos DB sanal çekirdeğinde verimli bir şekilde depolayabilir, dizinleyebilir ve sorgulayabilirsiniz. Vektör eklemeleri aracılığıyla verilerinizin tüm potansiyelini ortaya çıkarmanızı sağlar ve daha doğru, verimli ve güçlü uygulamalar oluşturmanıza olanak tanır.
İlgili içerik
- .NET RAG Deseni perakende başvuru çözümü
- .NET öğreticisi - tarif sohbet botu
- C# RAG deseni - OpenAI Hizmetlerini Cosmos ile Tümleştirme
- Python RAG deseni - Azure ürün sohbet botu
- Python not defteri öğreticisi - LangChain aracılığıyla vektör veritabanı tümleştirmesi
- Python not defteri öğreticisi - LangChain aracılığıyla LLM Önbelleğe Alma tümleştirmesi
- Python - LlamaIndex tümleştirmesi
- Python - Anlam Çekirdeği bellek tümleştirmesi