Używanie Vertex AI Search w przypadku plików PDF (nieuporządkowanych danych) w Cloud Storage z usługi Cloud Run

1. Wprowadzenie

Omówienie

Usługa Vertex AI Search and Conversation (dawniej Generative AI App Builder) pozwala deweloperom korzystać z możliwości modeli podstawowych Google, doświadczenia w wyszukiwarce i technologii konwersacyjnej AI do tworzenia aplikacji wykorzystujących generatywną AI klasy korporacyjnej. To ćwiczenia w programie koncentrują się na korzystaniu z Vertex AI Search – w ramach tego narzędzia możesz stworzyć aplikację do wyszukiwania o wysokiej jakości w Google, korzystając z własnych danych, a następnie umieścić pasek wyszukiwania na swoich stronach lub w aplikacji.

Cloud Run to zarządzana platforma obliczeniowa, która umożliwia uruchamianie kontenerów bezpośrednio na skalowalnej infrastrukturze Google. Korzystając z opcji wdrożenia opartego na źródle, możesz wdrożyć w Cloud Run kod napisany w dowolnym języku programowania (który można umieścić w kontenerze).

W ramach tego ćwiczenia w programie utworzysz usługę Cloud Run za pomocą wdrożenia opartego na źródle, która będzie pobierać wyniki wyszukiwania nieuporządkowanej zawartości w plikach PDF w zasobniku Cloud Storage. Więcej informacji o przetwarzaniu nieuporządkowanych treści znajdziesz tutaj.

Czego się nauczysz

  • Jak utworzyć aplikację Vertex AI Search na potrzeby nieuporządkowanych danych w postaci plików PDF pozyskanych z zasobnika Cloud Storage
  • Jak utworzyć punkt końcowy HTTP za pomocą wdrożenia opartego na źródle w Cloud Run
  • Jak utworzyć konto usługi zgodnie z zasadą jak najmniejszych uprawnień dla usługi Cloud Run do wysyłania zapytań do aplikacji Vertex AI Search
  • Jak wywołać usługę Cloud Run w celu wysłania zapytania do aplikacji Vertex AI Search

2. Konfiguracja i wymagania

Wymagania wstępne

Aktywowanie Cloud Shell

  1. W konsoli Cloud kliknij Aktywuj Cloud Shell d1264ca30785e435.png.

cb81e7c8e34bc8d.png

Jeśli uruchamiasz Cloud Shell po raz pierwszy, zobaczysz ekran pośredni z opisem tej usługi. Jeśli wyświetlił się ekran pośredni, kliknij Dalej.

d95252b003979716.png

Uzyskanie dostępu do Cloud Shell i połączenie się z nim powinno zająć tylko kilka chwil.

7833d5e1c5d18f54.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i uwierzytelnianie. Większość zadań w ramach tego ćwiczenia z programowania można wykonać w przeglądarce.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się potwierdzenie, że użytkownik jest uwierzytelniony, a projekt jest ustawiony na identyfikator Twojego projektu.

  1. Uruchom to polecenie w Cloud Shell, aby potwierdzić, że jesteś uwierzytelniony:
gcloud auth list

Dane wyjściowe polecenia

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Uruchom to polecenie w Cloud Shell, aby sprawdzić, czy polecenie gcloud zna Twój projekt:
gcloud config list project

Dane wyjściowe polecenia

[core]
project = <PROJECT_ID>

Jeśli tak nie jest, możesz go ustawić za pomocą tego polecenia:

gcloud config set project <PROJECT_ID>

Dane wyjściowe polecenia

Updated property [core/project].

3. Włącz interfejsy API

Zanim zaczniesz korzystać z Vertex AI Search, musisz włączyć kilka interfejsów API.

Po pierwsze, to ćwiczenia w Codelabs wymagają użycia interfejsów Vertex AI Search and Conversation, BigQuery i Cloud Storage. Tutaj możesz włączyć te interfejsy API.

Następnie wykonaj te czynności, aby włączyć interfejs Vertex AI Search and Conversation API:

  1. W konsoli Google Cloud otwórz konsolę wyszukiwania i rozmów Vertex AI.
  2. Przeczytaj i zaakceptuj Warunki korzystania z usługi, a następnie kliknij Dalej i aktywuj interfejs API.

4. Tworzenie aplikacji do wyszukiwania nieuporządkowanych danych z Cloud Storage

  1. W konsoli Google Cloud otwórz sekcję Wyszukiwanie Strona wątku. Kliknij Nowa aplikacja.
  2. W panelu Wybierz typ aplikacji kliknij Wyszukiwanie.
  3. Aby otrzymywać odpowiedzi wyodrębnione z dokumentów, upewnij się, że funkcje Enterprisewłączone.
  4. Aby otrzymywać podsumowania wyszukiwania, upewnij się, że opcja Zaawansowane funkcje LLM jest włączona.
  5. W polu Nazwa aplikacji wpisz nazwę aplikacji. Identyfikator aplikacji pojawi się pod jej nazwą.
  6. Wybierz globalną (globalną) jako lokalizację aplikacji, a potem kliknij Dalej.
  7. W panelu Magazyny danych kliknij Utwórz nowy magazyn danych.
  8. W panelu Wybierz źródło danych kliknij Cloud Storage.
  9. W panelu Import data from GCS wybierz Folder.
  10. W polu gs:// wpisz tę wartość: cloud-samples-data/gen-app-builder/search/stanford-cs-224 Ten zasobnik Cloud Storage zawiera pliki PDF z publicznie dostępnego folderu Cloud Storage do celów testowych.
  11. Wybierz Dokumenty nieuporządkowane i kliknij Dalej.
  12. W panelu Skonfiguruj magazyn danych wybierz lokalizację globalną (globalną).
  13. Wpisz nazwę magazynu danych. Użyjesz tej nazwy w dalszej części tego ćwiczenia z programowania podczas wdrażania usługi Cloud Run. Kliknij Utwórz.
  14. W panelu Bazy danych wybierz nowy magazyn danych i kliknij Utwórz.
  15. Na stronie Dane w magazynie danych kliknij kartę Aktywność, aby sprawdzić stan przetwarzania danych. W kolumnie Stan pojawi się wartość Import zakończony.
  16. Kliknij kartę Dokumenty, aby zobaczyć liczbę zaimportowanych dokumentów.
  17. W menu nawigacyjnym kliknij Podgląd, aby przetestować wyszukiwarkę.
  18. Na pasku wyszukiwania wpisz final lab due date, a następnie naciśnij Enter, aby wyświetlić wyniki.

5. Tworzenie usługi Cloud Run

W tej sekcji utworzysz usługę Cloud Run, która będzie akceptować ciąg znaków zapytania. Ta usługa będzie korzystać z bibliotek klienta Pythona na potrzeby interfejsu Discovery Engine API. Listę innych obsługiwanych środowisk wykonawczych znajdziesz tutaj.

Utwórz kod źródłowy funkcji

Najpierw utwórz w nim katalog i dysk cd.

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

Następnie utwórz plik requirements.txt z tą zawartością:

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

Następnie utwórz plik źródłowy main.py o takiej zawartości:

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)))

Skonfiguruj zmienne środowiskowe

W tym kodzie utworzysz kilka zmiennych środowiskowych, aby poprawić czytelność poleceń gcloud używanych w tym ćwiczeniu z programowania.

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>

Utwórz konto usługi

Z tego ćwiczenia w Codelabs dowiesz się, jak utworzyć konto usługi dla usługi Cloud Run, za pomocą którego będziesz uzyskiwać dostęp do interfejsu Vertex AI Search API.

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'

Wdrażanie usługi Cloud Run

Teraz możesz użyć wdrożenia opartego na źródle, aby automatycznie konteneryzować usługę Cloud Run.

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

Potem możesz zapisać adres URL Cloud Run jako zmienną środowiskową do późniejszego użycia.

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

6. Wywoływanie usługi Cloud Run

Możesz teraz wywoływać usługę Cloud Run za pomocą ciągu zapytania, aby wysłać do What is the final lab due date? żądanie.

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

Twoje wyniki powinny wyglądać podobnie do tych poniżej:

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

7. Gratulacje!

Gratulujemy ukończenia ćwiczeń z programowania.

Zalecamy zapoznanie się z dokumentacją dotyczącą Vertex AI Search i Cloud Run.

Omówione zagadnienia

  • Jak utworzyć aplikację Vertex AI Search na potrzeby nieuporządkowanych danych w postaci plików PDF pozyskanych z zasobnika Cloud Storage
  • Jak utworzyć punkt końcowy HTTP za pomocą wdrożenia opartego na źródle w Cloud Run
  • Jak utworzyć konto usługi zgodnie z zasadą jak najmniejszych uprawnień, która pozwala usłudze Cloud Run wysyłać zapytania do aplikacji Vertex AI Search.
  • Jak wywołać usługę Cloud Run w celu wysłania zapytania do aplikacji Vertex AI Search

8. Czyszczenie danych

Aby uniknąć niezamierzonych opłat (na przykład jeśli ta funkcja w Cloud Functions została przypadkowo wywołana więcej razy niż miesięczny przydział wywołań funkcji w Cloud Functions na poziomie bezpłatnym), możesz usunąć funkcję w Cloud Functions lub projekt utworzony w kroku 2.

Aby usunąć funkcję w Cloud Functions, otwórz konsolę Cloud Functions w Cloud Functions na https://console.cloud.google.com/functions/ i usuń funkcję imagen_vqa (lub $FUNCTION_NAME w przypadku użycia innej nazwy).

Jeśli zdecydujesz się usunąć cały projekt, możesz otworzyć stronę https://console.cloud.google.com/cloud-resource-manager, wybrać projekt utworzony w kroku 2 i kliknąć Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w pakiecie SDK Cloud. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom polecenie gcloud projects list.