En esta página, se muestra cómo usar Cloud SQL para PostgreSQL a fin de realizar las siguientes acciones:
Generar y almacenar embeddings de vectores según un modelo.
Indexa y consulta embeddings con la extensión
pgvector
.
Para obtener más información, consulta Compila aplicaciones de IA generativa con Cloud SQL.
Cloud SQL te permite usar un modelo de embedding alojado por Vertex AI para traducir una string de texto a una embedding, que es la representación del modelo del significado semántico del texto dado como un vector numérico.
Cloud SQL implementa las embeddings como arrays de valores real
. Esto te permite usar embeddings generadas como entradas para las funciones de extensión pgvector
.
Antes de comenzar
Algunos requisitos difieren en función de si deseas usar Cloud SQL para generar embeddings o si solo necesitas trabajar con embeddings almacenadas en tu base de datos desde otra fuente.
Restricciones regionales
Para generar embeddings con Cloud SQL, tu instancia debe residir en una región donde generative AI foundational models are supported
.
Los modelos de Vertex AI que Cloud SQL puede usar para las embeddings, text-embedding
y textembedding-gecko
, se encuentran en esa región.
Extensiones de base de datos obligatorias
Para trabajar con embeddings, necesitas la extensión google_ml_integration
, versión 1.2
o posterior, instalada en tu instancia de Cloud SQL.
De forma opcional, si deseas almacenar estas embeddings y usar funciones y operadores vectoriales con las embeddings, también necesitas la extensión pgvector
.
Cloud SQL tiene ambas extensiones. Puedes instalarlos en cualquier base de datos de tu instancia. Para obtener más información, consulta Configura extensiones de PostgreSQL.
Configura el acceso al modelo
Antes de generar embeddings desde una instancia de Cloud SQL, debes configurar Cloud SQL para que funcione con un modelo de embeddings de texto.
Para trabajar con el modelo text-embedding
o textembedding-gecko
basado en la nube, debes integrar Cloud SQL a Vertex AI.
Otorga acceso a los usuarios de la base de datos para generar embeddings
Otorga permiso a los usuarios de la base de datos para que usen la función embedding
a fin de ejecutar predicciones:
Conecta un cliente
psql
a la instancia principal, como se describe en Conéctate con un cliente psql.En el símbolo del sistema de
psql
, conéctate a la base de datos y otorga permisos:\c DB_NAME GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
Reemplaza lo siguiente:
DB_NAME: el nombre de la base de datos para la que otorgas permisos
USER_NAME: el nombre del usuario al que le otorgas permisos
Genera embeddings
Cloud SQL proporciona una función que te permite traducir texto en una embedding de vector. Luego, puedes almacenar esa embedding en tu base de datos como datos vectoriales y, de forma opcional, usar funciones pgvector
para ejecutar consultas en ella.
Genera una embedding
Para generar una embedding mediante Cloud SQL, usa la función embedding()
que proporciona la extensión google_ml_integration
:
SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');
Realiza los siguientes reemplazos:
MODEL_ID: el ID del modelo que se consultará.
Si usas Vertex AI Model Garden, especifica
text-embedding-004
otext-multilingual-embedding-002
. Estos son los modelos basados en la nube que Cloud SQL puede usar para las embeddings de texto. Para obtener más información, consulta Embeddings de texto.VERSION_TAG (opcional): es la etiqueta de la versión del modelo que se consultará. Para versiones de
textembedding-gecko
anteriores atext-embedding-004
otext-multilingual-embedding-002
,Prepend the tag with
@`.Si usas uno de los modelos
textembedding-gecko
con Vertex AI, especifica una de las etiquetas de versión enumeradas en Versiones del modelo.TEXT: es el texto que se traducirá en una embedding de vector.
En el siguiente ejemplo, se usa el modelo text-embedding-004
para generar una incorporación basada en una cadena literal proporcionada:
SELECT embedding( 'text-embedding-004', 'Cloud SQL is a managed, cloud-hosted SQL database service.');
Almacena una embedding generada
El valor que se muestra de la función embedding()
es un array de valores real
.
Para almacenar este valor en una tabla, agrega una columna real[]
:
ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];
Realiza los siguientes reemplazos:
TABLE: el nombre de la tabla
EMBEDDING_COLUMN: el nombre de la columna de embedding nueva
DIMENSIONS: la cantidad de dimensiones que admite el modelo.
Si usas uno de los modelos
text-embedding
otextembedding-gecko
con Vertex AI, especifica768
.
De forma opcional, si instalaste la extensión pgvector
, puedes almacenar las embeddings como valores vector
:
ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN vector(DIMENSIONS);
Después de crear una columna para almacenar embeddings, puedes propagarla en función de los valores ya almacenados en otra columna de la misma tabla:
UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_IDVERSION_TAG', SOURCE_TEXT_COLUMN);
Realiza los siguientes reemplazos:
TABLE: el nombre de la tabla.
EMBEDDING_COLUMN: el nombre de la columna de embedding.
MODEL_ID: el ID del modelo que se consultará.
Si usas Vertex AI Model Garden, especifica
text-embedding-004
otext-multilingual-embedding-002
. Estos son los modelos basados en la nube que Cloud SQL puede usar para las embeddings de texto. Para obtener más información, consulta Embeddings de texto.VERSION_TAG (opcional): es la etiqueta de la versión del modelo que se consultará. Para versiones de
textembedding-gecko
anteriores atext-embedding-004
otext-multilingual-embedding-002
,Prepend the tag with
@`.Si usas uno de los modelos
textembedding-gecko
con Vertex AI, especifica una de las etiquetas de versión enumeradas en Versiones del modelo.SOURCE_TEXT_COLUMN: es el nombre de la columna que almacena el texto. Traduces este texto a embeddings.
El comando anterior funciona para las columnas de embedding real[]
y vector
. Si tu columna de embedding es del tipo vector
, Cloud SQL convierte el valor de retorno de embedding()
de un array real
en un valor vector
de forma implícita.
En el siguiente ejemplo, se usa el modelo text-embedding-004
para propagar la columna messages.message_vector
con embeddings basadas en el contenido de la columna messages.message
:
UPDATE messages SET message_vector = embedding( 'text-embedding-004', message);
Consulta embeddings y, luego, indexa con pgvector
La extensión pgvector
de PostgreSQL te permite usar operadores y funciones específicos de vectores cuando almacenas, indexas y consultas embeddings de texto en tu base de datos. Cloud SQL tiene sus propias optimizaciones para trabajar con pgvector
, lo que te permite crear índices que pueden acelerar las consultas que involucran embeddings.
Crea un índice de vecino más cercano optimizado
pgvector
admite la búsqueda de vecino más cercano aproximado mediante la indexación. Cloud SQL agrega a esta compatibilidad una característica de cuantización escalar que puedes especificar cuando creas un índice. Cuando habilitas esta función, la cuantización escalar puede acelerar las consultas que tienen vectores dimensionales más grandes. Además, esta función te permite almacenar vectores con hasta 8,000 dimensiones.
Para habilitar la cuantización escalar en un índice basado en pgvector
, especifica ivf
como el método de índice y SQ8
como el cuantizador:
CREATE INDEX ON TABLE
USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
Realiza los siguientes reemplazos:
TABLE: Es la tabla a la que agregas el índice.
EMBEDDING_COLUMN: Es una columna que almacena datos
vector
.DISTANCE_FUNCTION: es la función de distancia que se usará con este índice. Elige una de estas opciones:
Distancia de L2:
vector_l2_ops
Producto interno:
vector_ip_ops
Distancia de coseno:
vector_cosine_ops
LIST_COUNT: Es la cantidad de listas que se usarán con este índice.
Para crear este índice en una columna de embedding que use el tipo de datos real[]
en lugar de vector
, convierte la columna en el tipo de datos vector
:
CREATE INDEX ON TABLE
USING ivf ((CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
Reemplaza DIMENSIONS por el ancho dimensional de la columna de embedding.
En la siguiente sección, se muestra un ejemplo de este tipo de índice.
Realiza una consulta de vecino más cercano con texto determinado
Una vez que almacenes y, también, indexes las embeddings en tu base de datos, el rango completo de funcionalidad de consulta de pgvector
estará disponible para ti.
Para encontrar los vecinos semánticos más cercanos a un fragmento de texto, usa la función embedding()
a fin de traducir el texto a un vector. En la misma consulta, aplica este vector al operador de vecino más cercano pgvector
, <->
, para encontrar las filas de la base de datos con las embeddings semánticamente más similares.
Debido a que embedding()
muestra un array real
, debes convertir la llamada embedding()
en vector
para usar estos valores con operadores pgvector
.
SELECT RESULT_COLUMNS FROM TABLE
ORDER BY EMBEDDING_COLUMN
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
LIMIT ROW_COUNT
Realiza los siguientes reemplazos:
RESULT_COLUMNS: las columnas que se mostrarán desde filas similares semánticamente.
TABLE: la tabla que contiene la embedding con la que comparas el texto.
EMBEDDING_COLUMN: la columna que contiene las embeddings almacenadas.
MODEL_ID: el ID del modelo que se consultará.
Si usas Vertex AI Model Garden, especifica
text-embedding-004
otext-embedding-multilingual-002
. Estos son los modelos basados en la nube que Cloud SQL puede usar para las embeddings de texto. Para obtener más información, consulta Embeddings de texto.VERSION_TAG (opcional): es la etiqueta de la versión del modelo que se consultará. Agrega
@
a la etiqueta.Si usas uno de los modelos
textembedding-gecko
con Vertex AI, especifica una de las etiquetas de versión enumeradas en Versiones del modelo.TEXT: es el texto que deseas para poder encontrar los vecinos semánticos almacenados más cercanos.
ROW_COUNT: cantidad de filas que se mostrarán. Si solo deseas la mejor coincidencia, especifica
1
como el valor para este parámetro.
Para ejecutar esta consulta con una columna de embeddings almacenada que usa el tipo de datos real[]
en lugar de vector
, convierte la columna en el tipo de datos vector
:
SELECT RESULT_COLUMNS::vector FROM TABLE
ORDER BY EMBEDDING_COLUMN
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
LIMIT ROW_COUNT
Usa etiquetas de versión del modelo para evitar errores
Google recomienda que siempre uses una versión estable del modelo de embeddings elegido. En la mayoría de los modelos, esto significa configurar una etiqueta de versión de forma explícita.
Llamar a la función embedding()
sin especificar la etiqueta de versión del modelo es válida en términos sintácticos, pero también es propenso a errores.
Si omites la etiqueta de versión cuando usas un modelo en Vertex AI Model Garden, entonces Vertex AI usa la versión más reciente del modelo. Es posible que esta no sea la última versión estable. Para obtener más información sobre las versiones disponibles de modelos de Vertex AI, consulta Versiones de modelos.
Una versión determinada del modelo de Vertex AI siempre muestra la misma respuesta embedding()
a una entrada de texto determinada. Si no especificas las versiones del modelo en tus llamadas a embedding()
, una nueva versión del modelo publicada puede cambiar el vector que se muestra para una entrada determinada de forma abrupta. Esto puede causar errores o cualquier otro comportamiento inesperado en tus aplicaciones.
Para evitar estos problemas, especifica siempre la versión del modelo.