Per creare un nuovo indice o aggiornarne uno esistente, fornisci i vettori a Ricerca vettoriale nel formato e nella struttura descritti nelle sezioni seguenti.
Prerequisiti
Archivia i dati di input in un bucket Cloud Storage, nel tuo Google Cloud progetto.
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 inseriti direttamente in
batch_roote denominati con i seguenti suffissi:.csv,.jsone.avro. - Nella directory principale del batch è presente un limite di 5000 oggetti (file).
- Ogni file di dati viene interpretato come un insieme di record. Il formato del record è determinato dal suffisso del nome file e i requisiti di formato sono descritti. Consulta Formati dei file di dati.
- Ogni record deve avere un
id, un vettore di caratteristiche e i campi facoltativi supportati da Gemini Enterprise Agent Platform Feature Store, come restricts e crowding. - Potrebbe essere presente una sottodirectory denominata
delete. Ogni file direttamente inbatch_root/deleteviene considerato un file di testo di recordidcon unidin ogni riga. - Tutte le altre sottodirectory non sono consentite.
- La transcodifica dei file compressi con gzip non è supportata come dati di input.
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'ordinamento relativo dei record all'interno di un file di dati non è importante.
- Un singolo ID deve essere visualizzato una sola volta in un batch. Se è presente un duplicato con lo stesso ID, viene visualizzato come un conteggio di vettori.
- 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 delete vengono rimossi dalla versione dell'indice successiva.
- I record dei file di dati normali sono inclusi nella versione successiva, sovrascrivendo un valore in una versione dell'indice precedente.
Di seguito sono riportati esempi di incorporamenti densi, sparsi e ibridi:
Incorporamenti densi:
{"id": "1", "embedding": [1,1,1]} {"id": "2", "embedding": [2,2,2]}Incorporamenti sparsi:
{"id": "3", "sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1, 4]}} {"id": "4", "sparse_embedding": {"values": [-0.4, 0.2, -1.3], "dimensions": [10, 20, 20]}}Incorporamenti ibridi:
{"id": "5", "embedding": [5, 5, -5], "sparse_embedding": {"values": [0.1], "dimensions": [500]}} {"id": "6", "embedding": [6, 7, -8.1], "sparse_embedding": {"values": [0.1, -0.2], "dimensions": [40, 901]}}
Di seguito è riportato un esempio di organizzazione valida dei file di dati di input:
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 record da eliminare dalla versione dell'indice successiva.
Formati dei 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
idper specificare l'ID del vettore. - Ogni record deve contenere almeno uno tra
embeddingosparse_embedding. - Il campo
embeddingè un array diNnumeri con virgola mobile che rappresenta il vettore di caratteristiche, doveNè la dimensione del vettore di caratteristiche configurata al momento della creazione dell'indice. Questo campo può essere utilizzato solo per gli incorporamenti densi.configs.dimensions, specificato al momento della creazione dell'indice, deve avere la stessa lunghezza diembeddings.configs.dimensionssi applica solo aembedding, non asparse_embedding.
- Il campo
sparse_embeddingè un oggetto con i campivaluesedimensions. Il campovaluesè un elenco di numeri con virgola mobile che rappresenta il vettore di caratteristiche e il campodimensionsè un elenco di numeri interi che rappresenta la dimensione in cui si trova il valore corrispondente. Ad esempio, un incorporamento sparso che assomiglia a[0,0.1,0,0,0.2]può essere rappresentato come"sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1,4]}. Questo campo può essere utilizzato solo per gli incorporamenti sparsi.- La lunghezza di
sparse_embedding.valuesdeve essere uguale a quella disparse_embedding.dimensions. Non devono avere la stessa lunghezza diconfigs.dimensions, che è specificato al momento della creazione dell'indice e non applicato asparse_embedding.
- La lunghezza di
- È possibile includere un campo
restrictsfacoltativo che specifica un array di oggettiTokenNamespacein restricts. Per ogni oggetto:- Specifica un campo
namespaceche è ilTokenNamespace.namespace. - Un campo
allowfacoltativo può essere impostato su un array di stringhe che sono l'elenco diTokenNamespace.string_tokens. - Un campo
denyfacoltativo 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_restrictsfacoltativo che specifica un array diNumericRestrictNamespace. Per ogni oggetto:- Specifica un campo
namespaceche è ilNumericRestrictNamespace.namespace. - Uno dei campi valore
value_int,value_floatevalue_double. - Non deve avere un campo denominato op. Questo campo è solo per le query.
- Specifica un campo
Avro
- Utilizza un file Avro valido.
- Per rappresentare un punto dati solo sparso, fornisci un incorporamento sparso nel
sparse_embeddingcampo e inserisci un elenco vuoto nelembeddingcampo. Crea record conformi allo schema seguente:
{ "type": "record", "name": "FeatureVector", "fields": [ { "name": "id", "type": "string" }, { "name": "embedding", "type": { "type": "array", "items": "float" } }, { "name": "sparse_embedding", "type": [ "null", { "type": "record", "name": "sparse_embedding", "fields": [ { "name": "values", "type": { "type": "array", "items": "float" } }, { "name": "dimensions", "type": { "type": "array", "items": "long" } } ] } ] }, { "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
- Formato:
ID,N feature vector values,Any number of dimension:value sparse values,name=value lists - Codifica il file CSV utilizzando UTF-8.
- Ogni riga del file CSV deve contenere esattamente un record.
- Il primo valore di ogni riga deve essere l'ID del vettore, che deve essere una stringa UTF-8 valida.
- Dopo l'ID, deve essere specificato almeno un incorporamento denso o sparso.
- Per un incorporamento denso, i successivi
Nvalori rappresentano il vettore di caratteristiche, doveNè la dimensione del vettore di caratteristiche configurata al momento della creazione dell'indice. - Per un incorporamento sparso, è possibile specificare un numero qualsiasi di
dimension:value, in cuivalueviene analizzato come float edimensionviene analizzato comelong. - Per un incorporamento ibrido con incorporamenti densi e sparsi, gli incorporamenti densi devono essere specificati prima degli incorporamenti sparsi.
- I valori del vettore di caratteristiche devono essere valori letterali con virgola mobile come definiti nella specifica del linguaggio Java.
- I valori aggiuntivi possono essere nel formato
name=value. - Il nome
crowding_tagviene interpretato come il tag di affollamento e può essere visualizzato una sola volta nel record. Tutte le altre coppie
name=valuevengono interpretate come restrizioni dello spazio dei nomi dei token. Lo stesso nome può essere ripetuto se sono presenti più valori in uno spazio dei nomi.Ad esempio,
color=red,color=bluerappresenta questoTokenNamespace:{ "namespace": "color" "string_tokens": ["red", "blue"] }Se il valore inizia con
!, il resto della stringa viene interpretato come un valore escluso.Ad esempio,
color=!redrappresenta questoTokenNamespace:{ "namespace": "color" "string_blacklist_tokens": ["red"] }Le coppie
#name=numericValuecon suffisso di tipo numerico vengono interpretate come restrizioni dello spazio dei nomi numerico. Il suffisso di tipo numerico èiper int,fper float edper double. Lo stesso nome non deve essere ripetuto perché deve essere associato un singolo valore per spazio dei nomi.Ad esempio,
#size=3irappresenta questoNumericRestrictNamespace:{ "namespace": "size" "value_int": 3 }#ratio=0.1frappresenta questoNumericRestrictNamespace:{ "namespace": "ratio" "value_float": 0.1 }#weight=0.3drappresenta questaNumericRestriction:{ "namespace": "weight" "value_double": 0.3 }L'esempio seguente è un punto dati con
id: "6",embedding: [7, -8.1],sparse_embedding: {values: [0.1, -0.2, 0.5], dimensions: [40, 901, 1111]}, tag di affollamentotest, elenco consentiti di tokencolor: red, blue, elenco non consentiti di tokencolor: purplee restrizione numerica diratiocon float0.1:6,7,-8.1,40:0.1,901:-0.2,1111:0.5,crowding_tag=test,color=red,color=blue,color=!purple,ratio=0.1f
Passaggi successivi
- Scopri come creare e gestire l'indice