Per creare un nuovo indice o aggiornare un indice esistente, fornisci i vettori a Vector Search nel formato e nella struttura descritti nelle sezioni seguenti.
Archiviazione dei dati di input e organizzazione dei file
Prerequisito
Archivia i dati di input in un bucket Cloud Storage, nel tuo progetto Google Cloud.
I file di dati di input devono essere organizzati come segue:
- Ogni batch di file di dati di input deve trovarsi in una singola directory Cloud Storage.
- I file di dati devono essere posizionati direttamente in
batch_root
e denominati con i seguenti suffissi:.csv
,.json
e.avro
. - Esiste un limite di 5000 oggetti (file) nella directory radice del batch.
- Ogni file di dati viene interpretato come un insieme di record. Il formato del record è determinato dal suffisso del nome file e vengono descritti i requisiti di formato. Consulta Formati file di dati.
- Ogni record deve avere un
id
, un vettore di caratteristiche e i campi facoltativi supportati da Vertex AI Feature Store, come limitazioni e crowding. - Potrebbe essere presente una sottodirectory denominata
delete
. Ogni file che si trova direttamente inbatch_root
/delete
viene preso come un file di testo di recordid
con unid
per riga. - Tutte le altre directory e tutti gli altri file vengono ignorati.
Elaborazione dei dati di input
- Tutti i record di tutti i file di dati, inclusi quelli in
delete
, sono costituiti da un singolo batch di input. - L'ordine relativo dei record all'interno di un file di dati non è importante.
- Un singolo ID deve apparire una sola volta in un batch. Se esiste un duplicato con lo stesso ID, viene visualizzato un conteggio vettoriale.
- Un ID non può essere visualizzato sia in un file di dati normale sia in un file di dati di eliminazione.
- Tutti gli ID di un file di dati in fase di eliminazione ne comportano la rimozione dalla versione dell'indice successiva.
- I record dei normali file di dati sono inclusi nella versione successiva, sovrascrivendo un valore in una versione precedente dell'indice.
Ecco un esempio JSON:
{"id": "1", "embedding": [1,1,1]}
{"id": "2", "embedding": [2,2,2]}
Di seguito è riportato un esempio di organizzazione dei file di dati di input valida:
batch_root/
feature_file_1.csv
feature_file_2.csv
delete/
delete_file.txt
I file feature_file_1.csv
e feature_file_2.csv
contengono record in formato CSV. Il file delete_file.txt
contiene un elenco di ID di record da eliminare
a partire dalla versione dell'indice successiva.
Formati file di dati
JSON
- Codifica il file JSON utilizzando UTF-8.
- Ogni riga del file JSON verrà interpretata come un oggetto JSON separato.
- Ogni record deve contenere un campo
id
per specificare l'ID del vettore. - Ogni record deve contenere un campo
embedding
ovvero un array di numeri in virgola mobileN
che rappresentano il vettore di caratteristiche, doveN
è la dimensione del vettore di caratteristiche configurato al momento della creazione dell'indice. - È possibile includere un campo
restricts
facoltativo che specifica un array diTokenNamespace
oggetti nei limiti. Per ogni oggetto:- Specifica un campo
namespace
che corrisponda aTokenNamespace.namespace
. - Un campo
allow
facoltativo può essere impostato su un array di stringhe che sono l'elenco diTokenNamespace.string_tokens
. - Un campo
deny
facoltativo può essere impostato su un array di stringhe che sono l'elenco diTokenNamespace.string_blacklist_tokens
. - Il valore del campo
crowding_tag
, se presente, deve essere una stringa.
- Specifica un campo
- È possibile includere un campo
numeric_restricts
facoltativo che specifica un array diNumericRestrictNamespace
. Per ogni oggetto:- Specifica un campo
namespace
che corrisponde aNumericRestrictNamespace.namespace
. - Uno dei campi di valore
value_int
,value_float
evalue_double
. - Non deve contenere un campo denominato op. Questo campo è destinato esclusivamente alle query.
- Specifica un campo
Avro
- Utilizza un file Avro valido.
Crea record conformi al seguente schema:
{ "type": "record", "name": "FeatureVector", "fields": [ { "name": "id", "type": "string" }, { "name": "embedding", "type": { "type": "array", "items": "float" } }, { "name": "restricts", "type": [ "null", { "type": "array", "items": { "type": "record", "name": "Restrict", "fields": [ { "name": "namespace", "type": "string" }, { "name": "allow", "type": [ "null", { "type": "array", "items": "string" } ] }, { "name": "deny", "type": [ "null", { "type": "array", "items": "string" } ] } ] } } ] }, { "name": "numeric_restricts", "type": [ "null", { "type": "array", "items": { "name": "NumericRestrict", "type": "record", "fields": [ { "name": "namespace", "type": "string" }, { "name": "value_int", "type": [ "null", "int" ], "default": null }, { "name": "value_float", "type": [ "null", "float" ], "default": null }, { "name": "value_double", "type": [ "null", "double" ], "default": null } ] } } ], "default": null }, { "name": "crowding_tag", "type": [ "null", "string" ] } ] }
CSV
- Codifica il file CSV utilizzando UTF-8.
- Ogni riga del file CSV deve contenere esattamente un record.
- Il primo valore in ogni riga deve essere l'ID vettore, che deve essere una stringa UTF-8 valida.
- Dopo l'ID, i successivi valori
N
rappresentano il vettore di caratteristiche, doveN
è la dimensione del vettore di caratteristiche configurato al momento della creazione dell'indice. - I valori dei vettori di caratteristiche devono essere valori letterali con virgola mobile, come definito nelle specifiche del linguaggio Java.
- I valori aggiuntivi possono essere nel formato
name=value
. - Il nome
crowding_tag
viene interpretato come tag di crowding e può essere visualizzato solo una volta nel record. Tutte le altre coppie
name=value
vengono interpretate come restrizioni dello spazio dei nomi dei token. Lo stesso nome può essere ripetuto se ci sono più valori in uno spazio dei nomi.Ad esempio,
color=red,color=blue
rappresenta questoTokenNamespace
:{ "namespace": "color" "string_tokens": ["red", "blue"] }
Se il valore inizia con
!
, il resto della stringa viene interpretato come valore escluso.Ad esempio,
color=!red
rappresenta questoTokenNamespace
:{ "namespace": "color" "string_blacklist_tokens": ["red"] }
Le coppie
#name=numericValue
con suffisso di tipo numerico vengono interpretate come restrizioni dello spazio dei nomi numerico. Il suffisso del tipo numerico èi
per int,f
per float ed
per doppio. Lo stesso nome non deve essere ripetuto poiché dovrebbe essere associato un singolo valore per spazio dei nomi.Ad esempio,
#size=3i
rappresenta questoNumericRestrictNamespace
:{ "namespace": "size" "value_int": 3 }
#ratio=0.1f
rappresenta questoNumericRestrictNamespace
:{ "namespace": "ratio" "value_float": 0.1 }
#weight=0.3d
rappresenta questoNumericRestriction
:{ "namespace": "weight" "value_double": 0.3 }
Passaggi successivi
- Scopri come creare e gestire il tuo indice