La función ML.GENERATE_TEXT

En este documento, se describe la función ML.GENERATE_TEXT, que te permite realizar tareas generativas de lenguaje natural en el texto almacenado en las tablas de BigQuery. Estos son algunos ejemplos de tareas de lenguaje:

  • Clasificación
  • Análisis de opiniones
  • Extracción de entidades
  • Búsqueda de respuestas de extracción
  • Resúmenes
  • Reescritura de texto en un estilo diferente
  • Generación de texto de un anuncio
  • Creación de ideas de conceptos

La función envía solicitudes a un modelo remoto de BigQuery ML que representa uno de los modelos de base de lenguaje natural text-bison* (LLM) de Vertex AI y, luego, muestra la respuesta del LLM. Varios de los argumentos de la función proporcionan los parámetros que definen la respuesta del LLM.

El parámetro prompt proporciona el texto para que el modelo analice. El diseño de instrucciones puede afectar considerablemente las respuestas que muestra el LLM. Para obtener más información, consulta Diseña indicaciones de texto.

Sintaxis

ML.GENERATE_TEXT(
MODEL `project_id.dataset.model`,
{ TABLE `project_id.dataset.table` | (query_statement) },
STRUCT(
  [number_of_output_tokens AS max_output_tokens]
  [, top_k_value AS top_k]
  [, top_p_value AS top_p]
  [, temperature AS temperature]
  [, flatten_json_output AS flatten_json_output])
)

Argumentos

ML.GENERATE_TEXT toma los siguientes argumentos:

  • project_id: ID del proyecto

  • dataset: Es el conjunto de datos de BigQuery que contiene el modelo.

  • model: El nombre de un modelo remoto que usa uno de los text-bison* Vertex AI LLM. Para obtener más información sobre cómo crear este tipo de modelo remoto, consulta ENDPOINT.

  • table: Es el nombre de la tabla de BigQuery que contiene los datos del mensaje. El texto en la columna llamada prompt se envía al modelo. Si tu tabla no tiene una columna prompt, usa una sentencia SELECT para este argumento a fin de proporcionar un alias para una columna de tabla existente. Se produce un error si no hay una columna prompt disponible.

  • query_statement: Es la consulta de GoogleSQL que se usa para generar los datos del mensaje.

  • max_output_tokens: un valor INT64 en el rango [1,1024] que establece la cantidad máxima de tokens que genera el modelo. Especifica un valor más bajo para respuestas más cortas y un valor más alto para respuestas más largas. El valor predeterminado es 50.

    Un token puede ser más pequeño que una palabra y tener aproximadamente cuatro caracteres. 100 tokens corresponden a aproximadamente 60 a 80 palabras.

  • temperature: un valor FLOAT64 en el rango [0.0,1.0] que se usa para el muestreo durante la generación de la respuesta, que ocurre cuando se aplican top_k y top_p. Controla el grado de aleatorización en la selección de tokens. Los valores temperature más bajos son buenos para los mensajes que requieren una respuesta más determinista y menos abierta o de creatividad, mientras que los valores temperature más altos pueden generar resultados más diversos o creativos. Un valor temperature de 0 es determinista, lo que significa que siempre se elige la respuesta de mayor probabilidad. El valor predeterminado es 1.0.

  • top_k: un valor INT64 en el rango [1,40] que cambia la forma en que el modelo selecciona tokens para la salida. Especifica un valor más bajo para respuestas menos aleatorias y un valor más alto para respuestas más aleatorias. El valor predeterminado es 40.

    Un valor top_k de 1 significa que el siguiente token seleccionado es el más probable entre todos los tokens en el vocabulario del modelo, mientras que un valor top_k de 3 significa que el siguiente token se selecciona entre los tres tokens más probables mediante el valor temperature.

    Para cada paso de selección de tokens, se realiza un muestreo de los tokens top_k con las probabilidades más altas. Luego, los tokens se filtran según el valor top_p, y el token final se selecciona con el muestreo de temperatura.

  • top_p: un valor FLOAT64 en el rango [0.0,1.0] que cambia la forma en que el modelo selecciona tokens para la salida. Especifica un valor más bajo para respuestas menos aleatorias y un valor más alto para respuestas más aleatorias. El valor predeterminado es 1.0.

    Los tokens se seleccionan del más probable (según el valor top_k) al menos probable hasta que la suma de sus probabilidades sea igual al valor de top_p. Por ejemplo, si los tokens A, B y C tienen una probabilidad de 0.3, 0.2 y 0.1, y el valor top_p es 0.5, entonces el modelo selecciona A o B como el siguiente token mediante el valor temperature y no considera C.

  • flatten_json_output: es un valor BOOL que determina si el contenido JSON que muestra la función se analiza en columnas separadas. El valor predeterminado es FALSE.

Salida

ML.GENERATE_TEXT muestra la tabla de entrada más las siguientes columnas:

  • ml_generate_text_result: la respuesta JSON de la llamada projects.locations.endpoints.predict al modelo. El texto generado se encuentra en el elemento content. Los atributos de seguridad están en el elemento safetyAttributes. Esta columna se muestra cuando flatten_json_output es FALSE.
  • ml_generate_text_llm_result: un valor STRING que contiene el texto generado que muestra la llamada projects.locations.endpoints.predict al modelo. Esta columna se muestra cuando flatten_json_output es TRUE.
  • ml_generate_text_rai_result: un valor STRING que contiene los atributos de seguridad que muestra la llamada projects.locations.endpoints.predict al modelo. Esta columna se muestra cuando flatten_json_output es TRUE.
  • ml_generate_text_status: un valor STRING que contiene el estado de respuesta de la API para la fila correspondiente. Este valor está vacío si la operación se realizó con éxito.

Ubicaciones

ML.GENERATE_TEXT debe ejecutarse en la misma región que el modelo remoto al que hace referencia la función. Solo puedes crear modelos remotos basados en modelos text-bison* en las siguientes ubicaciones:

  • asia-northeast3
  • asia-southeast1
  • eu
  • europe-west1
  • europe-west2
  • europe-west3
  • europe-west4
  • europe-west9
  • us
  • us-central1
  • us-west4

Cuotas

Consulta Cuotas y límites de las funciones con valores de la tabla de servicios de Cloud AI.

Ejemplos

Ejemplo 1

En este ejemplo, se muestra una solicitud con las siguientes características:

  • Proporciona un solo mensaje.
  • Muestra una respuesta de texto generado más larga.
  • Muestra una respuesta de texto generado menos probable.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (SELECT 'What is the purpose of dreams?' AS prompt),
    STRUCT(
      0.8 AS temperature,
      1024 AS max_output_tokens,
      0.95 AS top_p,
      40 AS top_k));

Ejemplo 2

En este ejemplo, se muestra una solicitud con las siguientes características:

  • Proporciona datos de solicitud desde una columna de tabla llamada prompt.
  • Muestra una respuesta de texto generado más corta.
  • Muestra una respuesta de texto generado más probable.
  • Compacta la respuesta JSON en columnas separadas.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL
      `mydataset.llm_model`
        TABLE `mydataset.prompt_table`,
    STRUCT(
      0.2 AS temperature, 75 AS max_output_tokens, 0.3 AS top_p, 15 AS top_k, TRUE AS flatten_json_output));

Ejemplo 3

En este ejemplo, se muestra una solicitud con las siguientes características:

  • Proporciona datos de solicitud de una columna de tabla llamada question que tiene un alias como prompt.
  • Muestra una respuesta de texto generado moderadamente larga.
  • Muestra una respuesta de texto generado moderadamente probable.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (SELECT question AS prompt FROM `mydataset.prompt_table`),
    STRUCT(
      0.4 AS temperature, 750 AS max_output_tokens, 0.5 AS top_p, 30 AS top_k));

Ejemplo 4

En este ejemplo, se muestra una solicitud con las siguientes características:

  • Concatena strings y una columna de tabla para proporcionar los datos del mensaje.
  • Muestra una respuesta de texto generado más larga.
  • Muestra una respuesta de texto generado más probable.
SELECT *
FROM
  ML.GENERATE_TEXT(
    MODEL `mydataset.llm_model`,
    (
      SELECT
        CONCAT(
          'Classify the sentiment of the following text as positive or negative.Text:',
          input_column,
          'Sentiment:') AS prompt
      FROM `mydataset.input_table`
    ),
    STRUCT(
      0.1 AS temperature,
      1000 AS max_output_tokens,
      0.1 AS top_p,
      10 AS top_k));

¿Qué sigue?