Obtener incorporaciones de texto

La API de incorporaciones de texto de Vertex AI te permite crear una incorporación de texto mediante la IA generativa en Vertex AI. Las incorporaciones de texto son representaciones numéricas de texto que capturan las relaciones entre palabras y frases. Los modelos de aprendizaje automático, en especial los modelos de IA generativa, son adecuados para crear estas incorporaciones mediante la identificación de patrones dentro de grandes conjuntos de datos de texto. Tu aplicación puede usar incorporaciones de texto para procesar y producir lenguaje, y reconocer significados complejos y relaciones semánticas específicas en tu contenido. Interactúas con incorporaciones de texto cada vez que completas una Búsqueda de Google o ves recomendaciones de transmisión de música.

Estos son algunos casos de uso comunes de las incorporaciones de texto:

  • Búsqueda semántica: Busca texto clasificado por similitud semántica.
  • Clasificación: Muestra la clase de elementos cuyos atributos de texto son similares al texto dado.
  • Agrupamiento en clústeres: Elementos de un clúster con atributos de texto similares a los textos proporcionados.
  • Detección de valores atípicos: Muestra los elementos en los que los atributos de texto están menos relacionados con el texto dado.
  • Interfaz de conversación: Agrupa grupos de oraciones que pueden generar respuestas similares, como en un espacio de incorporaciones a nivel de conversación.

Las incorporaciones de texto funcionan mediante la conversión de texto en arreglos de números de punto flotante, llamados vectores. Estos vectores están diseñados para capturar el significado del texto. La longitud del arreglo de incorporaciones se denomina dimensionalidad del vector. Por ejemplo, un pase de texto podría representarse con un vector que contiene cientos de dimensiones. Luego, mediante el cálculo de la distancia numérica entre las representaciones vectoriales de dos textos, una aplicación puede determinar la similitud entre los objetos.

La API de incorporaciones de texto de Vertex AI usa representaciones vectoriales densas: text-embedding-gecko, por ejemplo, usa vectores de 768 dimensiones. Los modelos de incorporación de vectores densos usan métodos de aprendizaje profundo similares a los que usan los modelos grandes de lenguaje. A diferencia de los vectores dispersos, que tienden a asignar palabras directamente a números, los vectores densos están diseñados para representar mejor el significado de un fragmento de texto. La ventaja de usar incorporaciones de vectores densas en la IA generativa es que, en lugar de buscar coincidencias de palabras o sintaxis directas, puedes buscar mejor pasajes que se alineen con el significado de la consulta, incluso si los fragmentos no usan el mismo idioma.

Requisitos previos

Existen requisitos previos específicos para crear con éxito una incorporación. Para comenzar, consulta la guía de inicio rápido: Prueba las incorporaciones de texto.

Usa este Colab para llamar a los modelos de incorporación de texto recién publicados (textembedding-gecko y textembedding-gecko-multilingual).

Notebook de Jupyter: Llama a los modelos de incorporación de texto con Colab o un notebook de Jupyter.
Ejecutar en Colab

Ejemplo de caso de uso: Desarrolla un chatbot de recomendación de libros

Si deseas desarrollar un chatbot de recomendación de libros, lo primero que debes hacer es usar una red neuronal profunda (DNN) para convertir cada libro en un vector de incorporación, donde un vector de incorporación representa un libro. Puedes alimentar, como entrada a la DNN, solo el título del libro o solo el contenido del texto. O bien, puedes usar ambos en conjunto, demás de cualquier otro metadato que describa el libro, como el género.

Las incorporaciones de este ejemplo podrían estar compuestas por miles de títulos de libros con resúmenes y su género. También puede tener representaciones de libros, como Cumbres Borrascosas de Emily Brontë y Persuasión de Jane Austen que son similares entre sí (distancia pequeña entre la representación numérica). Mientras que la distancia de la representación numérica del libro El gran Gatsby de F. Scott Fitzgerald estaría más alejada, ya que el período, el género y el resumen son menos similares.

Las entradas son la influencia principal de la orientación del espacio de incorporaciones. Por ejemplo, si solo tenemos entradas de título de libro, dos libros con títulos similares, pero resúmenes muy diferentes, podrían estar cerca. Sin embargo, si incluimos el título y el resumen, estos mismos libros son menos similares (más lejanos) en el espacio de incorporaciones.

Trabajando con IA generativa, este chatbot de sugerencias de libros podría resumir, sugerir y mostrar libros que te podrían gustar (o no) según tu consulta.

Modelos compatibles

Para saber qué versiones del modelo de incorporación de texto estables están disponibles, consulta Versiones de modelos estables disponibles. Para saber qué versiones más recientes del modelo de incorporación de texto están disponibles, consulta Modelos más recientes.

Se recomienda especificar una versión de modelo estable (por ejemplo, textembedding-gecko@003). La versión más reciente de un modelo se encuentra en su versión preliminar y no cuenta con disponibilidad general (DG). Debido a que la versión más reciente se encuentra en versión preliminar, no se garantiza que esté lista para la producción.

Es muy importante usar una versión del modelo estable, por ejemplo, textembedding-gecko@003 para las aplicaciones que requieren incorporaciones retrocompatibles. Si la retrocompatibilidad no es un problema y quieres usar la versión más reciente del modelo, debes especificar @latest de forma explícita. Si no se especifica una versión, el valor predeterminado de textembedding-gecko es textembedding-gecko@003 y el de textembedding-gecko-multilingual es textembedding-gecko-multilingual@001.

Modelos más recientes

Hay dos modelos disponibles para la vista previa:

  • text-embedding-preview-0409
  • text-multilingual-embedding-preview-0409

Estos modelos mejoran con respecto a los modelos anteriores en comparativas establecidas que abarcan varias tareas descendentes, como la recuperación y la clasificación. Para obtener más información, consulta Gecko: Incorporaciones de texto versátiles extraídas de modelos de lenguaje grande.

Estos modelos ofrecen una mejor calidad de incorporación que los modelos textembedding-gecko@003 y textembedding-gecko-multilingual@001, respectivamente. Estos modelos se rompen de la convención de nomenclatura model-name@version. Especifica estos modelos sin el sufijo “@version”. A continuación, se muestra un ejemplo:

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT/locations/us-central1/publishers/google/models/text-embedding-preview-0409:predict -d $'{
  "instances": [
    { "content": "What is life?"}
  ],
}'

Además de una mejor calidad, los nuevos modelos admiten las siguientes capacidades:

  • Se admite un nuevo parámetro outputDimensionality. Puedes usar este parámetro a fin de reducir el tamaño de la incorporación, por ejemplo, para la optimización del almacenamiento.

    • QUESTION_ANSWERING
    • FACT_VERIFICATION

    Se admiten dos tipos de tareas nuevos. Para ver más tipos de tareas, consulta la referencia del modelo.

En el siguiente ejemplo, se muestran las capacidades nuevas:

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT/locations/us-central1/publishers/google/models/text-embedding-preview-0409:predict -d $'{
  "instances": [
    {
      "task_type": "QUESTION_ANSWERING",
      "content": "What is life?"
    }
  ],
"parameters": {
    "outputDimensionality": 256
  }
}'

Las siguientes limitaciones se aplican cuando se usan estos modelos:

  • No uses estos modelos de vista previa en sistemas esenciales o de producción.
  • Estos modelos solo están disponibles en us-central1.
  • Las predicciones por lotes no son compatibles.
  • No se admite la personalización.

Obtén incorporaciones de texto para un fragmento de texto

Puedes obtener incorporaciones de texto para un fragmento de texto mediante la API de Vertex AI o el SDK de Vertex AI para Python. Para cada solicitud, tienes un límite de 250 textos de entrada en us-central1 y, en otras regiones, el texto de entrada máximo es de 5. Cada texto de entrada tiene un límite de token de 3,072. Las entradas de más de esta longitud se truncan en silencio. También puedes inhabilitar el truncamiento silencioso si configuras autoTruncate en false.

En estos ejemplos, se usa el modelo textembedding-gecko@003.

REST

Para obtener incorporaciones de texto, envía una solicitud POST mediante la especificación del ID del modelo del modelo de publicador.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • PROJECT_ID: El ID del proyecto.
  • TEXT: El texto para el que deseas generar incorporaciones. Límite: Cinco textos de hasta 3,072 tokens por texto.
  • AUTO_TRUNCATE: Si se configura como false, el texto que excede el límite del token hace que la solicitud falle. El valor predeterminado es true.

HTTP method and URL:

POST https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict

Cuerpo JSON de la solicitud:

{
  "instances": [
    { "content": "TEXT"}
  ],
  "parameters": {
    "autoTruncate": AUTO_TRUNCATE
  }
}

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict"

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict" | Select-Object -Expand Content

Deberías recibir una respuesta JSON similar a la que se muestra a continuación: Ten en cuenta que values se truncó para ahorrar espacio.

Ejemplo del comando curl

MODEL_ID="textembedding-gecko@003"
PROJECT_ID=PROJECT_ID

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/${MODEL_ID}:predict -d \
$'{
  "instances": [
    { "content": "What is life?"}
  ],
}'

Python

Si deseas obtener información para instalar o actualizar el SDK de Python, consulta Instala el SDK de Vertex AI para Python. Si deseas obtener más información, consulta la documentación de referencia de la API de Python.

from typing import List

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

def embed_text(
    texts: List[str] = ["banana muffins? ", "banana bread? banana muffins?"],
    task: str = "RETRIEVAL_DOCUMENT",
    model_name: str = "textembedding-gecko@003",
) -> List[List[float]]:
    """Embeds texts with a pre-trained, foundational model."""
    model = TextEmbeddingModel.from_pretrained(model_name)
    inputs = [TextEmbeddingInput(text, task) for text in texts]
    embeddings = model.get_embeddings(inputs)
    return [embedding.values for embedding in embeddings]

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Go.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

import (
	"context"
	"fmt"
	"io"

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	"cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateEmbeddings creates embeddings from text provided.
func generateEmbeddings(w io.Writer, prompt, project, location, publisher, model string) error {
	ctx := context.Background()

	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)

	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		fmt.Fprintf(w, "unable to create prediction client: %v", err)
		return err
	}
	defer client.Close()

	// PredictRequest requires an endpoint, instances, and parameters
	// Endpoint
	base := fmt.Sprintf("projects/%s/locations/%s/publishers/%s/models", project, location, publisher)
	url := fmt.Sprintf("%s/%s", base, model)

	// Instances: the prompt
	promptValue, err := structpb.NewValue(map[string]interface{}{
		"content": prompt,
	})
	if err != nil {
		fmt.Fprintf(w, "unable to convert prompt to Value: %v", err)
		return err
	}

	// PredictRequest: create the model prediction request
	req := &aiplatformpb.PredictRequest{
		Endpoint:  url,
		Instances: []*structpb.Value{promptValue},
	}

	// PredictResponse: receive the response from the model
	resp, err := client.Predict(ctx, req)
	if err != nil {
		fmt.Fprintf(w, "error in prediction: %v", err)
		return err
	}

	fmt.Fprintf(w, "embeddings generated: %v", resp.Predictions[0])
	return nil
}

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Java.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

import static java.util.stream.Collectors.toList;

import com.google.cloud.aiplatform.v1beta1.EndpointName;
import com.google.cloud.aiplatform.v1beta1.PredictRequest;
import com.google.cloud.aiplatform.v1beta1.PredictResponse;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceClient;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceSettings;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PredictTextEmbeddingsSample {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // Details about text embedding request structure and supported models are available in:
    // https://cloud.google.com/vertex-ai/docs/generative-ai/embeddings/get-text-embeddings
    String endpoint = "us-central1-aiplatform.googleapis.com:443";
    String project = "YOUR_PROJECT_ID";
    String model = "textembedding-gecko@003";
    predictTextEmbeddings(
        endpoint,
        project,
        model,
        List.of("banana bread?", "banana muffins?"),
        "RETRIEVAL_DOCUMENT");
  }

  // Gets text embeddings from a pretrained, foundational model.
  public static List<List<Float>> predictTextEmbeddings(
      String endpoint, String project, String model, List<String> texts, String task)
      throws IOException {
    PredictionServiceSettings settings =
        PredictionServiceSettings.newBuilder().setEndpoint(endpoint).build();
    Matcher matcher = Pattern.compile("^(?<Location>\\w+-\\w+)").matcher(endpoint);
    String location = matcher.matches() ? matcher.group("Location") : "us-central1";
    EndpointName endpointName =
        EndpointName.ofProjectLocationPublisherModelName(project, location, "google", model);

    // You can use this prediction service client for multiple requests.
    try (PredictionServiceClient client = PredictionServiceClient.create(settings)) {
      PredictRequest.Builder request =
          PredictRequest.newBuilder().setEndpoint(endpointName.toString());
      for (int i = 0; i < texts.size(); i++) {
        request.addInstances(
            Value.newBuilder()
                .setStructValue(
                    Struct.newBuilder()
                        .putFields("content", valueOf(texts.get(i)))
                        .putFields("taskType", valueOf(task))
                        .build()));
      }
      PredictResponse response = client.predict(request.build());
      List<List<Float>> floats = new ArrayList<>();
      for (Value prediction : response.getPredictionsList()) {
        Value embeddings = prediction.getStructValue().getFieldsOrThrow("embeddings");
        Value values = embeddings.getStructValue().getFieldsOrThrow("values");
        floats.add(
            values.getListValue().getValuesList().stream()
                .map(Value::getNumberValue)
                .map(Double::floatValue)
                .collect(toList()));
      }
      return floats;
    }
  }

  private static Value valueOf(String s) {
    return Value.newBuilder().setStringValue(s).build();
  }
}

Node.js

Antes de probar este ejemplo, sigue las instrucciones de configuración para Node.js incluidas en la guía de inicio rápido de Vertex AI sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Vertex AI Node.js.

Para autenticarte en Vertex AI, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

async function main(
  project,
  model = 'textembedding-gecko@003',
  texts = 'banana bread?;banana muffins?',
  task = 'RETRIEVAL_DOCUMENT',
  apiEndpoint = 'us-central1-aiplatform.googleapis.com'
) {
  const aiplatform = require('@google-cloud/aiplatform');
  const {PredictionServiceClient} = aiplatform.v1;
  const {helpers} = aiplatform; // helps construct protobuf.Value objects.
  const clientOptions = {apiEndpoint: apiEndpoint};
  const match = apiEndpoint.match(/(?<Location>\w+-\w+)/);
  const location = match ? match.groups.Location : 'us-centra11';
  const endpoint = `projects/${project}/locations/${location}/publishers/google/models/${model}`;

  async function callPredict() {
    const instances = texts
      .split(';')
      .map(e => helpers.toValue({content: e, taskType: task}));
    const request = {endpoint, instances};
    const client = new PredictionServiceClient(clientOptions);
    const [response] = await client.predict(request);
    console.log('Got predict response');
    const predictions = response.predictions;
    for (const prediction of predictions) {
      const embeddings = prediction.structValue.fields.embeddings;
      const values = embeddings.structValue.fields.values.listValue.values;
      console.log('Got prediction: ' + JSON.stringify(values));
    }
  }

  callPredict();
}

Agrega una incorporación a una base de datos vectorial

Después de generar tu incorporación, puedes agregar incorporaciones a una base de datos vectorial, como Vector Search. Esto permite una recuperación de latencia baja y es fundamental a medida que aumenta el tamaño de los datos.

Para obtener más información sobre Vector Search, consulta Descripción general de Vector Search.

Cambios en la API de los modelos publicados a partir de agosto de 2023

Cuando se usan versiones del modelo publicadas después de agosto de 2023, incluidas textembedding-gecko@003 y textembedding-gecko-multilingual@001, se genera un nuevo parámetro con el tipo de tarea y el título opcional (solo es válido para task_type=RETRIEVAL_DOCUMENT).

Estos parámetros nuevos se aplican a los modelos de versión preliminar pública y a todos los modelos estables en el futuro.

{
  "instances": [
    {
      "task_type": "RETRIEVAL_DOCUMENT",
      "title": "document title",
      "content": "I would like embeddings for this text!"
    },
  ]
}

El parámetro task_type se define como la aplicación descendente deseada para ayudar al modelo a producir incorporaciones de mejor calidad. Es una cadena que puede tomar uno de los siguientes valores:

task_type Descripción
RETRIEVAL_QUERY Especifica que el texto dado es una consulta en un parámetro de configuración de búsqueda o recuperación.
RETRIEVAL_DOCUMENT Especifica que el texto dado de un documento en un parámetro de configuración de búsqueda o recuperación.
SEMANTIC_SIMILARITY Especifica que el texto dado se usa para la similitud textual semántica (STS).
CLASSIFICATION Especifica que la incorporación se usa para la clasificación.
CLUSTERING Especifica que la incorporación se usa para el agrupamiento en clústeres.
QUESTION_ANSWERING Especifica que la incorporación de consultas se usa para responder preguntas. Usa RETRIEVAL_DOCUMENT para el lado del documento.
FACT_VERIFICATION Especifica que la incorporación de consultas se usa para la verificación de datos.

Cobertura de idioma para los modelos textembedding-gecko-multilingual.

El modelo textembedding-gecko-multilingual@001 se evaluó en los siguientes idiomas: Arabic (ar), Bengali (bn), English (en), Spanish (es), German (de) y Persian (fa), Finnish (fi), French (fr), Hindi (hi), Indonesian (id), Japanese (ja), Korean (ko), Russian (ru), Swahili (sw), Telugu (te) , Thai (th), Yoruba (yo), Chinese (zh).

A continuación, se muestra la lista completa de idiomas compatibles:Afrikaans ,Albanian ,Amharic ,Arabic ,Armenian ,Azerbaijani ,Basque ,Belarusian ,Bengali ,Bulgarian ,Burmese ,Catalan ,Cebuano ,Chichewa ,Chinese ,Corsican ,Czech ,Danish ,Dutch ,English ,Esperanto ,Estonian ,Filipino ,Finnish ,French ,Galician ,Georgian ,German ,Greek ,Gujarati ,Haitian Creole ,Hausa ,Hawaiian ,Hebrew ,Hindi ,Hmong ,Hungarian ,Icelandic ,Igbo ,Indonesian ,Irish ,Italian ,Japanese ,Javanese ,Kannada ,Kazakh ,Khmer ,Korean ,Kurdish ,Kyrgyz ,Lao ,Latin ,Latvian ,Lithuanian ,Luxembourgish ,Macedonian ,Malagasy ,Malay ,Malayalam ,Maltese ,Maori ,Marathi ,Mongolian ,Nepali ,Norwegian ,Pashto ,Persian ,Polish ,Portuguese ,Punjabi ,Romanian ,Russian ,Samoan ,Scottish Gaelic ,Serbian ,Shona ,Sindhi ,Sinhala ,Slovak ,Slovenian ,Somali ,Sotho ,Spanish ,Sundanese ,Swahili ,Swedish ,Tajik ,Tamil ,Telugu ,Thai ,Turkish ,Ukrainian ,Urdu ,Uzbek ,Vietnamese ,Welsh ,West Frisian ,Xhosa ,Yiddish ,Yoruba ,Zulu.

¿Qué sigue?