Ejemplo de flujo de trabajo de una incrustación

En esta página se muestra un ejemplo de flujo de trabajo que explica cómo funciona la función embedding() con los datos almacenados en tus tablas y la funcionalidad de consulta pgvector. En este ejemplo, se utiliza una entrada de texto sin formato para obtener un resultado de una base de datos que usa un análisis semántico del significado del texto basado en un modelo de lenguaje extenso (LLM).

Ejemplo de una situación de un flujo de trabajo de incrustación

Imagina una base de datos que se ejecuta en Cloud SQL para PostgreSQL con los siguientes aspectos:

  • La base de datos contiene una tabla: items. Cada fila de esta tabla describe un artículo que vende tu empresa.

  • La tabla items contiene una columna: complaints. En esta columna se almacenan las quejas de los compradores sobre cada artículo en texto sin formato.

  • La base de datos se integra con Vertex AI Model Garden, lo que le da acceso al LLM textembedding-gecko.

Aunque esta base de datos almacena reclamaciones sobre artículos, estas reclamaciones se almacenan como texto sin formato, lo que dificulta las consultas. Por ejemplo, si quieres ver qué artículos han recibido más quejas de clientes que han recibido un producto de un color incorrecto, puedes realizar consultas de SQL normales en la tabla y buscar varias coincidencias de palabras clave. Sin embargo, este método solo coincide con las filas que contienen esas palabras clave exactas.

Por ejemplo, una consulta SQL básica como SELECT * FROM item WHERE complaints LIKE "%wrong color%" no devuelve una fila en la que el campo complaints contenga solo The picture shows a blue one, but the one I received was red.

Las consultas de SQL que usan incrustaciones basadas en LLMs pueden ayudar a salvar esta distancia. Al aplicar las inserciones, puede consultar la tabla de este ejemplo para buscar elementos en los que las reclamaciones tengan una similitud semántica con una petición de texto determinada, como "Era del color equivocado".

En los pasos siguientes se muestra cómo habilitar esta opción en el ejemplo descrito anteriormente.

Preparar la tabla

Antes de ejecutar consultas basadas en LLMs en el contenido de la tabla items, debes preparar la tabla para almacenar e indexar las inserciones en función de los datos que ya tengas.

Crear una columna para almacenar las inserciones

Añade una columna a la tabla para almacenar las inserciones.

sql ALTER TABLE items ADD COLUMN complaint_embedding vector(768);

En este ejemplo se especifica 768 como argumento porque es el número de dimensiones que admite el LLM textembedding-gecko. Para obtener más información, consulta Generar una inserción.

En el ejemplo se aplica el tipo de datos vector a la columna para simplificar el uso de funciones y operadores pgvector con los valores de la columna.

Rellena la nueva columna

Usa la función embedding() para rellenar esta nueva columna con las inserciones basadas en el valor del texto de cada fila que aparece en la columna complaints. En este ejemplo, Cloud SQL genera las inserciones mediante el LLM con el ID textembedding-gecko y la versión 004.

UPDATE items SET complaint_embedding = embedding('text-embedding-005', complaints);
En este ejemplo, se convierte el valor de retorno real[] de embedding() en un valor vector de forma implícita para almacenar el valor en la columna vector que ha creado en Crear una columna para almacenar las inserciones.

Crear un índice

Para mejorar el rendimiento, añade un índice a la tabla items.

CREATE INDEX complaint_embed_idx ON items
  USING hnsw (complaint_embedding vector_cosine_ops);

Para obtener más información sobre cómo crear este tipo de índice, consulta Crear un índice de vecinos más cercanos. Además, para obtener más información sobre cómo optimizar el índice configurando parámetros, consulte Consultar e indexar inserciones con pgvector.

Ejecutar consultas basadas en LLMs con el texto proporcionado

Ahora puedes hacer consultas semánticas de vecinos más cercanos en la tabla items. La siguiente consulta usa el operador <-> que pgvector proporciona para completar las siguientes acciones:

  • Ordena las filas de la tabla según la proximidad semántica al texto de It was the wrong color.
  • Devuelve las diez principales reclamaciones.

La consulta muestra los valores id y name de la primera fila ordenada.

SELECT id, name FROM items
  ORDER BY complaint_embedding
  <-> embedding('text-embedding-005', 'It was the wrong color')::vector LIMIT 10;

Siguientes pasos