Aktiven Index aktualisieren und neu erstellen

Übersicht

Für große Suchanfragen ist es wichtig, die Indexe zu aktualisieren, damit immer die genauesten Informationen zur Verfügung stehen. Heute können Sie Ihre Vektorsuchindexe mit einem Batch-Update aktualisieren, mit dem Sie Datenpunkte über einen Batch-Zeitplan einfügen oder löschen können. Sie können auch einen Streaming-Update durchführen, mit dem Sie Ihren Index innerhalb von Sekunden aktualisieren und abfragen können.

Darüber hinaus können Sie mit UpdateIndex wichtige Metadatenfelder wie display_name, description und labels aktualisieren. Sie können Ihrem Index auch optionale Tags hinzufügen, um die Diversifizierung der Ergebnisse oder die Filterung von Pre-Index-Abfragen zu erleichtern.

Batch-Index aktualisieren

Mit der Methode IndexService.UpdateIndex können Sie den Inhalt eines vorhandenen Index aktualisieren.

So ersetzen Sie den Inhalt eines vorhandenen Index:

  • Setzen Sie Index.metadata.contentsDeltaUri auf den Cloud Storage-URI, der die zu aktualisierenden Vektoren enthält.
  • isCompleteOverwrite auf „true“ festlegen. Wenn dies auf „true“ festgelegt ist, wird der gesamte Index vollständig mit der neuen Metadatendatei überschrieben, die Sie bereitstellen.

Wenn Sie das Feld contentsDeltaUri beim Aufruf von IndexService.UpdateIndex festlegen, können keine anderen Indexfelder (z. B. displayName, description oder userLabels) im Rahmen desselben Aufrufs aktualisiert werden.

gcloud

  1. Indexmetadatendatei aktualisieren
  2. Führen Sie den Befehl gcloud ai indexes update aus:

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • LOCAL_PATH_TO_METADATA_FILE: Der lokale Pfad zur Metadatendatei.
  • INDEX_ID: Die ID des Index.
  • LOCATION: Die Region, in der Sie Vertex AI verwenden.
  • PROJECT_ID: Ihre Google Cloud-Projekt-ID.

Führen Sie folgenden Befehl aus:

Linux, macOS oder Cloud Shell

gcloud ai indexes update INDEX_ID \
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE \
    --region=LOCATION \
    --project=PROJECT_ID

Windows (PowerShell)

gcloud ai indexes update INDEX_ID `
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE `
    --region=LOCATION `
    --project=PROJECT_ID

Windows (cmd.exe)

gcloud ai indexes update INDEX_ID ^
    --metadata-file=LOCAL_PATH_TO_METADATA_FILE ^
    --region=LOCATION ^
    --project=PROJECT_ID

REST

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • INPUT_DIR: Der Cloud Storage-Verzeichnispfad des Indexinhalts.
  • INDEX_ID: Die ID des Index.
  • LOCATION: Die Region, in der Sie Vertex AI verwenden.
  • PROJECT_ID: Ihre Google Cloud-Projekt-ID.
  • PROJECT_NUMBER: Die automatisch generierte Projektnummer Ihres Projekts.

HTTP-Methode und URL:

PATCH https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/indexes/INDEX_ID

JSON-Text anfordern:

{
 "metadata": {
   "contentsDeltaUri": "INPUT_DIR",
   "isCompleteOverwrite": true
 }
}

Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

{
 "name": "projects/PROJECT_NUMBER/locations/LOCATION/indexes/INDEX_ID/operations/OPERATION_ID",
 "metadata": {
   "@type": "type.googleapis.com/google.cloud.aiplatform.v1.UpdateIndexOperationMetadata",
   "genericMetadata": {
     "createTime": "2022-01-12T23:56:14.480948Z",
     "updateTime": "2022-01-12T23:56:14.480948Z"
   }
 }
}

Console

Folgen Sie dieser Anleitung, um einen Batchindexinhalt zu aktualisieren.

  1. Wechseln Sie im Abschnitt „Vertex AI“ der Google Cloud Console zum Abschnitt Bereitstellen und verwenden. Wählen Sie Vektorsuche

    Zur Vektorsuche

  2. Wählen Sie den Index aus, den Sie aktualisieren möchten. Die Seite Indexinformationen wird geöffnet.
  3. Klicken Sie auf Index bearbeiten. Ein Bereich zum Bearbeiten des Index wird geöffnet.
  4. Suchen Sie im Cloud Storage-Feld den Cloud Storage-Ordner, in dem Ihre Vektordaten gespeichert sind, und wählen Sie ihn aus.
  5. Optional: Klicken Sie das Kästchen zum vollständigen Überschreiben an, wenn Sie alle vorhandenen Daten überschreiben möchten.
  6. Klicken Sie auf Aktualisieren.
  7. Klicken Sie auf Fertig, um die Ansicht zu schließen.

Wenn im Index verknüpfte Bereitstellungen vorhanden sind (siehe Feld Index.deployed_indexes) und bestimmte Änderungen am ursprünglichen Index vorgenommen werden, wird der DeployedIndex im Hintergrund automatisch asynchron aktualisiert, um diese Änderungen widerzuspiegeln.

Vergleichen Sie die Endzeit des Vorgang zur Indexaktualisierung mit der DeployedIndex.index_sync_time, um zu prüfen, ob die Änderung übernommen wurde.

Streamingindex aktualisieren

Mithilfe von Streaming-Updates können Sie Ihren Index nun innerhalb weniger Sekunden aktualisieren und abfragen. Derzeit können Sie Streaming-Updates nicht für einen vorhandenen Index verwenden. Sie müssen dafür einen neuen Index erstellen. Weitere Informationen finden Sie unter Index für Streaming-Update erstellen.

Ihnen werden 0,45 $ pro GB in Rechnung gestellt, das für Streamingupdates verwendet wird. Weitere Informationen zu Preisen finden Sie auf der Seite Vertex AI – Preise. Streaming-Updates werden direkt auf die im Arbeitsspeicher bereitgestellten Indexe angewendet, die dann nach einer kurzen Verzögerung auf die Abfrageergebnisse angewendet werden.

Upserting von Datenpunkten

In diesen Beispielen wird gezeigt, wie Sie einen Datenpunkt aktualisieren. Beachten Sie, dass upsert-datapoints nur JSON im Arrayformat akzeptiert.

Python

Python

def stream_update_vector_search_index(
    project: str, location: str, index_name: str, datapoints: Sequence[dict]
) -> None:
    """Stream update an existing vector search index

    Args:
      project (str): Required. The Project ID
      location (str): Required. The region name, e.g. "us-central1"
      index_name (str): Required. The index to update. A fully-qualified index
        resource name or a index ID.  Example:
        "projects/123/locations/us-central1/indexes/my_index_id" or
        "my_index_id".
      datapoints: Sequence[dict]: Required. The datapoints to be updated. The dict
        element should be of the IndexDatapoint type.
    """
    # Initialize the Vertex AI client
    aiplatform.init(project=project, location=location)

    # Create the index instance from an existing index with stream_update
    # enabled
    my_index = aiplatform.MatchingEngineIndex(index_name=index_name)

    # Upsert the datapoints to the index
    my_index.upsert_datapoints(datapoints=datapoints)

Curl

Das Durchsatzkontingent bezieht sich auf die Datenmenge, die in einem Upsert enthalten ist. Wenn eine Datenpunkt-ID im Index vorhanden ist, wird die Einbettung aktualisiert. Andernfalls wird eine neue Einbettung hinzugefügt.

  
  DATAPOINT_ID_1=
  DATAPOINT_ID_2=
  curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
  -d '{datapoints: [{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...]},
  {datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...]}]}'
  
  

Mit der Hybridsuche, die die öffentliche Vorschau ist, werden dünnbesetzte und dichte Emebising-Darstellungen für einen Datenpunkt unterstützt. Bei einem Upsert-Vorgang wird durch das Weglassen einer dichten Einbettung die dichte Darstellung gelöscht und durch das Weglassen einer dünnbesetzten Einbettung die dünnbesetzte Darstellung.

In diesem Beispiel werden sowohl dichte als auch dünnbesetzte Einbettungen aktualisiert.

  
    curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111], "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
  
  

In diesem Beispiel werden dichte Einbettungen aktualisiert und dünnbesetzte Einbettungen entfernt.

    
      curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111", feature_vector: [0.111, 0.111]}]}'
    
  

In diesem Beispiel werden dünnbesetzte Einbettungen aktualisiert und dichte Einbettungen entfernt.

    
      curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`"  https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints -d '{datapoints: [{datapoint_id: "111",  "sparse_embedding": {"values": [111.0,111.1,111.2], "dimensions": [10,20,30]}}]}'
    
  

Console

Console

Folgen Sie dieser Anleitung, um Inhalte auf einem Streamingindex zu aktualisieren.

  1. Rufen Sie in der Cloud Console die Seite Vektorsuche auf.

    Zur Vektorsuche

  2. Wählen Sie den Index aus, den Sie aktualisieren möchten. Die Seite Indexinformationen wird geöffnet.
  3. Klicken Sie auf Index bearbeiten. Ein Bereich zum Bearbeiten des Index wird geöffnet.
  4. Wählen Sie im Bereich den Tab Upsert-Datenpunkt aus, um Inhalte hinzuzufügen.
  5. Geben Sie die Datenpunkt-ID ein.
  6. Geben Sie mindestens einen Einbettungstyp ein:
    • Dichte Einbettung: Geben Sie ein Array von kommagetrennten Gleitkommawerten ein. Die Anzahl der Werte muss mit den Indexdimensionen übereinstimmen.
    • dünnbesetzte Einbettung (öffentliche Vorschau):
      1. Geben Sie die Dimensionen der Einbettung als Array aus kommagetrennten Ganzzahlen ein. Die Anzahl der Werte muss nicht mit den Dimensionen des Index übereinstimmen.
      2. Geben Sie die Werte als Array von kommagetrennten Gleitkommawerten ein. Die Anzahl der Werte muss mit der Anzahl der dünnbesetzten Einbettungsdimensionen übereinstimmen.
  7. Optional: Um das Filtern nach Tokenbeschränkungen für diesen Datenpunkt zu aktivieren, klicken Sie auf Tokeneinschränkung hinzufügen und geben Sie dann einen Namespace und kommagetrennte Strings als Tokens ein.
  8. Optional: Wenn Sie für diesen Datenpunkt das Filtern nach numerischen Einschränkungen aktivieren möchten, klicken Sie auf Numerische Einschränkung hinzufügen, geben Sie einen Namespace ein, wählen Sie einen Zahlentyp aus und geben Sie einen Wert ein.
  9. Optional: Geben Sie einen Crowding-Tag-String ein, um viele ähnliche Ergebnisse zu vermeiden.
  10. Klicken Sie auf Upsert.
  11. Klicken Sie auf Fertig, um die Ansicht zu schließen.

Das Durchsatzkontingent bezieht sich auf die Datenmenge, die in einem Upsert enthalten ist. Wenn eine Datenpunkt-ID im Index vorhanden ist, wird die Einbettung aktualisiert. Andernfalls wird eine neue Einbettung hinzugefügt.

Dynamische Metadaten aktualisieren

Es gibt viele Gründe, warum Sie Streamingeinschränkungen oder numerische Einschränkungen aktualisieren müssen. Wenn Sie beispielsweise mit großen Datenmengen arbeiten, die sich schnell ändern, sollten Sie bestimmte Datenstreams priorisieren. Durch die direkte Aktualisierung von Einschränkungen oder numerischen Einschränkungen können Sie den Fokus in Echtzeit verfeinern und dafür sorgen, dass die wichtigsten Daten sofort verarbeitet oder hervorgehoben werden.

Sie können Datenpunkteinschränkungen und numerische Einschränkungen innerhalb eines Streamingindex direkt aktualisieren, ohne die Kosten für die vollständige Aktualisierung zu verursachen.

Um diese reinen Metadatenaktualisierungen durchzuführen, müssen Sie das Feld update_mask in die Anfrage einfügen. Der Wert von update_mask muss auf all_restricts festgelegt werden. Die in den Datenpunkten festgelegten eingeschränkten und numerischen Einschränkungswerte sollten die neuen Werte sein, die Sie in der Aktualisierung anwenden möchten.

Das folgende Beispiel zeigt, wie Sie Einschränkungen zu zwei vorhandenen Datenpunkten hinzufügen.

DATAPOINT_ID_1=
DATAPOINT_ID_2=

curl -H "Content-Type: application/json" -H "Authorization: Bearer gcloud auth print-access-token" https://${LOCATION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/indexes/${INDEX_ID}:upsertDatapoints \
-d '{datapoints:
[{datapoint_id: "'${DATAPOINT_ID_1}'", feature_vector: [...],  restricts:[{namespace: "color", allow_list: ["red"]}]},
{datapoint_id: "'${DATAPOINT_ID_2}'", feature_vector: [...],  restricts:[{namespace: "color", allow_list: ["red"]}]}
], update_mask: "all_restricts"}'

Datenpunkte entfernen

Möglicherweise müssen Sie Datenpunkte aus Ihrem Streamingindex entfernen. Sie können dazu curl oder die Google Cloud Console verwenden.

Ein wichtiger Anwendungsfall für das Löschen eines Datenpunkts aus einem Index besteht darin, die Parität zwischen dem Index und seiner realen Quelle aufrechtzuerhalten. Nehmen wir als Beispiel einen Buchhändler, der sein Buchinventar für Such- und Empfehlungszwecke mit einer Vektoreinbettung darstellt. Wenn ein Buch ausverkauft oder aus dem Lagerbestand entfernt wird, wird durch das Löschen des entsprechenden Datenpunkts aus dem Index sichergestellt, dass Suchergebnisse und Empfehlungen korrekt und auf dem neuesten Stand bleiben.

Curl


curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/{REGION}/indexes/{INDEX_ID}:removeDatapoints -d '{datapoint_ids: ["'{DATAPOINT_ID_1}'", "'{DATAPOINT_ID_2}'"]}'

Console

Console

Folgen Sie dieser Anleitung, um einen Datenpunkt aus dem Streamingindex zu löschen.

  1. Wechseln Sie im Abschnitt „Vertex AI“ der Google Cloud Console zum Abschnitt Bereitstellen und verwenden. Wählen Sie Vektorsuche

    Zur Vektorsuche

  2. Wählen Sie den Streamingindex aus, den Sie aktualisieren möchten. Die Seite Indexinformationen wird geöffnet.
  3. Klicken Sie auf Index bearbeiten. Ein Bereich zum Bearbeiten des Index wird geöffnet.
  4. Wählen Sie im Bereich den Tab Datenpunkte entfernen aus.
  5. Sie können bis zu 20 Datenpunkte hinzufügen. Geben Sie dazu eine durch Kommas getrennte Liste von Datenpunkt-IDs an.
  6. Klicken Sie auf Entfernen.
  7. Klicken Sie auf Fertig, um die Ansicht zu schließen.

Verdichtung

Der Index wird regelmäßig neu erstellt, um alle neuen Updates seit der letzten Neuerstellung zu berücksichtigen. Diese Neuerstellung oder „Verdichtung” verbessert die Abfrageleistung und -zuverlässigkeit. Verdichtungen werden sowohl für Streaming- als auch für Batch-Updates vorgenommen.

  • Streaming-Update: Die Vektorsuche verwendet heuristikbasierte Messwerte, um zu bestimmen, wann die Verdichtung ausgelöst werden soll. Wenn die ältesten nicht komprimierten Daten fünf Tage alt sind, wird immer die Verdichtung ausgelöst. Ihnen werden die Kosten für die Neuerstellung des Index zum selben Preis wie ein Batchupdate in Rechnung gestellt.

  • Batch-Aktualisierung: Tritt auf, wenn die inkrementelle Dataset-Größe > 20 % der Basis-Dataset-Größe beträgt.

Index neu erstellen und abfragen

Sie können Übereinstimmungs- oder Batchanfragen für die Übereinstimmung wie gewohnt mit der gRPC-Befehlszeile, der Clientbibliothek oder dem Vertex AI SDK für Python senden. Wenn Sie die Abfrage neu erstellen, werden die Aktualisierungen innerhalb weniger Sekunden angezeigt. Informationen zum Abfragen eines Index finden Sie unter Indexabfrage zur Ermittlung nächster Nachbarn.

Optionale Felder

Wenn Sie einen Index erstellen, können Sie einige optionale Felder verwenden, um Ihre Abfragen zu optimieren.

Upserting mit Einschränkungen

Durch ein Upserting des Index und das Hinzufügen einer Einschränkung können Sie Ihre Datenpunkte mit Tags versehen, damit sie bereits zum Zeitpunkt der Abfrage gefiltert werden. Sie können eingeschränkte Tags hinzufügen, um die Ergebnisse für Ihre Daten zu begrenzen, bevor eine Abfrage gesendet wird. Beispiel: Ein Kunde möchte eine Abfrage für einen Index ausführen, möchte jedoch, dass in den Ergebnissen nur Elemente angezeigt werden, die bei der Suche nach Schuhen mit „Rot“ übereinstimmen. Im folgenden Beispiel erfolgt ein Upserting des Index und es wird in allen roten Schuhen gefiltert, wobei blaue Schuhe ausgeschlossen werden. Dadurch wird bei der Suche in den besten Optionen aus einem großen und vielfältigen Index vor der Ausführung gefiltert.

Zusätzlich zu Tokeneinschränkungen werden in diesem Beispiel numerische Einschränkungen verwendet. In diesem Fall wird dem Datenpunkt mit einem Preis von 20, einer Länge von 0,3 und einer Breite von 0,5 zugeordnet. Zum Zeitpunkt der Abfrage können Sie diese numerischen Einschränkungen verwenden, um die Ergebnisse zu filtern, um die Abfrageergebnisse anhand der Werte für Preis, Länge und Breite zu begrenzen. Dieser Datenpunkt würde beispielsweise in einer Abfrage angezeigt werden, die nach Preis > 25, Länge < 1 und Breite < 1 filtert.

Weitere Informationen zum Filtern finden Sie unter Vektorsuche für die Indexierung.

Python

# Upsert datapoints
_TEST_DATAPOINT_1 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="3",
    feature_vector=[0.00526886899, -0.0198396724],
    restricts=[
        aiplatform_v1.types.index.IndexDatapoint.Restriction(namespace="Color", allow_list=["red"])
    ],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_int=1,
        )
    ],
)
_TEST_DATAPOINT_2 =  aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="4",
    feature_vector=[0.00526886899, -0.0198396724],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_double=0.1,
        )
    ],
    crowding_tag=aiplatform_v1.types.index.IndexDatapoint.CrowdingTag(crowding_attribute="crowding"),
)
_TEST_DATAPOINT_3 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="5",
    feature_vector=[0.00526886899, -0.0198396724],
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_float=1.1,
        )
    ],
)

_TEST_DATAPOINTS = [_TEST_DATAPOINT_1, _TEST_DATAPOINT_2, _TEST_DATAPOINT_3]

my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=_TEST_DATAPOINTS)

# Dynamic metadata update
_TEST_DATAPOINT_4 = aiplatform_v1.types.index.IndexDatapoint(
    datapoint_id="-2",
    numeric_restricts=[
        aiplatform_v1.types.index.IndexDatapoint.NumericRestriction(
            namespace="cost",
            value_float=1.1,
        )
    ],
)
my_streaming_index = my_streaming_index.upsert_datapoints(datapoints=[_TEST_DATAPOINT4], update_mask=["all_restricts"])

curl

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
  {
    datapoint_id: "'${DATAPOINT_ID_1}'",
    feature_vector: [...],
    restricts: { namespace: "color", allow_list: ["red"], deny_list: ["blue"]},
    numeric_restricts: [{namespace: "price", value_int: 20}, {namespace: "length", value_float: 0.3}, {namespace: "width", value_double: 0.5}]
  }
]}'

Upserting mit Crowding

Durch das Crowding-Tag werden ähnliche Ergebnisse begrenzt, indem die Vielfalt der Ergebnisse verbessert wird. Unter Crowding versteht man eine Einschränkung für eine Nachbarliste, die durch eine Suche nach einem Nachbarn erstellt wird, bei der nicht mehr als ein Wert einer Gruppe von Ergebnissen den gleichen Wert crowding_attribute zurückgeben muss. Angenommen, Sie möchten wieder online Schuhe kaufen. Sie möchten eine Vielzahl von Farben in den Ergebnissen sehen, möchten aber vielleicht, dass sie alle den gleichen Stil haben, z. B. Fußballschuhe. Sie können angeben, dass nicht mehr als drei Paar Schuhe mit derselben Farbe zurückgegeben werden sollen. Dazu geben Sie in Ihrer Abfrage per_crowding_attribute_num_neighbors = 3 an, vorausgesetzt, Sie geben beim Einfügen des Datenpunkts für die Farbe der Schuhe crowding_attribute an.

Dieses Feld stellt die maximal zulässige Anzahl von Übereinstimmungen mit demselben Crowding-Tag dar.

curl -H "Content-Type: application/json" -H "Authorization: Bearer `gcloud auth print-access-token`" https://${ENDPOINT}/v1/projects/${PROJECT_ID}/locations/us-central1/indexes/${INDEX_ID}:upsertDatapoints \
-d '{
datapoints: [
  {
    datapoint_id: "'${DATAPOINT_ID_1}'",
    feature_vector: [...],
    restricts: { namespace: "type", allow_list: ["cleats"]}
    crowding_tag: { crowding_attribute: "red-shoe"},
  }
]}'

Nächste Schritte