Ricerca vettoriale per Amazon DocumentDB - Amazon DocumentDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Ricerca vettoriale per Amazon DocumentDB

La ricerca vettoriale è un metodo utilizzato nell'apprendimento automatico per trovare punti dati simili a un dato punto dati confrontando le relative rappresentazioni vettoriali utilizzando metriche di distanza o somiglianza. Più i due vettori sono vicini nello spazio vettoriale, più gli elementi sottostanti vengono considerati simili. Questa tecnica aiuta a catturare il significato semantico dei dati. Questo approccio è utile in varie applicazioni, come i sistemi di raccomandazione, l'elaborazione del linguaggio naturale e il riconoscimento delle immagini.

La ricerca vettoriale per Amazon DocumentDB combina la flessibilità e la ricca capacità di interrogazione di JSON un database di documenti basato sulla potenza della ricerca vettoriale. Se desideri utilizzare i dati esistenti di Amazon DocumentDB o una struttura di dati documentale flessibile per creare casi d'uso di machine learning e intelligenza artificiale generativa, come esperienza di ricerca semantica, consigli di prodotti, personalizzazione, chatbot, rilevamento di frodi e rilevamento di anomalie, la ricerca vettoriale per Amazon DocumentDB è la scelta ideale per te. La ricerca vettoriale è disponibile nei cluster basati su istanze di Amazon DocumentDB 5.0.

Inserimento di vettori

Per inserire vettori nel tuo database Amazon DocumentDB, puoi utilizzare i metodi di inserimento esistenti:

Esempio

Nell'esempio seguente, viene creata una raccolta di cinque documenti all'interno di un database di test. Ogni documento include due campi: il nome del prodotto e l'incorporamento vettoriale corrispondente.

db.collection.insertMany([ {"product_name": "Product A", "vectorEmbedding": [0.2, 0.5, 0.8]}, {"product_name": "Product B", "vectorEmbedding": [0.7, 0.3, 0.9]}, {"product_name": "Product C", "vectorEmbedding": [0.1, 0.2, 0.5]}, {"product_name": "Product D", "vectorEmbedding": [0.9, 0.6, 0.4]}, {"product_name": "Product E", "vectorEmbedding": [0.4, 0.7, 0.2]} ]);

Creazione di un indice vettoriale

Amazon DocumentDB supporta sia l'indicizzazione Hierarchical Navigable Small World (HNSW) che i metodi di indicizzazione Inverted File with Flat Compression (). IVFFlat Un IVFFlat indice separa i vettori in elenchi e successivamente cerca un sottoinsieme selezionato di quegli elenchi più vicini al vettore di query. D'altra parte, un HNSW indice organizza i dati vettoriali in un grafico a più livelli. Sebbene HNSW abbia tempi di compilazione più lenti rispetto aIVFFlat, offre prestazioni di query e richiamo migliori. Al contrarioIVFFlat, non HNSW prevede alcuna fase di formazione, il che consente la generazione dell'indice senza alcun caricamento iniziale dei dati. Per la maggior parte dei casi d'uso, consigliamo di utilizzare il tipo di HNSW indice per la ricerca vettoriale.

Se non crei un indice vettoriale, Amazon DocumentDB esegue una ricerca esatta del vicino più vicino, assicurando un richiamo perfetto. Tuttavia, negli scenari di produzione, la velocità è fondamentale. Consigliamo di utilizzare indici vettoriali, che potrebbero sostituire alcuni richiami in cambio di una maggiore velocità. È importante notare che l'aggiunta di un indice vettoriale può portare a risultati di query diversi.

Modelli

È possibile utilizzare quanto segue createIndex o i runCommand modelli per creare un indice vettoriale su un campo vettoriale:

Using createIndex

In alcuni driver, come mongosh e Java, l'utilizzo dei vectorOptions parametri in createIndex può causare un errore. In questi casi, si consiglia di utilizzare: runCommand

db.collection.createIndex( { "<vectorField>": "vector" }, { "name": "<indexName>", "vectorOptions": { "type": " <hnsw> | <ivfflat> ", "dimensions": <number_of_dimensions>, "similarity": " <euclidean> | <cosine> | <dotProduct> ", "lists": <number_of_lists> [applicable for IVFFlat], "m": <max number of connections> [applicable for HNSW], "efConstruction": <size of the dynamic list for index build> [applicable for HNSW] } } );
Using runCommand

In alcuni driver, come mongosh e Java, l'utilizzo dei vectorOptions parametri in createIndex può causare un errore. In questi casi, si consiglia di utilizzare: runCommand

db.runCommand( { "createIndexes": "<collection>", "indexes": [{ key: { "<vectorField>": "vector" }, vectorOptions: { type: " <hnsw> | <ivfflat> ", dimensions: <number of dimensions>, similarity: " <euclidean> | <cosine> | <dotProduct> ", lists: <number_of_lists> [applicable for IVFFlat], m: <max number of connections> [applicable for HNSW], efConstruction: <size of the dynamic list for index build> [applicable for HNSW] }, name: "myIndex" }] } );
Parametro Requisito Tipo di dati Descrizione Valore (i)

name

facoltativo

string

Specificate il nome dell'indice.

Carattere alfanumerico

type

facoltativo

Speciifica il tipo di indice.

Supportato: hnsw o ivfflat

Impostazione predefinita: HNSW (patch del motore 3.0.4574 in poi)

dimensions

obbligatorio

integer

Speciifica il numero di dimensioni nei dati vettoriali.

Massimo 2.000 dimensioni.

similarity

obbligatorio

string

Specifica la metrica della distanza utilizzata per il calcolo della somiglianza.

  • euclidean

  • cosine

  • dotProduct

lists

richiesto per IVFFlat

integer

Speciifica il numero di cluster utilizzati dall'IVFFlatindice per raggruppare i dati vettoriali. L'impostazione consigliata è il numero di documenti/1000 per un massimo di 1 milione di documenti e per oltre 1 milione di documenti. sqrt(# of documents)

Minimo: 1

Massimo: fai riferimento alla tabella dei tipi di istanza degli elenchi per istanza riportata di seguito. Caratteristiche e limitazioni

m

facoltativo

integer

Speciifica il numero massimo di connessioni per un indice HNSW

Impostazione predefinita: 16

Intervallo [2, 100]

efConstruction

facoltativo

integer

Specifica la dimensione dell'elenco dinamico dei candidati per la costruzione del grafico per HNSW l'indice.

efConstructiondeve essere maggiore o uguale a (2* m)

Impostazione predefinita: 64

Intervallo [4, 1000]

È importante impostare il valore dei sottoparametri, ad esempio lists for IVFFlat m e efConstruction for, in HNSW modo appropriato, poiché ciò influirà sulla precisione/richiamo, sui tempi di compilazione e sulle prestazioni della ricerca. Un valore di elenco più alto aumenta la velocità della query in quanto riduce il numero di vettori in ogni elenco, con conseguenti aree più piccole. Tuttavia, una dimensione dell'area più piccola può portare a più errori di richiamo, con conseguente minore precisione. InfattiHNSW, aumentando il valore m e la precisione dell'indice, si efConstruction aumentano anche i tempi e le dimensioni di costruzione dell'indice. Fare riferimento agli esempi riportati di seguito:

Examples (Esempi)

HNSW
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "hnsw", "dimensions": 3, "similarity": "euclidean", "m": 16, "efConstruction": 64 } } );
IVFFlat
db.collection.createIndex( { "vectorEmbedding": "vector" }, { "name": "myIndex", "vectorOptions": { "type": "ivfflat", "dimensions": 3, "similarity": "euclidean", "lists":1 } } )

Ottenere una definizione dell'indice

Puoi visualizzare i dettagli dei tuoi indici, inclusi gli indici vettoriali, usando il comando: getIndexes

Esempio

db.collection.getIndexes()

Output di esempio

[ { "v" : 4, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.collection" }, { "v" : 4, "key" : { "vectorEmbedding" : "vector" }, "name" : "myIndex", "vectorOptions" : { "type" : "ivfflat", "dimensions" : 3, "similarity" : "euclidean", "lists" : 1 }, "ns" : "test.collection" } ]

Interrogazione dei vettori

Modello di interrogazione vettoriale

Utilizzate il seguente modello per interrogare un vettore:

db.collection.aggregate([ { $search: { "vectorSearch": { "vector": <query vector>, "path": "<vectorField>", "similarity": "<distance metric>", "k": <number of results>, "probes":<number of probes> [applicable for IVFFlat], "efSearch":<size of the dynamic list during search> [applicable for HNSW] } } } ]);
Parametro Requisito Type Descrizione Valore (i)

vectorSearch

obbligatorio

operatore

Utilizzato all'interno del comando $search per interrogare i vettori.

vector

obbligatorio

array

Indica il vettore di interrogazione che verrà utilizzato per trovare vettori simili.

path

obbligatorio

string

Definisce il nome del campo vettoriale.

k

obbligatorio

integer

Speciifica il numero di risultati restituiti dalla ricerca.

similarity

obbligatorio

string

Specifica la metrica della distanza utilizzata per il calcolo della somiglianza.

  • euclidean

  • cosine

  • dotProduct

probes

facoltativo

integer

Il numero di cluster che si desidera ispezionare tramite la ricerca vettoriale. Un valore più elevato offre una migliore capacità di richiamo a scapito della velocità. Può essere impostato sul numero di elenchi per la ricerca esatta del vicino più vicino (a quel punto il pianificatore non utilizzerà l'indice). L'impostazione consigliata per avviare la regolazione fine è. sqrt(# of lists)

Impostazione predefinita: 1

efSearch

facoltativo

integer

Speciifica la dimensione dell'elenco dinamico di candidati utilizzato dall'HNSWindice durante la ricerca. Un valore più elevato di efSearch fornisce un migliore richiamo a scapito della velocità.

Impostazione predefinita: 40

Intervallo [1, 1000]

È importante regolare con precisione il valore di efSearch (HNSW) o probes (IVFlat) per ottenere le prestazioni e la precisione desiderate. Vedi le seguenti operazioni di esempio:

HNSW
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "efSearch": 40 } } } ]);
IVFFlat
db.collection.aggregate([ { $search: { "vectorSearch": { "vector": [0.2, 0.5, 0.8], "path": "vectorEmbedding", "similarity": "euclidean", "k": 2, "probes": 1 } } } ]);

Output di esempio

L'aspetto dell'output di questa operazione è simile al seguente.

{ "_id" : ObjectId("653d835ff96bee02cad7323c"), "product_name" : "Product A", "vectorEmbedding" : [ 0.2, 0.5, 0.8 ] } { "_id" : ObjectId("653d835ff96bee02cad7323e"), "product_name" : "Product C", "vectorEmbedding" : [ 0.1, 0.2, 0.5 ] }

Caratteristiche e limitazioni

Compatibilità delle versioni

  • La ricerca vettoriale per Amazon DocumentDB è disponibile solo nei cluster basati su istanze Amazon DocumentDB 5.0.

Vettori

  • Amazon DocumentDB può indicizzare vettori fino a 2.000 dimensioni. Tuttavia, è possibile archiviare fino a 16.000 dimensioni senza un indice.

Indici

  • Per la creazione di IVFFlat indici, l'impostazione consigliata per il parametro degli elenchi è il numero di documenti/1000 per un massimo di 1 milione di documenti e sqrt(# of documents) per oltre 1 milione di documenti. A causa di un limite di memoria di lavoro, Amazon DocumentDB supporta un determinato valore massimo del parametro lists a seconda del numero di dimensioni. A titolo di riferimento, la tabella seguente fornisce i valori massimi del parametro lists per vettori di 500, 1000 e 2.000 dimensioni:

    Tipo di istanza Elenchi con 500 dimensioni Elenchi con 1000 dimensioni Elenchi con 2000 dimensioni

    t3.med

    372

    257

    150

    5r5. l

    915

    741

    511

    r5xl

    1.393

    1.196

    901

    r 5,2 xl

    5.460

    5.230

    4.788

    r 5,4 xl

    7.842

    7.599

    7.138

    r 5,8 xl

    11.220

    10.974

    10.498

    r 5,12 xl

    13.774

    13.526

    13.044

    r5,16 xl

    15.943

    15.694

    15.208

    r5.24 xl

    19.585

    19.335

    18,845

  • Nessun'altra opzione di indice come compound sparse o partial è supportata dagli indici vettoriali.

  • La creazione di indici paralleli non è supportata per l'indice. HNSW È supportata solo per l'IVFFlatindice.

Interrogazione vettoriale

  • Per le query di ricerca vettoriali, è importante ottimizzare i parametri come probes o efSearch per ottenere risultati ottimali. Più alto è il valore di probes o efSearch parametro, maggiore è il richiamo e minore è la velocità. L'impostazione consigliata per iniziare a regolare con precisione il parametro delle sonde è. sqrt(# of lists)

Best practice

Scopri le best practice per lavorare con la ricerca vettoriale in Amazon DocumentDB. Questa sezione viene continuamente aggiornata man mano che vengono identificate nuove best practice.

  • La creazione dell'indice Inverted File with Flat Compression (IVFFlat) prevede il raggruppamento e l'organizzazione dei punti dati in base alle somiglianze. Pertanto, affinché un indice sia più efficace, consigliamo di caricare almeno alcuni dati prima di creare l'indice.

  • Per le query di ricerca vettoriali, è importante ottimizzare i parametri come probes o efSearch per ottenere risultati ottimali. Più alto è il valore del efSearch parametro probes or, maggiore è il richiamo e minore è la velocità. L'impostazione consigliata per iniziare a regolare con precisione il probes parametro èsqrt(lists).

Risorse