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.
Eingabedatenspeicher und Dateiorganisation
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_root
platziert 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 Eintrags wird durch das Suffix des Dateinamens bestimmt und diese Formatanforderungen werden beschrieben. Siehe Datendateiformate.
- Jeder Datensatz sollte eine
id
, einen Featurevektor und Ihre optionalen Felder enthalten, die von Vertex AI Feature Store unterstützt werden, z. B. Einschränkungen und Mengenbeschränkungen. - Ein Unterverzeichnis namens
delete
kann vorhanden sein. Jede Datei direkt unterbatch_root
/delete
wird als Textdatei mitid
-Datensätzen mit einerid
in jeder Zeile betrachtet. - Alle anderen Verzeichnisse und Dateien werden ignoriert.
Eingabedatenverarbeitung
- Alle Datensätze aus allen Datendateien, einschließlich der Datensätze unter
delete
, bestehen aus einem einzelnen Einabebatch. - 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 zu löschenden Datendatei 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.
Hier ist ein JSON-Beispiel:
{"id": "1", "embedding": [1,1,1]}
{"id": "2", "embedding": [2,2,2]}
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 ein
embedding
-Feld enthalten, das ein Array vonN
-Gleitkommazahlen ist, die den Featurevektor darstellen, wobeiN
die Dimension des Featurevektors ist, der konfiguriert wurde, wenn der Index erstellt wurde. - Ein optionales
restricts
-Feld kann eingeschlossen werden, das ein Array vonTokenNamespace
-Objekten in Einschränkungen angibt. Für jedes Objekt:- Geben Sie ein
namespace
-Feld an, das dasTokenNamespace.namespace
ist. - Ein optionales
allow
-Feld kann auf ein Array von Strings gesetzt werden, das die Liste vonTokenNamespace.string_tokens
ist. - Ein optionales
deny
-Feld kann auf ein Array von Strings gesetzt werden, das die Liste vonTokenNamespace.string_blacklist_tokens
ist. - 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 vonNumericRestrictNamespace
angibt. Für jedes Objekt:- Geben Sie ein
namespace
-Feld an, das dasNumericRestrictNamespace.namespace
ist. - Eines der Wertfelder
value_int
,value_float
undvalue_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.
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": "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
- 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 stellen die nächsten
N
-Werte den Featurevektor dar, wobeiN
die Dimension des Featurevektors ist, der beim Erstellen des Index konfiguriert wurde. - Featurevektorwerte müssen Gleitkommaliterale sein, wie in der Java-Sprachspezifikation definiert.
- Zusätzliche Werte können das Format
name=value
haben. - Der Name
crowding_tag
wird 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=blue
fü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=!red
für diesenTokenNamespace
:{ "namespace": "color" "string_blacklist_tokens": ["red"] }
#name=numericValue
-Paare mit Zahlentyp-Suffix werden als numerische Namespace-Einschränkungen interpretiert. Das Zahlentypsuffix isti
für Ganzzahl,f
für Gleitkommazahl undd
für Double. Derselbe Name sollte nicht wiederholt werden, da jedem Namespace ein einzelner Wert zugeordnet sein sollte.Beispielsweise steht
#size=3i
für diesenNumericRestrictNamespace
:{ "namespace": "size" "value_int": 3 }
#ratio=0.1f
steht für dieseNumericRestrictNamespace
:{ "namespace": "ratio" "value_float": 0.1 }
#weight=0.3d
steht für dieseNumericRestriction
:{ "namespace": "weight" "value_double": 0.3 }