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 die Foundation Models, die Suchexpertise und die Technologien für konversationelle KI von Google nutzen, um generative KI-Anwendungen in Unternehmen zu erstellen. In diesem Codelab geht es um die Verwendung von Vertex AI Search. Damit können Sie eine Suchanwendung in Google-Qualität für Ihre eigenen Daten erstellen und eine Suchleiste auf Ihren Webseiten oder in Ihrer App einbetten.

Cloud Run ist eine verwaltete Computing-Plattform, mit der Sie Container direkt auf der skalierbaren Infrastruktur von Google ausführen können. Sie können Code, der in einer beliebigen Programmiersprache geschrieben wurde und in einen Container gepackt werden kann, mit der Option Quellcodebasierte Bereitstellung in Cloud Run bereitstellen.

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

Lerninhalte

  • So erstellen Sie eine Vertex AI Search-App für unstrukturierte Daten in Form von PDFs, die aus einem Cloud Storage-Bucket aufgenommen wurden
  • HTTP-Endpunkt mit quellcodebasierter Bereitstellung in Cloud Run erstellen
  • So erstellen Sie ein Dienstkonto nach dem Grundsatz der geringsten Berechtigung für den Cloud Run-Dienst, mit dem die Vertex AI Search-App abgefragt wird
  • Cloud Run-Dienst aufrufen, um die Vertex AI Search-App 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 Fenster mit einer Beschreibung eingeblendet. Klicken Sie in diesem Fall einfach auf Weiter.

d95252b003979716.png

Das Herstellen der Verbindung mit der Cloud Shell sollte nur wenige Augenblicke dauern.

7833d5e1c5d18f54.png

Auf dieser virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung erheblich verbessert. Die meisten, wenn nicht sogar alle Aufgaben in diesem Codelab können mit einem Browser erledigt werden.

Sobald die Verbindung mit der Cloud Shell hergestellt ist, sehen Sie, dass Sie authentifiziert sind und für das Projekt Ihre Projekt-ID eingestellt ist.

  1. Führen Sie in der 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 den folgenden Befehl in Cloud Shell aus, um zu bestätigen, dass 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 Sie zuerst die APIs für Vertex AI Search and Conversation, BigQuery und Cloud Storage verwenden. Sie können diese APIs hier aktivieren.

Folgen Sie als Nächstes dieser Anleitung, um die Vertex AI Search and Conversation API zu aktivieren:

  1. Rufen Sie in der Google Cloud Console die Vertex AI Search and Conversation-Konsole auf.
  2. Lesen und akzeptieren Sie die Nutzungsbedingungen und klicken Sie anschließend auf „Fortfahren und API aktivieren“.

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

  1. Rufen Sie in der Google Cloud Console die Seite Suche und Unterhaltung auf. Klicken Sie auf Neue App.
  2. Wählen Sie im Bereich App-Typ auswählen die Option Suche aus.
  3. Die Enterprise-Funktionen müssen aktiviert sein, damit Sie Antworten erhalten, die wortwörtlich aus Ihren Dokumenten extrahiert werden.
  4. Die Option Erweiterte LLM-Funktionen muss aktiviert sein, damit Sie eine Zusammenfassung der Suchergebnisse erhalten.
  5. Geben Sie im Feld App-Name einen Namen für Ihre App ein. Die App-ID wird unter dem App-Namen angezeigt.
  6. Wählen Sie als Standort für die Anwendung Global aus und klicken Sie 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. Im Bereich Daten aus GCS importieren muss Ordner ausgewählt sein.
  10. Geben Sie im 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 aus.
  13. Geben Sie einen Namen für den Datenspeicher ein. Sie verwenden diesen Namen später in diesem Codelab, 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 Ihres Datenspeichers auf den Tab Aktivität, um den Status der Datenaufnahme zu sehen. In der Spalte „Status“ wird Import abgeschlossen angezeigt, wenn der Importvorgang abgeschlossen ist.
  16. Klicken Sie auf den Tab Dokumente, um die Anzahl der importierten Dokumente zu sehen.
  17. Klicken Sie im Navigationsmenü auf Vorschau, um die Suchanwendung 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. Für diesen Dienst werden die Python-Clientbibliotheken für die Discovery Engine API verwendet. Hier finden Sie eine Liste der anderen unterstützten Laufzeiten.

Quellcode für die Funktion erstellen

Erstellen Sie zuerst ein Verzeichnis und wechseln Sie in dieses Verzeichnis.

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 in diesem Codelab verwendeten gcloud-Befehle 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, mit dem auf die Vertex AI Search API zugegriffen werden kann.

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 einen Container zu packen.

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

Anschließend 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 Ihren Cloud Run-Dienst jetzt mit einem Abfragestring aufrufen, um What is the final lab due date? zu fragen.

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

Ihre Ergebnisse sollten der Beispielausgabe unten ähneln:

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

  • So erstellen Sie eine Vertex AI Search-App für unstrukturierte Daten in Form von PDFs, die aus einem Cloud Storage-Bucket aufgenommen wurden
  • HTTP-Endpunkt mit quellcodebasierter Bereitstellung in Cloud Run erstellen
  • So erstellen Sie ein Dienstkonto nach dem Grundsatz der geringsten Berechtigung für den Cloud Run-Dienst, mit dem die Vertex AI Search-App abgefragt wird.
  • Cloud Run-Dienst aufrufen, um die Vertex AI Search-App abzufragen

8. Bereinigen

Um unbeabsichtigte Gebühren zu vermeiden, z. B. wenn diese Cloud Functions-Funktion versehentlich öfter aufgerufen wird als Ihre monatliche Zuweisung von Cloud Functions-Aufrufen im kostenlosen Kontingent, können Sie entweder die Cloud Functions-Funktion oder das Projekt löschen, das Sie in Schritt 2 erstellt haben.

Wenn Sie die Cloud-Funktion löschen möchten, rufen Sie die Cloud Console für Cloud Functions 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 Projekt aus, das Sie in Schritt 2 erstellt haben, und klicken Sie auf „Löschen“. Wenn Sie das Projekt löschen, müssen Sie das Projekt in Ihrem Cloud SDK ändern. Sie können die Liste aller verfügbaren Projekte mit gcloud projects list aufrufen.