Condividi tramite


Archivio vettoriale in Azure Cosmos DB per MongoDB vCore

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 applicazioni create usando gli 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 dimensionalità. 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. Viene usato per eseguire query sui vettori di incorporamento (elenchi dei numeri) dei dati, creati usando un modello di Machine Learning usando un'API di incorporamento. Esempi di API di incorporamento sono gli 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.

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 tempo stesso un richiamo elevato nelle ricerche ann (near-neighbor) approssimative.
  • 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 M40 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 string 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 string Tipo di indice vettoriale da creare. Le opzioni sono vector-ivf, vector-hnsw e vector-diskann.
dimensions integer Numero di dimensioni per la somiglianza di vettore. DiskANN supporta fino a 2000 dimensioni, con il supporto futuro previsto per 40.000+.
similarity string Metrica di somiglianza da usare con l'indice. Le opzioni possibili sono COS (distanza coseno), L2 (distanza euclidea) e IP (prodotto interno).
maxDegree integer 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 integer 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 integer 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 integer Definisce il numero di risultati della ricerca da restituire. Il k valore deve essere minore o uguale a lSearch.

Abilitazione di DiskANN in un nuovo cluster

Per abilitare l'indice vettoriale DiskANN in un cluster Azure Cosmos DB per MongoDB (vCore), seguire questa procedura per eseguire una registrazione a livello di cluster tramite l'interfaccia della riga di comando di Azure:

  1. Accedere all'interfaccia della riga di comando di Azure
az login
  1. Recuperare le impostazioni correnti per i flag di funzionalità nel cluster. In questo modo si garantisce di mantenere tutti i flag esistenti durante l'aggiunta della nuova funzionalità.
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. Aggiungere il DiskANNIndex flag all'elenco delle funzionalità di anteprima senza rimuovere quelle esistenti.
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\"]}" 

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.

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 (anteprima)

È ora possibile eseguire ricerche vettoriali con qualsiasi filtro di query supportato, ad esempio $lt, $lte, $eq, $neq, $gte, $gt, $in, $nine $regex. Abilitare la funzionalità "ricerca vettoriale filtrata" nella scheda "Funzionalità di anteprima" della sottoscrizione di Azure. Altre informazioni sulle funzionalità di anteprima qui.

In primo luogo, è necessario definire un indice per il filtro oltre a un indice vettoriale. Ad esempio, è possibile definire l'indice del filtro in una proprietà

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

Successivamente, è possibile aggiungere il termine "filter" alla ricerca vettoriale, come illustrato di seguito. In questo esempio il filtro cerca i documenti in cui la proprietà "title" non è presente nell'elenco di ["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' }
}
]);

Importante

Durante l'anteprima, la ricerca vettoriale filtrata potrebbe richiedere di modificare i parametri dell'indice vettoriale per ottenere un'accuratezza maggiore. Ad esempio, l'aumento di m, efConstruction o efSearch quando si usa HNSW o numLists o nProbes quando si usa IVF, può portare a risultati migliori. È necessario testare la configurazione prima di usare per assicurarsi che i risultati siano soddisfacenti.

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 qui.

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

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 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. Scopri di più qui

Funzionalità e limitazioni

  • Metriche di distanza supportate: L2 (euclideo), prodotto interno e coseno.
  • Metodi di indicizzazione supportati: IVFFLAT, HNSW e DiskANN (anteprima)
  • Indicizzazione di vettori con dimensioni fino a 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 sbloccare il potenziale completo dei dati tramite incorporamenti vettoriali e consente di creare applicazioni più accurate, efficienti e potenti.

Passaggio successivo