Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare il database vettoriale integrato in Azure Cosmos DB per MongoDB (vCore) per connettere facilmente le applicazioni basate su intelligenza artificiale ai dati archiviati in Azure Cosmos DB. Questa integrazione può includere app create usando incorporamenti OpenAI di Azure. Il database vettoriale integrato in modo nativo consente di archiviare, indicizzare ed eseguire query su dati vettoriali altamente dimensionali archiviati direttamente in Azure Cosmos DB per MongoDB (vCore), insieme ai dati originali da cui vengono creati i dati vettoriali. Elimina la necessità di trasferire i dati in archivi vettoriali alternativi e comporta costi aggiuntivi.
Che cos'è un archivio di vettori?
Un archivio vettoriale o un database vettoriale è un database progettato per archiviare e gestire incorporamenti vettoriali, che sono rappresentazioni matematiche dei dati in uno spazio ad alta dimensione. In questo spazio, ogni dimensione corrisponde a una caratteristica dei dati e decine di migliaia di dimensioni possono essere usate per rappresentare dati sofisticati. La posizione di un vettore in questo spazio rappresenta le sue caratteristiche. Parole, frasi o interi documenti, immagini, audio e altri tipi di dati possono essere vettorizzati.
Come funziona un archivio vettoriale?
In un archivio vettoriale, gli algoritmi di ricerca vettoriale vengono usati per indicizzare ed eseguire query sugli incorporamenti. Alcuni algoritmi di ricerca vettoriale noti includono Hierarchical Navigable Small World (HNSW), Inverted File (IVF), DiskANN e così via. La ricerca vettoriale è un metodo che consente di trovare elementi simili in base alle caratteristiche dei dati anziché in base alle corrispondenze esatte in un campo di proprietà. Questa tecnica è utile nelle applicazioni come la ricerca di testi simili o di immagini correlate, la creazione di elementi consigliati o anche il rilevamento di anomalie. È utilizzato per eseguire query sui vettori di embedding (elenchi di numeri) dei dati che hai creato con un modello di machine learning tramite un'API di embedding. Esempi di API di incorporamento sono Incorporamenti OpenAI di Azure o Hugging Face in Azure. La ricerca vettoriale misura quindi la distanza tra i vettori di dati e i vettori di query. I vettori di dati più vicini al vettore di query sono quelli che risultano più simili dal punto di vista semantico.
Nel database vettoriale integrato in Azure Cosmos DB per MongoDB (vCore), gli incorporamenti possono essere archiviati, indicizzati ed sottoposti a query insieme ai dati originali. Questo approccio elimina il costo aggiuntivo della replica dei dati in un database vettoriale puro separato. Inoltre, questa architettura mantiene insieme gli incorporamenti vettoriali e i dati originali, che facilitano meglio le operazioni di dati multi modale e consentono una maggiore coerenza, scalabilità e prestazioni dei dati.
Eseguire una ricerca di somiglianza vettoriale
Azure Cosmos DB per MongoDB (vCore) offre potenti funzionalità di ricerca vettoriale, consentendo di eseguire ricerche di somiglianza ad alta velocità in set di dati complessi. Per eseguire la ricerca vettoriale in Azure Cosmos DB per MongoDB, è prima necessario creare un indice vettoriale. Cosmos DB supporta attualmente tre tipi di indici vettoriali:
- DiskANN (scelta consigliata): ideale per set di dati su larga scala, sfruttando le unità SSD per un utilizzo efficiente della memoria, mantenendo al contempo un elevato richiamo nelle ricerche approssimative dei punti più vicini (ANN).
- HNSW: adatto per set di dati di dimensioni moderate che richiedono un richiamo elevato, con una struttura basata su grafo che bilancia l'accuratezza e l'efficienza delle risorse.
- IVF: usa il clustering per ottimizzare la velocità di ricerca in set di dati estesi, concentrandosi sulle ricerche all'interno dei cluster di destinazione per accelerare le prestazioni.
Gli indici DiskANN sono disponibili nei livelli M30 e versioni successive. Per creare l'indice DiskANN, impostare il "kind"
parametro "vector-diskann"
su come segue il modello seguente:
{
"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>,
}
}
]
}
Campo | Tipo | Descrizione |
---|---|---|
index_name |
stringa | Nome univoco dell'indice. |
path_to_property |
stringa | Percorso della proprietà che contiene il vettore. Questo percorso può essere una proprietà di primo livello o un percorso di notazione con punto per la proprietà. I vettori devono essere un number[] oggetto da indicizzare e usare nei risultati della ricerca vettoriale. L'utilizzo di tipi diversi, ad esempio double[] , impedisce l'indicizzazione del documento. I documenti non indicizzati non verranno restituiti nei risultati di una ricerca vettoriale. |
kind |
stringa | Tipo di indice vettoriale da creare. Le opzioni sono vector-ivf , vector-hnsw e vector-diskann . |
dimensions |
numero intero | Numero di dimensioni per la somiglianza di vettore. DiskANN supporta fino a 16.000 dimensioni (con quantizzazione del prodotto), con supporto futuro previsto per 40.000+. |
similarity |
stringa | Metrica di somiglianza da usare con l'indice. Le opzioni possibili sono COS (distanza coseno), L2 (distanza euclidea) e IP (prodotto interno). |
maxDegree |
numero intero | Numero massimo di archi per nodo nel grafico. Questo parametro varia da 20 a 2048 (il valore predefinito è 32). Maggiore maxDegree è adatto per i set di dati con requisiti di accuratezza elevata e/o dimensionalità elevata. |
lBuild |
numero intero | Imposta il numero di vicini candidati valutati durante la costruzione dell'indice DiskANN. Questo parametro, compreso tra 10 e 500 (il valore predefinito è 50), bilancia l'accuratezza e l'overhead di calcolo: i valori più elevati migliorano la qualità e l'accuratezza dell'indice, ma aumentano il tempo di compilazione |
Eseguire una ricerca vettoriale con DiskANN
Per eseguire una ricerca vettoriale, usare la fase della $search
pipeline di aggregazione ed eseguire query con l'operatore cosmosSearch
. DiskANN consente ricerche ad alte prestazioni in set di dati di grandi dimensioni con filtri facoltativi , ad esempio filtri geospaziali o basati su testo.
{
"$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>]}}}
]}
}
}
},
Campo | Tipo | Descrizione |
---|---|---|
lSearch |
numero intero | Specifica le dimensioni dell'elenco dei candidati dinamici per la ricerca. Il valore predefinito è 40 , con un intervallo configurabile compreso tra 10 e 1000 . L'aumento del valore migliora il richiamo, ma può ridurre la velocità di ricerca. |
k |
numero intero | Definisce il numero di risultati della ricerca da restituire. Il k valore deve essere minore o uguale a lSearch . |
Esempio di utilizzo di un indice DiskANN con filtro
Aggiungere vettori al database
Per usare la ricerca vettoriale con filtri geospaziali, aggiungere documenti che includono incorporamenti di vettori e coordinate di posizione. È possibile creare gli incorporamenti usando un modello personalizzato, incorporamenti di Azure OpenAI o un'altra API , ad esempio Hugging Face in 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)
Creare un indice vettoriale DiskANN
Nell'esempio seguente viene illustrato come configurare un indice vettoriale DiskANN con funzionalità di filtro. Ciò include la creazione dell'indice vettoriale per la ricerca di somiglianza, l'aggiunta di documenti con proprietà vettoriali e geospaziali e l'indicizzazione dei campi per un filtro aggiuntivo.
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
}
}
]
})
Questo comando crea un indice vettoriale DiskANN nel contentVector
campo in exampleCollection
, abilitando le ricerche di somiglianza. Aggiunge anche:
- Un indice nel
is_open
campo, che consente di filtrare i risultati in base al fatto che le aziende siano aperte. - Indice geospaziale nel
location
campo da filtrare in base alla prossimità geografica.
Eseguire una ricerca vettoriale
Per trovare documenti con vettori simili all'interno di un raggio geografico specifico, specificare per la queryVector
ricerca di somiglianza e includere un filtro geospaziale.
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)
In questo esempio, la ricerca di somiglianza vettoriale restituisce i vettori più k
vicini in base alla metrica di somiglianza specificata COS
, mentre filtrando i risultati in modo da includere solo le aziende aperte entro un raggio di 100 miglia.
[
{
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]
}
}
]
Questo risultato mostra i documenti più simili a queryVector
, vincolati a un raggio di 100 miglia e aziende aperte. Ogni risultato include il punteggio di somiglianza e i metadati, dimostrando in che modo DiskANN in Cosmos DB per MongoDB supporta query di ricerca combinate con vettori e geospaziali per esperienze di ricerca arricchite e sensibili alla posizione.
Ottenere definizioni di indice vettoriale
Per recuperare la definizione di indice vettoriale dalla raccolta, usare il comando listIndexes
:
db.exampleCollection.getIndexes();
In questo esempio, vectorIndex
viene restituito con tutti i parametri cosmosSearch
usati per creare l'indice:
[
{ 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'
}
]
Ricerca vettoriale filtrata
È ora possibile eseguire ricerche vettoriali con qualsiasi filtro di query supportato, ad esempio $lt
, $lte
, $eq
, $neq
, $gte
, $gt
, $in
, $nin
e $regex
.
Per usare il filtro preliminare, è prima necessario definire un indice standard nella proprietà che si intende filtrare, oltre all'indice vettoriale. Ecco un esempio di creazione di un indice di filtro:
db.runCommand({
"createIndexes": "<collection_name>",
"indexes": [ {
"key": {
"<property_to_filter>": 1
},
"name": "<name_of_filter_index>"
}
]
});
Dopo aver inserito l'indice di filtro, è possibile incorporare la "filter"
clausola direttamente nella query di ricerca vettoriale, come illustrato di seguito. In questo esempio viene illustrato come filtrare i risultati in cui il "title"
valore della proprietà non è presente nell'elenco fornito:
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' }
}
]);
Importante
Per ottimizzare le prestazioni e l'accuratezza delle ricerche dei vettori prefiltrati, è consigliabile modificare i parametri dell'indice vettoriale. Per gli indici DiskANN, aumentare maxDegree
o lBuild
possa produrre risultati migliori. Per gli indici HNSW , l'esperimento con valori più elevati per m
, efConstruction
o efSearch
può migliorare le prestazioni. Analogamente, per gli indici IVF , l'ottimizzazione numLists
o nProbes
potrebbe portare a risultati più soddisfacenti. È fondamentale testare la configurazione specifica con i dati per garantire che i risultati soddisfino i requisiti. Questi parametri influenzano la struttura dell'indice e il comportamento della ricerca e i valori ottimali possono variare in base alle caratteristiche dei dati e ai modelli di query.
Usare gli strumenti di orchestrazione LLM
Usare come database vettoriale con kernel semantico
È ora possibile utilizzare Kernel semantico per orchestrare il recupero delle informazioni da Azure Cosmos DB for MongoDB vCore e LLM. Altre informazioni sono disponibili qui.
Usare come database vettoriale con LangChain
Utilizzare LangChain per orchestrare il recupero delle informazioni da Azure Cosmos DB for MongoDB vCore e LLM. Altre informazioni sono disponibili qui.
Usare come cache semantica con LangChain
Usare LangChain e Azure Cosmos DB per MongoDB (vCore) per orchestrare la memorizzazione nella cache semantica, usando risposte LLM registrate in precedenza che consentono di risparmiare sui costi dell'API LLM e ridurre la latenza per le risposte. Altre informazioni sono disponibili qui
Funzionalità e limitazioni
- Metriche di distanza supportate: L2 (euclideo), prodotto interno e coseno.
- Metodi di indicizzazione supportati: IVFFLAT, HNSW e DiskANN.
- Con DiskANN e La quantizzazione del prodotto, è possibile indicizzare vettori fino a 16.000 dimensioni.
- L'uso di HNSW o IVF con metà precisione consente l'indicizzazione di vettori fino a 4.000 dimensioni.
- Senza alcuna compressione, la dimensione massima massima predefinita per l'indicizzazione è 2.000.
- L'indicizzazione si applica a un solo vettore per percorso.
- È possibile creare un solo indice per percorso vettoriale.
Riepilogo
Questa guida illustra come creare un indice vettoriale, aggiungere documenti con dati vettoriali, eseguire una ricerca di somiglianza e recuperare la definizione dell'indice. Il database di vettori integrato consente di indicizzare ed eseguire in maniera efficace query sui dati vettoriali di grandi dimensioni archiviati direttamente in Azure Cosmos DB for MongoDB vCore. Consente di sfruttare appieno il potenziale dei dati tramite incorporamenti vettoriali e consente di creare applicazioni più accurate, efficienti e potenti.
Contenuto correlato
- Soluzione di riferimento per la vendita al dettaglio di .NET RAG Pattern
- Esercitazione su .NET - Chatbot per le ricette
- Modello RAG C# - Integrare i servizi OpenAI con Cosmos
- Modello RAG python - Chatbot del prodotto Azure
- Esercitazione su notebook Python - Integrazione del database vettoriale tramite LangChain
- Esercitazione sul notebook Python - Integrazione della memorizzazione nella cache LLM tramite LangChain
- Python - Integrazione di LlamaIndex
- Integrazione della memoria nel Python Semantic Kernel