View a markdown version of this page

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 determinato punto dati confrontando le relative rappresentazioni vettoriali utilizzando metriche di distanza o somiglianza. Più i due vettori sono vicini nello spazio vettoriale, più simili sono considerati gli elementi sottostanti. 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 un database di JSON-based documenti con la potenza della ricerca vettoriale. Se desideri utilizzare i tuoi dati Amazon DocumentDB esistenti o una struttura flessibile dei dati dei documenti per creare casi d'uso di machine learning e intelligenza artificiale generativa, come esperienza di ricerca semantica, consigli sui 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 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 il corrispondente incorporamento vettoriale.

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 i metodi di indicizzazione Hierarchical Navigable Small World (HNSW) e Inverted File with Flat Compression (IVFFlat). Un indice IVFFlat separa i vettori in elenchi e successivamente cerca un sottoinsieme selezionato di quegli elenchi più vicini al vettore di query. D'altra parte, un indice HNSW organizza i dati vettoriali in un grafico a più livelli. Sebbene HNSW abbia tempi di compilazione più lenti rispetto a IVFFlat, offre migliori prestazioni di interrogazione e richiamo. A differenza di IVFFlat, HNSW non prevede alcuna fase di addestramento e consente di generare l'indice senza alcun caricamento iniziale dei dati. Per la maggior parte dei casi d'uso, utilizzate il tipo di indice HNSW per la ricerca vettoriale.

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

Modelli

Puoi 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 potrebbe generare un errore. In questi casi, usa: 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 potrebbe generare un errore. In questi casi, usa: 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 Description Valore/i

name

facoltativo

stringa

Specifica il nome dell'indice.

Carattere alfanumerico

type

facoltativo

Specifica il tipo di indice.

Supportato: hnsw o ifflat

Predefinito: HNSW (patch del motore 3.0.4574 in poi)

dimensions

obbligatorio

intero

Specifica il numero di dimensioni nei dati vettoriali.

Massimo 2.000 dimensioni.

similarity

obbligatorio

stringa

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

  • euclidean

  • cosine

  • dotProduct

lists

obbligatorio per IVFFlat

intero

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

Minimo: 1

Numero massimo: consulta la tabella degli elenchi per tipo di istanza riportata di seguito. Caratteristiche e limitazioni

m

facoltativo

intero

Specifica il numero massimo di connessioni per un indice HNSW

Impostazione predefinita: 16

Intervallo [2, 100]

efConstruction

facoltativo

intero

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

efConstructiondeve essere maggiore o uguale a (2 * m)

Impostazione predefinita: 64

Intervallo [4, 1000]

È importante impostare il valore dei sottoparametri come lists per IVFFlat m e efConstruction per HNSW in modo appropriato poiché influirà sui tempi di compilazione e sulle prestazioni della accuracy/recall ricerca. Un valore di elenco più elevato aumenta la velocità dell'interrogazione in quanto riduce il numero di vettori in ogni elenco, con conseguente riduzione delle aree. Tuttavia, una regione di dimensioni inferiori può comportare un maggior numero di errori di richiamo, con conseguente minore precisione. Per HNSW, l'aumento del valore m e della precisione, ma efConstruction aumenta anche il tempo e le dimensioni di creazione dell'indice. Fare riferimento agli esempi riportati di seguito:

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

Query sui vettori

Amazon DocumentDB supporta due operatori di ricerca vettoriale per interrogare i vettori:

Operatore di ricerca vettoriale classico

Usa 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 Tipo Description 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

stringa

Definisce il nome del campo vettoriale.

k

obbligatorio

intero

Specifica il numero di risultati restituiti dalla ricerca.

similarity

obbligatorio

stringa

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

  • euclidean

  • cosine

  • dotProduct

probes

facoltativo

intero

Il numero di cluster che desideri ispezionare con la ricerca vettoriale. Un valore più alto offre un migliore richiamo a scapito della velocità. Può essere impostato sul numero di elenchi per la ricerca esatta del vicino più vicino (a quel punto il planner non utilizzerà l'indice). L'impostazione consigliata per iniziare la messa a punto è. sqrt(# of lists)

Impostazione predefinita: 1

efSearch

facoltativo

intero

Specifica la dimensione dell'elenco dinamico di candidati utilizzato dall'indice HNSW durante la ricerca. Un valore più elevato di efSearch consente un migliore richiamo a discapito della velocità.

Impostazione predefinita: 40

Intervallo [1, 1000]

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

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

operatore $vectorSearch (disponibile in Amazon DocumentDB 8.0 e versioni successive)

Usa il seguente modello per interrogare un vettore:

db.collection.aggregate([ { "$vectorSearch": { "exact": true | false, "index": "<index-name>" [supports only HNSW index], "limit": <number-of-results> [same as k], "path": "<vector field-to-search>", "queryVector": <array-of-numbers>, "numCandidates": <number-of-candidates> [same as efSearch], } }])

Caratteristiche e limitazioni

Compatibilità delle versioni

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

Vettori

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

Indici

  • Per la creazione dell'indice IVFFlat, l'impostazione consigliata per il parametro degli elenchi è il numero di documenti per un massimo di 1 milione e documents/1000 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 degli elenchi in base al numero di dimensioni. A titolo di riferimento, la seguente tabella fornisce i valori massimi dei parametri delle liste 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

    r5.l

    915

    741

    511

    r5.xl

    1.393

    1.196

    901

    r 5.2 xl

    5.460

    5.230

    4.788

    r 5.4xl

    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

    r 5,16 xl

    15.943

    15.694

    15,208

    r 5,24 xl

    19.585

    19,335

    18.845

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

  • La creazione parallela dell'indice non è supportata per l'indice HNSW in Amazon DocumentDB 5.0.

Query vettoriale

  • Per le query di ricerca vettoriale, è importante ottimizzare i parametri, ad esempio probes efSearch per ottenere risultati ottimali. Maggiore è il valore del efSearch parametro probes o, maggiore è il richiamo e minore è la velocità. L'impostazione consigliata per iniziare la regolazione fine del 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 clustering e l'organizzazione dei punti dati in base alle somiglianze. Affinché un indice sia più efficace, carica alcuni dati prima di creare l'indice.

  • Per le query di ricerca vettoriale, è importante ottimizzare i parametri, ad esempio probes efSearch per ottenere risultati ottimali. Maggiore è il valore del efSearch parametro probes or, maggiore è il richiamo e minore è la velocità. L'impostazione consigliata per iniziare la regolazione fine del probes parametro èsqrt(lists).

Risorse