Vertex AI Search für PDFs (unstrukturierte Daten) in Cloud Storage aus einem Cloud Run-Dienst verwenden

1. Einführung

Übersicht

Mit Vertex AI Search and Conversation (früher „Generative AI App Builder“) können Entwickler mithilfe der Foundation Models, der Suchkompetenz und der Conversational AI-Technologien von Google Generative AI-Anwendungen für Unternehmen erstellen. In diesem Codelab geht es um die Verwendung von Vertex AI Search. Sie können damit eine Suchanwendung in Google-Qualität mit Ihren eigenen Daten erstellen und eine Suchleiste in Ihre Webseiten oder App einbetten.

Cloud Run ist eine verwaltete Computing-Plattform, mit der Sie Container direkt auf der skalierbaren Google-Infrastruktur ausführen können. Mit der Option für die quellbasierte Bereitstellung können Sie in Cloud Run Code in einer beliebigen Programmiersprache bereitstellen, der in einen Container eingefügt werden kann.

In diesem Codelab erstellen Sie mit der quellbasierten Bereitstellung einen Cloud Run-Dienst, um Suchergebnisse für unstrukturierte Inhalte in PDF-Dateien in einem Cloud Storage-Bucket abzurufen. Weitere Informationen zum Aufnehmen unstrukturierter Inhalte

Aufgaben in diesem Lab

  • Vertex AI Search-Anwendung für unstrukturierte Daten als PDFs erstellen, die aus einem Cloud Storage-Bucket aufgenommen wurden
  • HTTP-Endpunkt mit quellbasierter Bereitstellung in Cloud Run erstellen
  • Dienstkonto nach dem Prinzip der geringsten Berechtigung erstellen, damit der Cloud Run-Dienst die Vertex AI Search-Anwendung abfragen kann
  • Cloud Run-Dienst aufrufen, um die Vertex AI Search-Anwendung abzufragen

2. Einrichtung und Anforderungen

Voraussetzungen

Cloud Shell aktivieren

  1. Klicken Sie in der Cloud Console auf Cloud Shell aktivieren d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Wenn Sie Cloud Shell zum ersten Mal starten, wird ein Zwischenbildschirm mit einer Beschreibung der Funktion angezeigt. Wenn ein Zwischenbildschirm angezeigt wird, klicken Sie auf Weiter.

d95252b003979716.png

Die Bereitstellung und Verbindung mit Cloud Shell dauert nur einen Moment.

7833d5e1c5d18f54.png

Diese virtuelle Maschine verfügt über alle erforderlichen Entwicklertools. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und wird in Google Cloud ausgeführt. Dadurch werden die Netzwerkleistung und die Authentifizierung erheblich verbessert. Viele, wenn nicht sogar alle Arbeiten in diesem Codelab können mit einem Browser erledigt werden.

Sobald Sie mit Cloud Shell verbunden sind, sollten Sie sehen, dass Sie authentifiziert sind und das Projekt auf Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob Sie authentifiziert sind:
gcloud auth list

Befehlsausgabe

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Führen Sie in Cloud Shell den folgenden Befehl aus, um zu prüfen, ob der gcloud-Befehl Ihr Projekt kennt:
gcloud config list project

Befehlsausgabe

[core]
project = <PROJECT_ID>

Ist dies nicht der Fall, können Sie die Einstellung mit diesem Befehl vornehmen:

gcloud config set project <PROJECT_ID>

Befehlsausgabe

Updated property [core/project].

3. APIs aktivieren

Bevor Sie Vertex AI Search verwenden können, müssen Sie mehrere APIs aktivieren.

Für dieses Codelab müssen zuerst die Vertex AI Search and Conversation, BigQuery und Cloud Storage APIs verwendet werden. Sie können diese APIs hier aktivieren.

Führen Sie dann die folgenden Schritte aus, um die Vertex AI Search and Conversation API zu aktivieren:

  1. Rufen Sie in der Google Cloud Console die Vertex AI Search and Conversation Console auf.
  2. Lesen und akzeptieren Sie die Nutzungsbedingungen, klicken Sie dann auf „Weiter“ und aktivieren Sie die API.

4. Suchanwendung für unstrukturierte Daten aus Cloud Storage erstellen

  1. Rufen Sie in der Google Cloud Console den Bereich Suchen und Seite „Unterhaltung“ Klicken Sie auf Neue App.
  2. Wählen Sie im Bereich Anwendungstyp auswählen die Option Suchen aus.
  3. Um Antworten zu erhalten, die wortwörtlich aus Ihren Dokumenten extrahiert werden, müssen die Unternehmensfunktionen aktiviert sein.
  4. Die Option Erweiterte LLM-Features muss aktiviert sein, damit die Zusammenfassung der Suche verwendet werden kann.
  5. Geben Sie in das Feld App-Name einen Namen für die App ein. Ihre App-ID wird unter dem App-Namen angezeigt.
  6. Wählen Sie als Standort für Ihre App global (Global) aus und klicken Sie dann auf Weiter.
  7. Klicken Sie im Bereich Datenspeicher auf Neuen Datenspeicher erstellen.
  8. Wählen Sie im Bereich Datenquelle auswählen die Option Cloud Storage aus.
  9. Achten Sie darauf, dass im Bereich Daten aus GCS importieren die Option Ordner ausgewählt ist.
  10. Geben Sie in das Feld gs:// den folgenden Wert ein: cloud-samples-data/gen-app-builder/search/stanford-cs-224. Dieser Cloud Storage-Bucket enthält PDF-Dateien aus einem öffentlich verfügbaren Cloud Storage-Ordner zu Testzwecken.
  11. Wählen Sie Unstrukturierte Dokumente aus und klicken Sie dann auf Weiter.
  12. Wählen Sie im Bereich Datenspeicher konfigurieren als Standort für den Datenspeicher global (Global) aus.
  13. Geben Sie einen Namen für den Datenspeicher ein. Sie werden diesen Namen später in diesem Codelab verwenden, wenn Sie Ihren Cloud Run-Dienst bereitstellen. Klicken Sie auf Erstellen.
  14. Wählen Sie im Bereich Datenspeicher den neuen Datenspeicher aus und klicken Sie auf Erstellen.
  15. Klicken Sie auf der Seite Daten des Datenspeichers auf den Tab Aktivität, um den Status der Datenaufnahme zu sehen. Wenn der Import abgeschlossen ist, wird in der Spalte „Status“ der Eintrag Import abgeschlossen angezeigt.
  16. Klicken Sie auf den Tab Dokumente, um die Anzahl der importierten Dokumente zu sehen.
  17. Klicken Sie im Navigationsmenü auf Vorschau, um die Such-App zu testen.
  18. Geben Sie in der Suchleiste final lab due date ein und drücken Sie die Eingabetaste, um die Ergebnisse anzusehen.

5. Cloud Run-Dienst erstellen

In diesem Abschnitt erstellen Sie einen Cloud Run-Dienst, der einen Abfragestring für Ihre Suchbegriffe akzeptiert. Dieser Dienst verwendet die Python-Clientbibliotheken für die Discovery Engine API. Informationen zu anderen unterstützten Laufzeiten finden Sie hier.

Quellcode für die Funktion erstellen

Erstellen Sie zunächst ein Verzeichnis und speichern Sie das Verzeichnis mit cd.

mkdir docs-search-service-python && cd $_

Erstellen Sie dann eine requirements.txt-Datei mit folgendem Inhalt:

blinker==1.6.3
cachetools==5.3.1
certifi==2023.7.22
charset-normalizer==3.3.0
click==8.1.7
Flask==3.0.0
google-api-core==2.12.0
google-auth==2.23.3
google-cloud-discoveryengine==0.11.2
googleapis-common-protos==1.61.0
grpcio==1.59.0
grpcio-status==1.59.0
idna==3.4
importlib-metadata==6.8.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
numpy==1.26.1
proto-plus==1.22.3
protobuf==4.24.4
pyasn1==0.5.0
pyasn1-modules==0.3.0
requests==2.31.0
rsa==4.9
urllib3==2.0.7
Werkzeug==3.0.1
zipp==3.17.0

Erstellen Sie als Nächstes eine main.py-Quelldatei mit folgendem Inhalt:

from typing import List
import json
import os
from flask import Flask
from flask import request

app = Flask(__name__)

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1 as discoveryengine

project_id = os.environ.get('PROJECT_ID')
location = "global"  # Values: "global", "us", "eu"
data_store_id = os.environ.get('SEARCH_ENGINE_ID')

print(project_id)
print(data_store_id)

@app.route("/")
def search_storage():

    search_query = request.args.get("searchQuery")

    result = search_sample(project_id, location, data_store_id, search_query)
    return result

def search_sample(
    project_id: str,
    location: str,
    data_store_id: str,
    search_query: str,
) -> str:
    #  For more information, refer to:
    # https://cloud.google.com/generative-ai-app-builder/docs/locations#specify_a_multi-region_for_your_data_store
    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    # Create a client
    client = discoveryengine.SearchServiceClient(client_options=client_options)

    # The full resource name of the search engine serving config
    # e.g. projects/{project_id}/locations/{location}/dataStores/{data_store_id}/servingConfigs/{serving_config_id}
    serving_config = client.serving_config_path(
        project=project_id,
        location=location,
        data_store=data_store_id,
        serving_config="default_config",
    )

    # Optional: Configuration options for search
    # Refer to the `ContentSearchSpec` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest.ContentSearchSpec
    content_search_spec = discoveryengine.SearchRequest.ContentSearchSpec(
        # For information about snippets, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/snippets
        snippet_spec=discoveryengine.SearchRequest.ContentSearchSpec.SnippetSpec(
            return_snippet=True
        ),
        # For information about search summaries, refer to:
        # https://cloud.google.com/generative-ai-app-builder/docs/get-search-summaries
        summary_spec=discoveryengine.SearchRequest.ContentSearchSpec.SummarySpec(
            summary_result_count=5,
            include_citations=True,
            ignore_adversarial_query=True,
            ignore_non_summary_seeking_query=True,
        ),
    )


    # Refer to the `SearchRequest` reference for all supported fields:
    # https://cloud.google.com/python/docs/reference/discoveryengine/latest/google.cloud.discoveryengine_v1.types.SearchRequest
    request = discoveryengine.SearchRequest(
        serving_config=serving_config,
        query=search_query,
        page_size=10,
        content_search_spec=content_search_spec,
        query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec(
            condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO,
        ),
        spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec(
            mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO
        ),
    )

    response = client.search(request)

    return response.summary.summary_text

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Umgebungsvariablen einrichten

In diesem Code erstellen Sie einige Umgebungsvariablen, um die Lesbarkeit der gcloud-Befehle in diesem Codelab zu verbessern.

PROJECT_ID=$(gcloud config get-value project)

SERVICE_NAME="search-storage-pdfs-python"
SERVICE_REGION="us-central1"

# update with your data store name
SEARCH_ENGINE_ID=<your-data-store-name>

Dienstkonto erstellen

In diesem Codelab erfahren Sie, wie Sie ein Dienstkonto für den Cloud Run-Dienst erstellen, um auf die Vertex AI Search API zuzugreifen.

SERVICE_ACCOUNT="cloud-run-vertex-ai-search"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run Vertex AI Search service account"

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role='roles/discoveryengine.editor'

Cloud Run-Dienst bereitstellen

Jetzt können Sie eine quellbasierte Bereitstellung verwenden, um Ihren Cloud Run-Dienst automatisch in Container zu verlagern.

gcloud run deploy $SERVICE_NAME \
--region=$SERVICE_REGION \
--source=. \
--service-account $SERVICE_ACCOUNT \
--update-env-vars SEARCH_ENGINE_ID=$SEARCH_ENGINE_ID,PROJECT_ID=$PROJECT_ID \
--no-allow-unauthenticated

Dann können Sie die Cloud Run-URL als Umgebungsvariable speichern, um sie später zu verwenden.

ENDPOINT_URL="$(gcloud run services describe $SERVICE_NAME --region=$SERVICE_REGION --format='value(status.url)')"

6. Cloud Run-Dienst aufrufen

Sie können jetzt den Cloud Run-Dienst mit einem Abfragestring aufrufen, um What is the final lab due date? anzufordern.

curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "$ENDPOINT_URL?searchQuery=what+is+the+final+lab+due+date"

Die Ergebnisse sollten in etwa so aussehen:

The final lab is due on Tuesday, March 21 at 4:30 PM [1].

7. Glückwunsch!

Herzlichen Glückwunsch zum Abschluss des Codelabs!

Wir empfehlen, die Dokumentation zu Vertex AI Search und Cloud Run zu lesen.

Behandelte Themen

  • Vertex AI Search-Anwendung für unstrukturierte Daten als PDFs erstellen, die aus einem Cloud Storage-Bucket aufgenommen wurden
  • HTTP-Endpunkt mit quellbasierter Bereitstellung in Cloud Run erstellen
  • Anleitung zum Erstellen eines Dienstkontos nach dem Prinzip der geringsten Berechtigung für den Cloud Run-Dienst, um die Vertex AI Search-Anwendung abzufragen.
  • Cloud Run-Dienst aufrufen, um die Vertex AI Search-Anwendung abzufragen

8. Bereinigen

Um versehentliche Gebühren zu vermeiden, z. B. wenn diese Cloud Functions-Funktion versehentlich häufiger aufgerufen wird als Ihre monatliche Zuweisung von Cloud Functions-Aufrufen in der kostenlosen Stufe, können Sie entweder die Cloud Functions-Funktion oder das in Schritt 2 erstellte Projekt löschen.

Rufen Sie zum Löschen der Cloud Functions-Funktion die Cloud Console unter https://console.cloud.google.com/functions/ auf und löschen Sie die Funktion imagen_vqa (oder $FUNCTION_NAME, falls Sie einen anderen Namen verwendet haben).

Wenn Sie das gesamte Projekt löschen möchten, rufen Sie https://console.cloud.google.com/cloud-resource-manager auf, wählen Sie das in Schritt 2 erstellte Projekt aus und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie die Projekte in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit dem Befehl gcloud projects list aufrufen.