Comprende un ejemplo de un flujo de trabajo de embedding

En esta página, se proporciona un ejemplo de un flujo de trabajo que muestra cómo opera la función embedding() con los datos almacenados en tus tablas y la función de consulta pgvector. En el ejemplo, se usan entradas de texto sin formato para recuperar un resultado de una base de datos que depende del análisis semántico del significado del texto basado en un modelo de lenguaje grande (LLM).

Una situación de ejemplo de un flujo de trabajo de embedding

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 los reclamos del comprador que se registran sobre cada artículo como texto sin formato.

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

Aunque esta base de datos almacena reclamos sobre artículos, tales reclamos se almacenan como texto sin formato, lo que dificulta las consultas. Por ejemplo, si deseas ver qué artículos tienen más reclamos de los clientes que recibieron un color de producto incorrecto, puedes realizar consultas en SQL comunes en la tabla, en la que se busquen varias coincidencias de palabras clave. Sin embargo, este enfoque solo coincide con las filas que contienen esas palabras clave exactas.

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

Las consultas en SQL que usan embeddings con tecnología de LLM pueden ayudar a cerrar esta brecha. Mediante la aplicación de embeddings, puedes consultar la tabla de este ejemplo en busca de artículos en los que los reclamos tengan similitud semántica con un mensaje de texto determinado, como “era el color incorrecto”.

En los siguientes pasos, se muestra cómo habilitar esta opción en la situación de ejemplo descrita antes.

Prepara la tabla

Antes de ejecutar consultas basadas en LLM en el contenido de la tabla items, debes preparar la tabla para almacenar y, luego, indexar los embeddings en función de tus datos existentes.

Crea una columna para almacenar embeddings

Agrega una columna a la tabla para almacenar embeddings.

ALTER TABLE items ADD COLUMN complaint_embedding vector(768);

En este ejemplo, se especifica 768 como argumento porque esa es la cantidad de dimensiones que admite el LLM textembedding-gecko. Para obtener más información, consulta Genera un embedding.

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.

Propaga la columna nueva

Usa la función embedding() para propagar esta columna nueva con embeddings basados en el valor del texto de cada fila que aparece en la columna complaints. En este ejemplo, Cloud SQL genera los embeddings a través del LLM con el ID de textembedding-gecko, versión 001.

UPDATE items SET complaint_embedding = embedding('textembedding-gecko@001', complaints);

En este ejemplo, se convierte el valor que se muestra real[] de embedding() en un valor vector para almacenar implícitamente el valor en la columna vector que creaste en Crea una columna para almacenar embeddings.

Crea un índice

Para mejorar el rendimiento, agrega un índice a la tabla items. Este índice usa las técnicas de cuantización escalar que se muestran en Crea un índice de vecino más cercano optimizado.

CREATE INDEX complaint_embed_idx ON items
  USING ivf (complaint_embedding vector_l2_ops)
  WITH (lists = 20, quantizer = 'SQ8');

Para obtener más información acerca de cómo crear índices de vecino más cercano aproximados, consulta Indexación.

Ejecuta consultas con tecnología de LLM con el texto proporcionado

Ahora puedes hacer consultas semánticas más cercanas en la tabla items. En la siguiente consulta, se usa el operador <-> que proporciona pgvector 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.
  • Muestra los diez reclamos principales.

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

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

¿Qué sigue?