Tutorial sulle funzioni remote e sull'API Translation

Questo tutorial descrive come creare una funzione remota BigQuery, richiamare l'API Cloud Translation ed eseguire la traduzione dei contenuti da qualsiasi lingua allo spagnolo utilizzando SQL e Python.

Ecco alcuni casi d'uso di questa funzione:

  • Tradurre i commenti degli utenti su un sito web nella lingua locale
  • Traduci le richieste di assistenza da molte lingue in un'unica lingua comune per i lavoratori dei casi di assistenza

Obiettivi

  • Assegna i ruoli necessari al tuo account.
  • Creare una funzione Cloud Functions.
  • Creare un set di dati BigQuery.
  • Creare una connessione e un account di servizio BigQuery.
  • Concedi le autorizzazioni all'account di servizio BigQuery.
  • Creare una funzione remota BigQuery.
  • Chiama la funzione remota di BigQuery.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

Ti consigliamo di creare un progetto Google Cloud per questo tutorial. Inoltre, assicurati di disporre dei ruoli richiesti per completare questo tutorial.

Configura un progetto Google Cloud

Per configurare un progetto Google Cloud per questo tutorial, completa questi passaggi:

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API BigQuery, BigQuery Connection, Cloud Translation, Cloud Functions, Cloud Build, Cloud Logging, Cloud Pub/Sub, Artifact Registry, and Cloud Run Admin.

    Abilita le API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API BigQuery, BigQuery Connection, Cloud Translation, Cloud Functions, Cloud Build, Cloud Logging, Cloud Pub/Sub, Artifact Registry, and Cloud Run Admin.

    Abilita le API

Ruoli richiesti per il tuo account

Per ottenere le autorizzazioni necessarie per eseguire le attività in questo tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM sul tuo progetto:

Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.

Questi ruoli predefiniti contengono le autorizzazioni necessarie per eseguire le attività in questo tutorial. Per visualizzare le autorizzazioni esatte necessarie, espandi la sezione Autorizzazioni richieste:

Autorizzazioni obbligatorie

Per eseguire le attività di questo tutorial sono necessarie le autorizzazioni seguenti:

  • bigquery.datasets.create
  • bigquery.connections.create
  • bigquery.connections.get
  • cloudfunctions.functions.create

Potresti anche essere in grado di ottenere queste autorizzazioni con i ruoli personalizzati o altri ruoli predefiniti.

Ruoli obbligatori per l'account di servizio predefinito di Compute Engine

Quando hai abilitato l'API per Cloud Functions, è stato creato un account di servizio predefinito di Compute Engine. Per completare questo tutorial, devi concedere a questo account di servizio predefinito il ruolo Utente API Cloud Translation.

  1. Recupera l'ID assegnato al progetto.

  2. Copia il tuo account di servizio predefinito di Compute Engine. Il tuo account di servizio predefinito ha il seguente aspetto:

    PROJECT_NUMBER[email protected]
    

    Sostituisci PROJECT_NUMBER con l'ID progetto.

  3. Nella console Google Cloud, vai alla pagina IAM.

    Vai a IAM

  4. Seleziona il progetto.

  5. Fai clic su Concedi l'accesso e nel campo Nuove entità incolla l'account di servizio predefinito di Compute Engine che hai copiato in precedenza.

  6. Nell'elenco Assegna ruoli, cerca e seleziona Utente API Cloud Translation.

  7. Fai clic su Salva.

crea una funzione Cloud Functions

Utilizzando Cloud Functions, crea una funzione che traduce il testo di input in spagnolo.

  1. Crea una funzione Cloud Functions con le seguenti specifiche:

    • Per Ambiente, seleziona 2a generazione.
    • In Nome funzione, inserisci translation-handler.
    • In Regione, seleziona us-central1.
    • In Numero massimo di istanze, inserisci 10.

      Questa impostazione si trova nella sezione Impostazioni di runtime, build, connessioni e sicurezza.

      In questo tutorial utilizziamo un valore inferiore a quello predefinito per controllare la tasso di richieste inviate a Translation.

    • Per Runtime, seleziona Python 3.10.

    • In Punto di ingresso, inserisci handle_translation.

  2. Nell'elenco dei file, seleziona main.py e incolla il codice seguente.

    Prima di provare questo esempio, segui le istruzioni di configurazione di Python disponibili nella guida rapida di BigQuery sull'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API BigQuery Python.

    Per eseguire l'autenticazione in BigQuery, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

    from __future__ import annotations
    
    
    import flask
    import functions_framework
    from google.api_core.retry import Retry
    from google.cloud import translate
    
    # Construct a Translation Client object
    translate_client = translate.TranslationServiceClient()
    
    
    # Register an HTTP function with the Functions Framework
    @functions_framework.http
    def handle_translation(request: flask.Request) -> flask.Response:
        """BigQuery remote function to translate input text.
    
        Args:
            request: HTTP request from BigQuery
            https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#input_format
    
        Returns:
            HTTP response to BigQuery
            https://cloud.google.com/bigquery/docs/reference/standard-sql/remote-functions#output_format
        """
        try:
            # Parse request data as JSON
            request_json = request.get_json()
            # Get the project of the query
            caller = request_json["caller"]
            project = extract_project_from_caller(caller)
            if project is None:
                return flask.make_response(
                    flask.jsonify(
                        {
                            "errorMessage": (
                                'project can\'t be extracted from "caller":' f" {caller}."
                            )
                        }
                    ),
                    400,
                )
            # Get the target language code, default is Spanish ("es")
            context = request_json.get("userDefinedContext", {})
            target = context.get("target_language", "es")
    
            calls = request_json["calls"]
            translated = translate_text([call[0] for call in calls], project, target)
    
            return flask.jsonify({"replies": translated})
        except Exception as err:
            return flask.make_response(
                flask.jsonify({"errorMessage": f"Unexpected error {type(err)}:{err}"}),
                400,
            )
    
    
    def extract_project_from_caller(job: str) -> str:
        """Extract project id from full resource name of a BigQuery job.
    
        Args:
            job: full resource name of a BigQuery job, like
              "//bigquery.googleapi.com/projects/<project>/jobs/<job_id>"
    
        Returns:
            project id which is contained in the full resource name of the job.
        """
        path = job.split("/")
        return path[4] if len(path) > 4 else None
    
    
    def translate_text(
        calls: list[str], project: str, target_language_code: str
    ) -> list[str]:
        """Translates the input text to specified language using Translation API.
    
        Args:
            calls: a list of input text to translate.
            project: the project where the translate service will be used.
            target_language_code: The ISO-639 language code to use for translation
              of the input text. See
              https://cloud.google.com/translate/docs/advanced/discovering-supported-languages-v3#supported-target
                for the supported language list.
    
        Returns:
            a list of translated text.
        """
        location = "<your location>"
        parent = f"projects/{project}/locations/{location}"
        # Call the Translation API, passing a list of values and the target language
        response = translate_client.translate_text(
            request={
                "parent": parent,
                "contents": calls,
                "target_language_code": target_language_code,
                "mime_type": "text/plain",
            },
            retry=Retry(),
        )
        # Convert the translated value to a list and return it
        return [translation.translated_text for translation in response.translations]
    
    

    Aggiorna <your location> con us-central1.

  3. Nell'elenco dei file, seleziona requirements.txt, quindi incolla il seguente testo:

    Flask==2.2.2
    functions-framework==3.5.0
    google-cloud-translate==3.11.1
    Werkzeug==2.3.7
    

  4. Fai clic su Esegui il deployment e attendi il deployment della funzione.

  5. Fai clic sulla scheda Trigger.

  6. Copia il valore URL di attivazione e salvalo per un secondo momento. Devi utilizzare questo URL quando crei una funzione remota BigQuery.

Crea un set di dati BigQuery

Crea un set di dati BigQuery che conterrà la funzione remota. Quando crei il set di dati, includi queste specifiche:

  • In ID set di dati, inserisci remote_function_test.
  • In Tipo di località, seleziona Più regioni.
  • Per Più regioni, seleziona Stati Uniti (più regioni negli Stati Uniti).

Crea una connessione e un account di servizio BigQuery

Crea una connessione BigQuery in modo da poter implementare una funzione remota con qualsiasi lingua supportata in Cloud Functions e Cloud Run. Quando crei una connessione, viene creato un account di servizio per quella connessione.

  1. Crea una connessione alle risorse Google Cloud con le seguenti specifiche:

    • Per Tipo di connessione, seleziona BigLake e funzioni remote (risorsa Cloud).
    • In ID connessione, inserisci remote-function-connection.
    • In Tipo di località, seleziona Più regioni.
    • Per Più regioni, seleziona Stati Uniti (più regioni negli Stati Uniti).
  2. Apri l'elenco Connessioni esterne e seleziona us.remote-function-connection.

  3. Copia l'ID account di servizio e salvalo per un secondo momento. Devi concedere le autorizzazioni a questo ID nel passaggio successivo.

Concedi le autorizzazioni all'account di servizio BigQuery

L'account di servizio che hai creato nel passaggio precedente richiede l'autorizzazione a utilizzare Cloud Run, in modo che la funzione remota BigQuery possa utilizzare la funzione Cloud Functions. Per concedere le autorizzazioni all'account di servizio, completa questi passaggi:

  1. Vai alla pagina Cloud Run.

    Vai a Cloud Run

  2. Seleziona il progetto.

  3. Seleziona la casella di controllo accanto a translation-handler.

  4. Nel riquadro Autorizzazioni, fai clic su Aggiungi entità.

  5. Nel campo Nuove entità, inserisci l'ID account di servizio che hai copiato in precedenza.

  6. Nell'elenco Assegna ruoli, cerca e seleziona Invoker di Cloud Run.

  7. Fai clic su Salva.

Crea una funzione remota BigQuery

Per utilizzare la funzione Cloud Functions che traduce il testo in spagnolo con una funzione remota BigQuery, completa i seguenti passaggi.

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'Editor query, inserisci la query seguente:

    CREATE OR REPLACE FUNCTION `remote_function_test.translate_text`(x STRING)
    RETURNS
    STRING
        REMOTE WITH CONNECTION `us.remote-function-connection`
    OPTIONS (
        endpoint = 'TRIGGER_URL',
        max_batching_rows = 10);
    

    Sostituisci TRIGGER_URL con l'URL del trigger che hai salvato in precedenza quando hai creato una funzione Cloud Functions.

  3. Fai clic su Esegui. Viene visualizzato un messaggio simile al seguente:

    This statement created a new function named
    your_project.remote_function_test.translate_text.
    

Chiamare la funzione remota di BigQuery

Dopo aver creato la funzione remota, testala per assicurarti che sia collegata alla funzione Cloud Functions e che produca i risultati previsti in spagnolo.

  1. Nell'editor query di BigQuery, inserisci la seguente query e fai clic su Esegui.

    SELECT
      remote_function_test.translate_text('This new feature is fantastic!')
        AS translated_text;
    

    I risultati sono simili ai seguenti:

    +-------------------------------------------+
    | translated_text                           |
    +-------------------------------------------+
    | ¡Esta nueva característica es fantástica! |
    +-------------------------------------------+
    
  2. (Facoltativo) Per testare la funzione remota su un set di dati pubblico, inserisci la query seguente e fai clic su Esegui. Per limitare i risultati restituiti, utilizza la clausola LIMIT.

    SELECT
        text,
        remote_function_test.translate_text(text) AS translated_text
    FROM
        (SELECT text FROM `bigquery-public-data.hacker_news.full` LIMIT 3);
    

    I risultati sono simili ai seguenti:

    +---------------------------------------------------------------------------+
    | text                            | translated_text                         |
    +---------------------------------------------------------------------------+
    | These benchmarks look good.     | Estos puntos de referencia se ven bien. |
    | Who is using Java?              | ¿Quién está usando Java?                |
    | You need more database storage. | Necesitas más almacenamiento.           |
    +---------------------------------------------------------------------------+
    

Elimina le risorse

Se non prevedi di utilizzare queste funzioni in questo progetto, puoi evitare costi aggiuntivi eliminando il progetto. Questa azione eliminerà definitivamente tutte le risorse associate al progetto.

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi