Wenn Sie einen neuen Index erstellen oder einen vorhandenen Index aktualisieren möchten, stellen Sie Vektoren für die Vektorsuche in dem Format und der Struktur zur Verfügung, die in den folgenden Abschnitten beschrieben werden.
Vorbereitung
Speichern Sie Ihre Eingabedaten in einem Cloud Storage-Bucket, in Ihrem Google Cloud Projekt.
Eingabedatendateien sollten so organisiert sein:
- Jeder Batch von Eingabedatendateien sollte sich in einem einzigen Cloud Storage-Verzeichnis befinden.
- Datendateien sollten direkt unter
batch_rootplatziert und mit den folgenden Suffixen benannt werden:.csv,.json,.avro. - Das Batchstammverzeichnis darf maximal 5.000 Objekte (Dateien) enthalten.
- Jede Datendatei wird als Sammlung von Datensätzen interpretiert. Das Format des Datensatzes wird durch das Suffix des Dateinamens bestimmt und die Formatvoraussetzungen werden beschrieben. Weitere Informationen finden Sie unter Datendateiformate.
- Jeder Datensatz sollte eine
id, einen Featurevektor und Ihre optionalen Felder enthalten, die von Gemini Enterprise Agent Platform Feature Store unterstützt werden, z. B. Einschränkungen und Mengenbeschränkungen. - Ein Unterverzeichnis namens
deletekann vorhanden sein. Jede Datei direkt unterbatch_root/deletewird als Textdatei mitid-Datensätzen mit eineridin jeder Zeile betrachtet. - Alle anderen Unterverzeichnisse sind nicht zulässig.
- Das Transcodieren von mit GZIP komprimierten Dateien wird als Eingabedaten nicht unterstützt.
Eingabedatenverarbeitung
- Alle Datensätze aus allen Datendateien, einschließlich der Datensätze unter
delete, enthalten einen einzelnen Eingabe-Batch. - Die Reihenfolge der Datensätze innerhalb einer Datendatei ist nicht wichtig.
- Eine einzelne ID sollte nur einmal in einem Batch vorkommen. Wenn dieselbe ID doppelt vorhanden ist, wird dies als ein einziger Vektor gezählt.
- Eine ID darf nicht gleichzeitig in einer regulären Datendatei und in einer delete-Datendatei enthalten sein.
- Alle IDs aus einer Datendatei unter „delete“ führen dazu, dass sie aus der nächsten Indexversion entfernt werden.
- Datensätze aus regulären Datendateien werden in die nächste Version aufgenommen, wobei ein Wert in einer älteren Indexversion überschrieben wird.
Im Folgenden finden Sie Beispiele für dichte, dünnbesetzte und hybride Einbettungen:
Dichte Einbettungen:
{"id": "1", "embedding": [1,1,1]} {"id": "2", "embedding": [2,2,2]}Dünnbesetzte Einbettungen:
{"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]}}Hybride Einbettungen:
{"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]}}
Das folgende Beispiel zeigt eine gültige Organisation einer Eingabedatendatei:
batch_root/
feature_file_1.csv
feature_file_2.csv
delete/
delete_file.txt
Die Dateien feature_file_1.csv und feature_file_2.csv enthalten Datensätze im -Format. Die Datei delete_file.txt enthält eine Liste von Datensatz-IDs, die aus der nächsten Indexversion gelöscht werden sollen.
Datendateiformate
JSON
- Codieren Sie die Datei mit UTF-8.
- Jede Zeile der JSON-Datei wird als separates JSON-Objekt interpretiert.
- Jeder Eintrag muss ein
id-Feld enthalten, um die ID des Vektors anzugeben. - Jeder Datensatz muss mindestens eines der Felder
embeddingodersparse_embeddingenthalten. - Das Feld
embeddingist ein Array vonNGleitkommazahlen, die den Featurevektor darstellen, wobeiNdie Dimension des Featurevektors ist, der konfiguriert wurde, als der Index erstellt wurde. Dieses Feld kann nur für dichte Einbettungen verwendet werden.configs.dimensions, das beim Erstellen des Index angegeben wird, muss dieselbe Länge wieembeddingshaben.configs.dimensionsgilt nur fürembedding, nicht fürsparse_embedding.
- Das Feld
sparse_embeddingist ein Objekt mit den Feldernvaluesunddimensions. Das Feldvaluesist eine Liste von Gleitkommazahlen, die den Featurevektor darstellen, und das Felddimensionsist eine Liste von Ganzzahlen, die die Dimension darstellen, in der sich der entsprechende Wert befindet. Eine dünnbesetzte Einbettung, die wie[0,0.1,0,0,0.2]aussieht, kann beispielsweise als"sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1,4]}dargestellt werden. Dieses Feld kann nur für dünnbesetzte Einbettungen verwendet werden.- Die Länge von
sparse_embedding.valuesmuss mit der Länge vonsparse_embedding.dimensionsübereinstimmen. Sie müssen nicht dieselbe Länge wieconfigs.dimensionshaben, das beim Erstellen des Index angegeben wird und nicht fürsparse_embeddinggilt.
- Die Länge von
- Ein optionales
restricts-Feld kann enthalten werden, das ein Array vonTokenNamespace-Objekten in Einschränkungen angibt. Für jedes Objekt:- Geben Sie ein
namespace-Feld an, das dasTokenNamespace.namespaceist. - Ein optionales
allow-Feld kann auf ein Array von Strings gesetzt werden, das die Liste vonTokenNamespace.string_tokensist. - Ein optionales
deny-Feld kann auf ein Array von Strings gesetzt werden, das die Liste vonTokenNamespace.string_blacklist_tokensist. - Der Wert des Felds
crowding_tag, falls vorhanden, sollte ein String sein.
- Geben Sie ein
- Ein optionales
numeric_restricts-Feld kann enthalten werden, das ein Array vonNumericRestrictNamespaceangibt. Für jedes Objekt:- Geben Sie ein
namespace-Feld an, das dasNumericRestrictNamespace.namespaceist. - Eines der Wertfelder
value_int,value_floatundvalue_double. - Es darf kein Feld mit dem Namen "op" enthalten. Dieses Feld ist nur für Abfragen vorgesehen.
- Geben Sie ein
Avro
- Verwenden Sie eine gültige Avro Datei.
- Wenn Sie einen reinen dünnbesetzten Datenpunkt darstellen möchten, geben Sie eine dünnbesetzte Einbettung im
sparse_embeddingFeld an und geben Sie eine leere Liste imembeddingFeld ein. Erstellen Sie Datensätze, die dem folgenden Schema entsprechen:
{ "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
- Format:
ID,N feature vector values,Any number of dimension:value sparse values,name=value lists - Codieren Sie die Datei mit UTF-8.
- Jede Zeile der CSV-Datei muss genau einen Datensatz enthalten.
- Der erste Wert in jeder Zeile muss die Vektor-ID sein, die ein gültiger UTF-8-String sein muss.
- Nach der ID muss mindestens eine dichte oder dünnbesetzte Einbettung angegeben werden.
- Bei einer dichten Einbettung stellen die nächsten
NWerte den Featurevektor dar, wobeiNdie Dimension des Featurevektors ist, der beim Erstellen des Index konfiguriert wurde. - Bei einer dünnbesetzten Einbettung kann eine beliebige Anzahl von
dimension:valueangegeben werden, wobeivalueals Gleitkommazahl unddimensionalslonggeparst wird. - Bei einer hybriden Einbettung mit dichten und dünnbesetzten Einbettungen müssen dichte Einbettungen vor dünnbesetzten Einbettungen angegeben werden.
- Featurevektorwerte müssen Gleitkommaliterale sein, wie in der Java-Sprachspezifikation definiert.
- Zusätzliche Werte können das Format
name=valuehaben. - Der Name
crowding_tagwird als Crowding-Tag interpretiert und darf nur einmal im Datensatz vorkommen. Alle anderen
name=value-Paare werden als Namespace-Einschränkungen interpretiert. Derselbe Name kann wiederholt werden, wenn ein Namespace mehrere Werte enthält.Beispielsweise steht
color=red,color=bluefür diesenTokenNamespace:{ "namespace": "color" "string_tokens": ["red", "blue"] }Wenn der Wert mit
!beginnt, wird der Rest des Strings als ausgeschlossener Wert interpretiert.Beispielsweise steht
color=!redfür diesenTokenNamespace:{ "namespace": "color" "string_blacklist_tokens": ["red"] }#name=numericValue-Paare mit Zahlentyp-Suffix werden als numerische Namespace-Einschränkungen interpretiert. Das Zahlentypsuffix istifür Ganzzahl,ffür Gleitkommazahl unddfür Double. Derselbe Name sollte nicht wiederholt werden, da jedem Namespace ein einzelner Wert zugeordnet sein sollte.Beispielsweise steht
#size=3ifür diesenNumericRestrictNamespace:{ "namespace": "size" "value_int": 3 }#ratio=0.1fsteht für dieseNumericRestrictNamespace:{ "namespace": "ratio" "value_float": 0.1 }#weight=0.3dsteht für dieseNumericRestriction:{ "namespace": "weight" "value_double": 0.3 }Das folgende Beispiel ist ein Datenpunkt mit
id: "6",embedding: [7, -8.1],sparse_embedding: {values: [0.1, -0.2, 0.5], dimensions: [40, 901, 1111]}, dem Crowding-Tagtest, der Token-Zulassungslistecolor: red, blue, der Token-Sperrlistecolor: purpleund der numerischen Einschränkungratiomit dem Gleitkommawert0.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