dev-resources.site
for different kinds of informations.
Amazon Bedrock y RDS Aurora: Potenciando tus bases de datos con IA Generativa
驴Alguna vez has so帽ado con tener un asistente de IA dentro de tu base de datos, ayud谩ndote a optimizar consultas y explorar vastos conjuntos de datos?
Bueno, ese sue帽o est谩 a punto de convertirse en realidad. En este art铆culo, te llevar茅 de la mano a trav茅s del emocionante mundo de la integraci贸n entre Amazon Bedrock y RDS Aurora MySQL. Prep谩rate para descubrir c贸mo esta combinaci贸n de IA Generativa puede revolucionar la forma en que interact煤as con tus datos y optimizas tus consultas SQL.
隆Empecemos este viaje hacia el futuro de las bases de datos potenciadas por IA!
驴Qu茅 es Amazon Bedrock?
Amazon Bedrock es un servicio administrado de IA Generativa que fue lanzado a inicios de 2023 y que nos proporciona acceso a m煤ltiples modelos de IA de vanguardia a trav茅s de una 煤nica API.
Este servicio tiene muchas caracter铆sticas y est谩 en constante evoluci贸n y crecimiento; les menciono las m谩s importantes desde mi 贸ptica:
Acceso a modelos de IA: Ofrece acceso a modelos de lenguaje grandes (LLMs) y otros modelos de IA de empresas l铆deres: Anthropic, AI21 Labs, Meta, Cohere, Mistral AI, Stability AI y Amazon.
API unificada: Permite a los desarrolladores acceder y utilizar diferentes modelos de IA a trav茅s de una 煤nica interfaz, simplificando la integraci贸n. Con Bedrock es tan solo cambiar levemente el llamado y podemos pasar de un modelo a otro; facilitando nuestras pruebas y la evaluaci贸n del modelo m谩s adecuado para nuestro caso.
Integraci贸n con AWS: Se integra f谩cilmente con otros servicios de AWS.
Seguridad y privacidad: Elemento muy importante con temas de IA Generativa y por supuesto tiene opciones para el manejo seguro de datos y el cumplimiento de normativas.
Prerequisitos: Preparando el Terreno
Antes de sumergirnos en la integraci贸n, asegur茅monos de tener todo listo:
1. Acceso al Modelo de Anthropic Claude 3.5 Sonnet
Antes de iniciar con el proceso de configuraci贸n es importante que desde la consola de Bedrock se solicite acceso a los modelos que van a requerir; para este ejercicio emplear茅 el modelo m谩s avanzado de Anthropic disponible en Bedrock, el cual es Claude 3.5 Sonnet.
Esto se realiza en el apartado de 'Configuraciones de Bedrock' y debemos confirmar el permiso correspondiente para ese modelo. Por supuesto, pueden activar otros modelos si desean experimentar con otros LLM para comparar las respuestas.
Tip: 隆Activa otros modelos si quieres experimentar!
2. RDS Aurora MySQL
Debemos tener creado un cluster de RDS Aurora MySQL debidamente aprovisionado, con al menos la versi贸n 3.06 ya que a partir de esa versi贸n se tiene soporte.
Como parte del ejercicio usaremos la popular base de datos de prueba de MySQL llamada Sakila{:target="_blank"}, por lo cual ya deben de tenerla debidamente instalada en el cluster.
Configuraci贸n: Paso a paso hacia la integraci贸n
1. Crear Role y Pol铆tica de IAM
Esta integraci贸n requiere de roles de 'AWS Identity and Access Management' (IAM) y pol铆ticas para permitir al cluster de Aurora MySQL el acceso y uso de los servicios de Amazon Bedrock.
Primero creamos una nueva pol铆tica de IAM que debe contener lo siguiente:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "bedrock:InvokeModel",
"Resource": "*"
}
]
}
馃挕 Consejo: Guarda esta pol铆tica con el nombre BedrockInvokeModel. La utilizaremos despu茅s.
Ahora, debemos crear un rol, debemos escoger como caso de uso 'Add Role to Database', como ilustra la imagen.
Despu茅s, en el apartado de permisos debemos asociar la pol铆tica creada previamente.
El resultado final debe ser este:
Hay que tomar nota del ARN de este nuevo rol, pues lo utilizaremos posteriormente; su formato es similar a este: arn:aws:iam::XXXXX:role/RDSCallBedrockRole.
2. Crear Grupo de Par谩metros en RDS
Ahora, necesitamos un nuevo grupo de par谩metros para nuestro cluster:
Una vez creado, vamos a editar el par谩metro aws_default_bedrock_role de este grupo para colocar el ARN del role que creamos en el paso previo.
Hecho lo anterior, ahora debemos modificar el cluster de RDS para que emplee nuestro nuevo grupo de par谩metros personalizado.
Y como paso final, asociamos el mismo role al cluster de Aurora.
Es importante que reinicien el cluster para que los cambios que hemos realizado est茅n aplicados.
驴Quieres verificar que todo est谩 en orden? Ejecuta este comando:
SHOW GLOBAL VARIABLES LIKE 'aws_default%';
Y debemos ver como valor, el role que hemos estado usando.
Variable_name | Value |
---|---|
aws_default_bedrock_role | arn:aws:iam::XXXXX:role/RDSCallBedrockRole |
3. Crear Usuario y Permisos
Para nuestro ejercicio, voy a suponer que tienen ya un usuario creado, con los permisos completos para la base de datos de sakila. Asumiremos que se llama demo.
Debemos brindar el siguiente permiso a nuestro usuario:
GRANT AWS_BEDROCK_ACCESS TO 'demo'@'%';
Y despu茅s establecemos los privilegios efectivos en nuestra sesi贸n.
SET ROLE AWS_BEDROCK_ACCESS;
Si quisiera probar en este momento el acceso a Bedrock tendr铆a un error de conectividad, pues la configuraci贸n de red no me lo permite. Esto lo solucionaremos en el siguiente paso.
4. Configuraci贸n de Red
Hay varias maneras de configurar la comunicaci贸n entre RDS y Bedrock; pero para este caso usaremos un VPC Endpoint.
Primero debemos crear un nuevo endpoint y seleccionar como servicio com.amazonaws.region.bedrock-agent-runtime. Tengan cuidado en seleccionar ese y no alguno de los otros disponibles.
Luego debemos asociarlo a nuestra VPC, subredes adecuadas y seleccionar el grupo de seguridad que le asociaremos. En mi ejemplo us茅 el grupo de seguridad de la base de datos, debemos validar que tenga permisos de tr谩fico de ingreso autorizados para s铆 mismo.
Con esto terminamos la configuraci贸n de la VPC.
Nuestro Asistente: Un experto en SQL a tu disposici贸n
Imagina tener un asistente virtual de SQL que no solo optimiza tus consultas, sino que tambi茅n te explica por qu茅 lo hace. 隆Eso es exactamente lo que vamos a crear!
La raz贸n que me motiva a esto viene del hecho que hace muchos a帽os fui un 'Administrador de Base de Datos' y a煤n hoy observo de manera recurrente como los desarrolladores crean sentencias de SQL que no poseen los elementos m铆nimos para considerarlas optimizadas a nivel adecuado. Entonces se me ocurri贸: 驴qu茅 tal si le damos una herramienta que les permita indicar un SQL y un asistente les recomiende c贸mo reescribirla de manera correcta considerando el schema de la base de datos y que adem谩s les diga de manera medible el impacto en la mejora en tiempo de ejecuci贸n?
Componentes clave:
-
Tabla
query_history
: Almacena el antes y el despu茅s de tus consultas, junto con sus tiempos de ejecuci贸n. -
Funci贸n
generate_optimized_query
: Utiliza el poder de Claude 3.5 Sonnet para mejorar tus consultas. -
Procedimiento
analyze_and_optimize_query
: El cerebro de la operaci贸n. - Recopila informaci贸n del esquema de la base de datos actual.
- Genera una versi贸n optimizada de la consulta de entrada utilizando el modelo de IA.
- Ejecuta tanto la consulta original como la optimizada, midiendo sus tiempos de ejecuci贸n.
- Almacena los resultados en la tabla de historial.
- Muestra una comparaci贸n de las consultas y sus tiempos de ejecuci贸n.
C贸digo
La totalidad del c贸digo fuente est谩 en el siguiente repositorio de GitHub{:target="_blank"}, ac谩 dispondr茅 de las partes m谩s relevantes.
Primeramente creamos una funci贸n que invoca el modelo de Claude 3.5 Sonnet en Bedrock; es importante el ID del modelo que vemos ah铆. Esta funci贸n recibe un argumento que es un JSON
CREATE FUNCTION invoke_sonnet (request_body TEXT)
RETURNS TEXT
ALIAS AWS_BEDROCK_INVOKE_MODEL
MODEL ID 'anthropic.claude-3-5-sonnet-20240620-v1:0'
CONTENT_TYPE 'application/json'
ACCEPT 'application/json';
Este id del modelo se puede obtener de al menos dos maneras:
- Directamente en la consola de Bedrock, en los modelos base podemos tener ese identificador.
- Usando el AWS CLI y ejecutando el siguiente comando (si tenemos los permisos adecuados)
aws bedrock list-foundation-models --query '*[].[modelName,modelId]' --out table
y que nos retorna la lista de todos los modelos fundacionales que tenemos disponibles, por ejemplo:
Modelo | Model Id |
---|---|
Titan Multimodal Embeddings G1 | amazon.titan-embed-image-v1 |
SDXL 1.0 | stability.stable-diffusion-xl-v1:0 |
Jurassic-2 Ultra | ai21.j2-ultra |
Claude 3 Sonnet | anthropic.claude-3-sonnet-20240229-v1:0 |
Claude 3 Haiku | anthropic.claude-3-haiku-20240307-v1:0 |
Claude 3.5 Sonnet | anthropic.claude-3-5-sonnet-20240620-v1:0 |
Llama 3 70B Instruct | meta.llama3-70b-instruct-v1:0 |
Mistral Large (2402) | mistral.mistral-large-2402-v1:0 |
Nuestra siguiente funci贸n es generate_optimized_query. En la cual establecemos un prompt en donde le indicamos que act煤e como un experto en optimizaci贸n, tomando como insumo una sentencia de SQL y la informaci贸n del schema correspondiente. En el mismo limito la respuesta a un m谩ximo de 500 tokens y formo el JSON de acuerdo a la especificaci贸n que requiere Claude 3.5 Sonnet.
DELIMITER //
CREATE FUNCTION generate_optimized_query(input_query TEXT, schema_info TEXT)
RETURNS TEXT
BEGIN
DECLARE result TEXT;
DECLARE prompt TEXT;
DECLARE json_payload TEXT;
SET prompt = CONCAT('Act煤a como un experto en optimizaci贸n de bases de datos MySQL. ',
'Dada la siguiente consulta SQL y la informaci贸n del esquema, ',
'proporciona una versi贸n optimizada de la consulta. ',
'Solo devuelve la consulta optimizada, sin explicaciones. ',
'Consulta original: "', input_query, '" ',
'Informaci贸n del esquema: "', schema_info, '"');
SET json_payload = JSON_OBJECT(
'anthropic_version', 'bedrock-2023-05-31',
'max_tokens', 500,
'messages', JSON_ARRAY(
JSON_OBJECT(
'role', 'user',
'content', JSON_ARRAY(
JSON_OBJECT(
'type', 'text',
'text', prompt
)
)
)
)
);
SET result = invoke_sonnet(json_payload);
RETURN JSON_UNQUOTE(JSON_EXTRACT(result, '$.content[0].text'));
END //
DELIMITER ;
Una forma sencilla de saber cu谩l es el JSON esperado por cada modelo es ir a la consola de Bedrock, seleccionar la lista de proveedores, dar clic al modelo de inter茅s, y en la parte inferior se tiene un ejemplo del API.
Para nuestra prueba, enviar茅 una instrucci贸n de SQL a nuestro asistente para validar su comportamiento:
CALL analyze_and_optimize_query('
SELECT c.first_name, c.last_name,
COUNT(r.rental_id) as rental_count,
SUM(p.amount) as total_spent
FROM customer c
JOIN rental r ON c.customer_id = r.customer_id
JOIN payment p ON r.rental_id = p.rental_id
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film f ON i.film_id = f.film_id
WHERE f.rating = "PG" AND YEAR(r.rental_date) = 2005
GROUP BY c.customer_id
HAVING rental_count > 5
ORDER BY total_spent DESC
LIMIT 10
');
El resultado que obtenemos es el siguiente:
Sentencia | Consulta | Tiempo de Ejecuci贸n |
---|---|---|
Original | SELECT c.first_name, c.last_name, COUNT(r.rental_id) as rental_count, SUM(p.amount) as total_spent FROM customer c JOIN rental r ON c.customer_id = r.customer_id JOIN payment p ON r.rental_id = p.rental_id JOIN inventory i ON r.inventory_id = i.inventory_id JOIN film f ON i.film_id = f.film_id WHERE f.rating = "PG" AND YEAR(r.rental_date) = 2005 GROUP BY c.customer_id HAVING rental_count > 5 ORDER BY total_spent DESC LIMIT 10 | 0.070305 |
Optimizada | SELECT c.first_name, c.last_name, COUNT(r.rental_id) as rental_count, SUM(p.amount) as total_spent FROM customer c JOIN rental r ON c.customer_id = r.customer_id JOIN payment p ON r.rental_id = p.rental_id JOIN inventory i ON r.inventory_id = i.inventory_id JOIN film f ON i.film_id = f.film_id WHERE f.rating = 'PG' AND r.rental_date >= '2005-01-01' AND r.rental_date < '2006-01-01' GROUP BY c.customer_id HAVING rental_count > 5 ORDER BY total_spent DESC LIMIT 10 | 0.052826 |
驴El resultado? Una mejora del 24.86% en el tiempo de ejecuci贸n. 隆Nada mal para unos minutos de trabajo!
Vayamos un poco m谩s all谩, si modifico el prompt y le pido que justifique sus cambios; obtenemos la siguiente argumentaci贸n:
- Eliminaci贸n de comillas dobles: Cambiamos las comillas dobles a comillas simples en
f.rating = 'PG'
para seguir las mejores pr谩cticas de SQL. - Optimizaci贸n del HAVING: Cambiamos
HAVING rental_count > 5
porHAVING COUNT(r.rental_id) > 5
. Esto evita el uso de un alias en la cl谩usula HAVING, lo que puede ser m谩s eficiente en algunos motores de bases de datos. - Optimizaci贸n del ORDER BY: Cambiamos
ORDER BY total_spent DESC
porORDER BY SUM(p.amount) DESC
. Al igual que con HAVING, usar la expresi贸n directamente en lugar del alias puede ser m谩s eficiente en algunos casos. -
脥ndices: Aunque no podemos crear 铆ndices en esta consulta, aseg煤rate de que existan 铆ndices en las columnas utilizadas en las cl谩usulas JOIN, WHERE y ORDER BY. Espec铆ficamente:
- customer_id en las tablas customer y rental
- rental_id en las tablas rental y payment
- inventory_id en las tablas rental e inventory
- film_id en las tablas inventory y film
- rating en la tabla film
- rental_date en la tabla rental
Particionamiento: Si la tabla rental es muy grande, considera particionarla por a帽o para mejorar el rendimiento de la cl谩usula
YEAR(r.rental_date) = 2005
.Materializaci贸n de vistas: Si esta consulta se ejecuta con frecuencia, considera crear una vista materializada que contenga los datos pre-agregados.
Estas optimizaciones deber铆an mejorar el rendimiento de la consulta, especialmente si se implementan junto con los 铆ndices adecuados y otras optimizaciones a nivel de base de datos.
Es una explicaci贸n bastante razonable, explica con detalle cada acci贸n y su justificaci贸n.
A partir de aqu铆 podemos seguir evolucionando nuestro asistente y enviarle m谩s contexto de la base de datos tales como 铆ndices, consultas en ejecuci贸n, cantidad de conexiones abiertas, entre muchas otras cosas. Esto permitir铆a potenciar a煤n m谩s las posibilidades que nos abre este asistente.
Conclusiones: El futuro es ahora
La integraci贸n de Amazon Bedrock con Aurora MySQL no es solo una mejora t茅cnica, es un salto enorme en c贸mo interactuamos con nuestras bases de datos:
- Optimizaci贸n autom谩tica: Imagina tener un DBA experto trabajando 24/7 en tus consultas.
- Aprendizaje continuo: Cada optimizaci贸n es una lecci贸n para tu equipo.
- Ahorro de tiempo y recursos: Menos tiempo debuggeando, m谩s tiempo innovando.
- Escalabilidad: A medida que tu base de datos crece, tu asistente crece contigo.
Pero esto es solo el comienzo. 驴Te imaginas integrar an谩lisis de sentimientos en tus consultas SQL? RDS Aurora MySQL y PostgreSQL tienen soporte para Amazon Comprehend.
驴O quiz谩s generar informes autom谩ticos basados en tus datos? Pues tambi茅n puedes integrarte con SageMaker. El l铆mite est谩 en nuestra imaginaci贸n.
Pr贸ximos pasos:
- 馃殌 Experimenta con diferentes modelos de Bedrock
- 馃搳 Crea dashboards que muestren las mejoras en el rendimiento de tus consultas
- 馃 Comparte tus experiencias y aprendizajes con la comunidad
隆Empieza a experimentar hoy mismo!
Conf铆o en que este art铆culo haya resultado de utilidad para ustedes y que los impulse a probar nuevas cosas en AWS!
Featured ones: