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;