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.
Melakukan pencarian Kesamaan Vektor
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-hnsw dan 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:
- Masuk ke Azure CLI
az login
- 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>
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.
Melakukan Pencarian Vektor
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
numLists
saat menggunakan IVF, dapat menyebabkan hasil efConstruction
yang 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.
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.
Konten terkait
- Solusi referensi ritel .NET RAG Pattern
- Tutorial .NET - resep chatbot
- Pola C# RAG - Mengintegrasikan Layanan OpenAI dengan Cosmos
- Pola Python RAG - Chatbot produk Azure
- Tutorial notebook Python - Integrasi database vektor melalui LangChain
- Tutorial notebook Python - Integrasi PENEMBOLOKAN LLM melalui LangChain
- Python - Integrasi LlamaIndex
- Python - Integrasi memori Kernel Semantik