Aracılığıyla paylaş


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.

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-hnswve 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 lSearcholması 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:

  1. Azure CLI'da oturum açma
az login
  1. 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>
  1. 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 exampleCollectionbir 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 .

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 queryVectorgö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$inve $regexgibi $ltdesteklenen 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, , efConstructionveya efSearch HNSW veya kullanırken ya da numListsnProbes 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.

https://github.com/microsoft/semantic-kernel/tree/main/python/semantic_kernel/connectors/memory/azure_cosmosdb

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.

Sonraki adım