Bagikan melalui


Penyimpanan vektor di Azure Cosmos DB untuk MongoDB vCore

Gunakan Database Vektor Terintegrasi di Azure Cosmos DB for MongoDB (vCore) untuk menyambungkan aplikasi berbasis AI Anda dengan data Yang disimpan di Azure Cosmos DB dengan lancar. Integrasi ini dapat mencakup aplikasi yang Anda buat dengan menggunakan penyematan Azure OpenAI. Database vektor terintegrasi asli memungkinkan Anda menyimpan, mengindeks, dan mengkueri data vektor dimensi tinggi secara efisien yang disimpan langsung di Azure Cosmos DB for MongoDB (vCore), bersama dengan data asli tempat data vektor dibuat. Ini menghilangkan kebutuhan untuk mentransfer data Anda ke penyimpanan vektor alternatif dan dikenakan biaya tambahan.

Apa itu penyimpanan vektor?

Penyimpanan vektor atau database vektor adalah database yang dirancang untuk menyimpan dan mengelola penyematan vektor, yang merupakan representasi matematika data dalam ruang dimensi tinggi. Dalam ruang ini, setiap dimensi sesuai dengan fitur data, dan puluhan ribu dimensi mungkin digunakan untuk mewakili data canggih. Posisi vektor dalam ruang ini mewakili karakteristiknya. Kata, frasa, atau seluruh dokumen, dan gambar, audio, dan jenis data lainnya semuanya dapat di-vektorisasi.

Bagaimana cara kerja penyimpanan vektor?

Di penyimpanan vektor, algoritma pencarian vektor digunakan untuk mengindeks dan mengkueri penyematan. Beberapa algoritma pencarian vektor terkenal termasuk Hierarkis Navigable Small World (HNSW), Inverted File (IVF), DiskANN, dll. Pencarian vektor adalah metode yang membantu Anda menemukan item serupa berdasarkan karakteristik datanya daripada dengan kecocokan yang tepat pada bidang properti. Teknik ini berguna dalam aplikasi seperti mencari teks serupa, menemukan gambar terkait, membuat rekomendasi, atau bahkan mendeteksi anomali. Ini digunakan untuk mengkueri penyematan vektor (daftar angka) data yang Anda buat dengan menggunakan model pembelajaran mesin dengan menggunakan API penyematan. Contoh API penyematan adalah Azure OpenAI Embeddings atau Hugging Face di Azure. Pencarian vektor mengukur jarak antara vektor data dan vektor kueri Anda. Vektor data yang paling dekat dengan vektor kueri Anda adalah vektor yang ditemukan paling mirip secara semantik.

Dalam Database Vektor Terintegrasi di Azure Cosmos DB untuk MongoDB (vCore), penyematan dapat disimpan, diindeks, dan dikueri bersama data asli. Pendekatan ini menghilangkan biaya tambahan untuk mereplikasi data dalam database vektor murni terpisah. Selain itu, arsitektur ini menjaga penyematan vektor dan data asli bersama-sama, yang lebih memfasilitasi operasi data multi-modal, dan memungkinkan konsistensi, skala, dan performa data yang lebih besar.

Azure Cosmos DB for MongoDB (vCore) menyediakan kemampuan pencarian vektor yang kuat, memungkinkan Anda melakukan pencarian kesamaan berkecepatan tinggi di seluruh himpunan data yang kompleks. Untuk melakukan pencarian vektor di Azure Cosmos DB untuk MongoDB, Anda harus terlebih dahulu membuat indeks vektor. Cosmos DB saat ini mendukung tiga jenis indeks vektor:

  • DiskANN (Disarankan): Ideal untuk himpunan data skala besar, memanfaatkan SSD untuk penggunaan memori yang efisien sambil mempertahankan pengenalan tinggi dalam sekitar pencarian tetangga terdekat (ANN).
  • HNSW: Cocok untuk himpunan data berukuran sedang yang membutuhkan pengenalan tinggi, dengan struktur berbasis grafik yang menyeimbangkan akurasi dan efisiensi sumber daya.
  • IVF: Menggunakan pengklusteran untuk mengoptimalkan kecepatan pencarian dalam himpunan data yang ekspansif, memfokuskan pencarian dalam kluster yang ditargetkan untuk mempercepat performa.

Indeks DiskANN tersedia pada tingkat M40 ke atas. Untuk membuat indeks DiskANN, atur "kind" parameter ke "vector-diskann" mengikuti templat di bawah ini:

{ 
    "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>, 
            } 
        } 
    ] 
}
Bidang Jenis Deskripsi
index_name string Nama unik indeks.
path_to_property string Jalur ke properti yang berisi vektor. Jalur ini bisa menjadi properti tingkat atas atau jalur notasi titik ke properti . Vektor harus diindeks number[] dan digunakan dalam hasil pencarian vektor. Menggunakan jenis lain, seperti double[], mencegah dokumen diindeks. Dokumen yang tidak diindeks tidak akan dikembalikan dalam hasil pencarian vektor.
kind string Jenis indeks vektor yang akan dibuat. Opsinya adalah vector-ivf, , vector-hnswdan vector-diskann.
dimensions Integer Jumlah dimensi untuk kesamaan vektor. DiskANN mendukung hingga 2000 dimensi, dengan dukungan di masa mendatang yang direncanakan untuk 40.000+.
similarity string Metrik kesamaan untuk digunakan dengan indeks. Opsi yang mungkin adalah COS (jarak kosinus), L2 (jarak Euclidean), dan IP (produk dalam).
maxDegree Integer Jumlah maksimum tepi per simpul dalam grafik. Parameter ini berkisar dari 20 hingga 2048 (defaultnya adalah 32). Lebih tinggi maxDegree cocok untuk himpunan data dengan dimensi tinggi dan/atau persyaratan akurasi tinggi.
lBuild Integer Menetapkan jumlah tetangga kandidat yang dievaluasi selama konstruksi indeks DiskANN. Parameter ini, yang berkisar dari 10 hingga 500 (defaultnya adalah 50), menyeimbangkan akurasi dan overhead komputasi: nilai yang lebih tinggi meningkatkan kualitas dan akurasi indeks tetapi meningkatkan waktu build

Melakukan pencarian vektor dengan DiskANN

Untuk melakukan pencarian vektor, gunakan $search tahap alur agregasi, dan kueri dengan cosmosSearch operator. DiskANN memungkinkan pencarian berkinerja tinggi di seluruh himpunan data besar dengan pemfilteran opsional seperti filter geospasial atau berbasis teks.

{
  "$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>]}}}
      ]}
    }
  }
},
Bidang Jenis Deskripsi
lSearch Integer Menentukan ukuran daftar kandidat dinamis untuk pencarian. Nilai defaultnya adalah 40, dengan rentang yang dapat dikonfigurasi dari 10 ke 1000. Meningkatkan nilai meningkatkan pengenalan tetapi dapat mengurangi kecepatan pencarian.
k Integer Menentukan jumlah hasil pencarian yang akan dikembalikan. Nilai k harus kurang dari atau sama dengan lSearch.

Mengaktifkan DiskANN pada kluster baru

Untuk mengaktifkan Indeks Vektor DiskANN pada kluster Azure Cosmos DB for MongoDB (vCore) yang baru disediakan, ikuti langkah-langkah berikut untuk melakukan pendaftaran tingkat kluster melalui Azure CLI:

  1. Masuk ke Azure CLI
az login
  1. Ambil pengaturan saat ini untuk bendera fitur pada kluster Anda. Ini memastikan Anda mempertahankan bendera yang ada saat menambahkan fitur baru.
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 Tambahkan bendera ke daftar fitur pratinjau tanpa menghapus yang sudah ada.
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\"]}" 

Contoh menggunakan Indeks DiskANN dengan Pemfilteran

Menambahkan vektor ke database Anda

Untuk menggunakan pencarian vektor dengan filter geospasial, tambahkan dokumen yang menyertakan penyematan vektor dan koordinat lokasi. Anda dapat membuat penyematan dengan menggunakan model Anda sendiri, Azure OpenAI Embeddings, atau API lain (seperti Hugging Face di Azure).

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)

Membuat indeks vektor DiskANN

Contoh berikut menunjukkan cara menyiapkan indeks vektor DiskANN dengan kemampuan pemfilteran. Ini termasuk membuat indeks vektor untuk pencarian kesamaan, menambahkan dokumen dengan properti vektor dan geospasial, dan bidang pengindeksan untuk pemfilteran tambahan.

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
            }
        }
    ]
})

Perintah ini membuat indeks vektor DiskANN pada contentVector bidang di exampleCollection, memungkinkan pencarian kesamaan. Ini juga menambahkan:

  • Indeks di is_open bidang , memungkinkan Anda memfilter hasil berdasarkan apakah bisnis terbuka.
  • Indeks geospasial pada location bidang untuk memfilter berdasarkan kedekatan geografis.

Untuk menemukan dokumen dengan vektor serupa dalam radius geografis tertentu, tentukan untuk pencarian kesamaan queryVector dan sertakan filter geospasial.

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)

Dalam contoh ini, pencarian kesamaan vektor mengembalikan vektor terdekat teratas k berdasarkan metrik kesamaan yang ditentukan COS , sementara memfilter hasil untuk hanya menyertakan bisnis terbuka dalam radius 100 mil.

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

Hasil ini menunjukkan dokumen serupa teratas dengan queryVector, dibatasi hingga radius 100 mil dan bisnis terbuka. Setiap hasil mencakup skor kesamaan dan metadata, menunjukkan bagaimana DiskANN di Cosmos DB untuk MongoDB mendukung kueri vektor dan geospasial gabungan untuk pengalaman pencarian yang diperkaya dan sensitif lokasi.

Mendapatkan definisi indeks vektor

Untuk mengambil definisi indeks vektor Anda dari koleksi, gunakan listIndexes perintah :

db.exampleCollection.getIndexes();

Dalam contoh ini, vectorIndex dikembalikan dengan semua cosmosSearch parameter yang digunakan untuk membuat indeks:

[
  { 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'
  }
]

Pencarian vektor yang difilter (pratinjau)

Anda sekarang dapat menjalankan pencarian vektor dengan filter kueri yang didukung seperti $lt, , $lte, $eq, $gte$neq, $gt, $in, $nin, dan $regex. Aktifkan fitur "pemfilteran pencarian vektor" di tab "Fitur Pratinjau" dari Langganan Azure Anda. Pelajari selengkapnya tentang fitur pratinjau di sini.

Pertama, Anda harus menentukan indeks untuk filter Anda selain indeks vektor. Misalnya, Anda dapat menentukan indeks filter pada properti

db.runCommand({ 
     "createIndexes": "<collection_name",
    "indexes": [ {
        "key": { 
            "<property_to_filter>": 1 
               }, 
        "name": "<name_of_filter_index>" 
    }
    ] 
});

Selanjutnya, Anda dapat menambahkan istilah ke pencarian vektor seperti yang "filter" ditunjukkan di bawah ini. Dalam contoh ini filter mencari dokumen di mana "title" properti tidak ada dalam daftar ["not in this text", "or this text"].


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' }
}
]);

Penting

Saat dalam pratinjau, pencarian vektor yang difilter mungkin mengharuskan Anda untuk menyesuaikan parameter indeks vektor Anda untuk mencapai akurasi yang lebih tinggi. Misalnya, meningkatkan m, , atau efSearch saat menggunakan HNSW, atau , atau nProbes numListssaat menggunakan IVF, dapat menyebabkan hasil efConstructionyang lebih baik. Anda harus menguji konfigurasi sebelum digunakan untuk memastikan bahwa hasilnya memuaskan.

Menggunakan alat Orkestrasi LLM

Gunakan sebagai database vektor dengan Kernel Semantik

Gunakan Semantic Kernel untuk mengatur pengambilan informasi Anda dari Azure Cosmos DB untuk MongoDB vCore dan LLM Anda. Pelajari selengkapnya di sini.

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

Gunakan sebagai database vektor dengan LangChain

Gunakan LangChain untuk mengatur pengambilan informasi Anda dari Azure Cosmos DB untuk MongoDB vCore dan LLM Anda. Pelajari selengkapnya di sini.

Gunakan sebagai cache semantik dengan LangChain

Gunakan LangChain dan Azure Cosmos DB for MongoDB (vCore) untuk mengatur Semantic Caching, menggunakan respons LLM yang direkam sebelumnya yang dapat menghemat biaya LLM API Anda dan mengurangi latensi untuk respons. Pelajari selengkapnya di sini

Fitur dan batasan

  • Metrik jarak yang didukung: L2 (Euclidean), produk dalam, dan kosinus.
  • Metode pengindeksan yang didukung: IVFFLAT, HNSW, dan DiskANN (Pratinjau)
  • Vektor pengindeksan hingga ukuran 2.000 dimensi.
  • Pengindeksan hanya berlaku untuk satu vektor per jalur.
  • Hanya satu indeks yang dapat dibuat per jalur vektor.

Ringkasan

Panduan ini menunjukkan cara membuat indeks vektor, menambahkan dokumen yang memiliki data vektor, melakukan pencarian kesamaan, dan mengambil definisi indeks. Dengan menggunakan database vektor terintegrasi kami, Anda dapat menyimpan, mengindeks, dan mengkueri data vektor dimensi tinggi secara efisien langsung di Azure Cosmos DB untuk MongoDB vCore. Ini memungkinkan Anda untuk membuka potensi penuh data Anda melalui penyematan vektor, dan memberdayakan Anda untuk membangun aplikasi yang lebih akurat, efisien, dan kuat.

Langkah selanjutnya