Todos hemos soñado con tener un asistente virtual que nos ayude a completar nuestras tareas alguna vez. Este deseo se ha plasmado tanto en libros, películas de ciencia ficción y juegos de todo tipo a lo largo del tiempo.
Para nuestra sorpresa, esta opción ya está disponible para el público en general, claro, de manera limitada respecto a lo que nuestra imaginación ha podido crear en el campo de la ciencia ficción, pero el camino está claro y trazado; creo que todos sabemos a dónde nos lleva, o al menos a dónde deseamos que nos lleve.
Es seguro que todos queremos una IA que haga todo por nosotros, excepto en la toma de decisiones que involucran el resultado final; en sí, nosotros le decimos a la IA qué queremos y esperamos que lo subyacente a esto se dé sin que tengamos siquiera que enterarnos de cómo fue desarrollado, o bueno, sí queremos que el desarrollo esté disponible para analizarlo, pero solo cuando sea necesario.
Lo descrito anteriormente ya es posible, reiterando que aún está sujeto a las limitaciones inherentes al avance de la tecnología actual, que irá mejorando sin duda alguna. El nombre que se le ha dado a esta tecnología es “Inteligencia Artificial Generativa” o Gen AI, por sus siglas en inglés.
¿Qué es la IA Generativa?
La inteligencia artificial generativa (AI generativa) es un tipo de inteligencia artificial que tiene la capacidad de crear contenido nuevo y original, como texto, imágenes, música y otros tipos de medios. Funciona a través de algoritmos avanzados que analizan y aprenden de grandes conjuntos de datos para producir nuevas muestras que son coherentes y relevantes en relación con esos datos.
Algunos ejemplos de AI generativa incluyen:
Modelos de lenguaje: Como GPT, que pueden escribir textos, responder preguntas o mantener conversaciones.
Redes generativas adversariales (GAN): Utilizadas para crear imágenes realistas a partir de ruido inicial.
Música generativa: Algoritmos que pueden componer piezas musicales originales.
Aún siendo algo nuevo (para el público en general), la IA generativa ya se utiliza en diversas aplicaciones, desde la creación de arte hasta la escritura de guiones o incluso el diseño de productos. Está revolucionando muchos campos creativos e industriales.
Para personas como yo, que trabajan con tecnología día a día, es una ventaja enorme, porque nos ahorra una buena cantidad de tiempo al momento de buscar información sobre alguna herramienta específica, cómo usarla y hasta generar el diseño y la lógica para lograr el objetivo. Aquí nuevamente reitero que, debido a nuestra “experticia” en el área, sabemos lo que queremos y lo que debemos hacer para resolver el problema. Con esto en mente, simplemente escribimos las instrucciones y esperamos el resultado. A esto se le llama ingresar el “prompt” en la interfaz de la IA generativa (sea cual sea). Mientras más detallado y conciso sea el “prompt”, mejor será el resultado deseado.
El proceso descrito anteriormente funciona para un usuario regular, que ingresa un requerimiento y recibe un resultado. ¿Pero qué pasa cuando necesitamos incorporar esta IA en nuestros productos? ¿Cómo podemos programáticamente configurar y/o especializar la IA para incorporarla en nuestro producto y ofrecerla a nuestros usuarios?
¿Qué es Amazon Bedrock?
Amazon Bedrock es un servicio de Amazon Web Services (AWS) diseñado para facilitar la creación y escalado de modelos de inteligencia artificial generativa. Anunciado en la conferencia AWS re:Invent 2022, Bedrock permite a los desarrolladores acceder a modelos de IA generativa preentrenados de diferentes proveedores, como AI21 Labs, Anthropic y Stability AI, entre otros.
Las principales características de Amazon Bedrock incluyen:
Acceso a modelos preentrenados: Permite a los usuarios utilizar modelos de lenguajes y generación de imágenes ya entrenados sin necesidad de gestionar la infraestructura o la complejidad del entrenamiento.
Personalización: Los usuarios pueden adaptar estos modelos a sus necesidades específicas utilizando sus propios datos, lo que permite crear aplicaciones más alineadas con sus objetivos.
Escalabilidad: Bedrock está diseñado para ser altamente escalable, permitindo que las empresas implementen aplicaciones de IA generativa a gran escala.
Integración con servicios de AWS: Bedrock se integra fácilmente con otros servicios de AWS, lo que facilita su uso en aplicaciones existentes y su implementación en soluciones más amplias.
En resumen, Amazon Bedrock es una plataforma que simplifica y acelera el proceso de desarrollo de aplicaciones de inteligencia artificial generativa para empresas.
El propósito de este artículo es reunir en un solo lugar todos los pasos para configurar el acceso a los modelos de Amazon Bedrock, ya que, de otra manera, hay que visitar varias páginas de manuales y, finalmente, correr un pequeño ejemplo que demuestre su uso.
Configurar el acceso a Amazon Bedrock en AWS
Pre-requisitos
Crear una cuenta en AWS (si no tiene una).
Tener configurado el ambiente local con access keys o un profile para ejecutar comandos a través del AWS CLI.
Crear un rol en IAM con los permisos suficientes para acceder a los modelos fundacionales de Amazon Bedrock.
Requerir accesos a los modelos fundacionales que deseamos usar.
En éste articulo vamos a asumir que el lector ya tiene conocimientos de AWS y que ya tiene una cuenta.
Crear un rol en IAM
Voy a describir dos maneras de crear este rol. La primera es la regular, en una terminal usando AWS CLI.
La segunda es usando una herramienta de infraestructura como código llamada
Pulumi
. A los ingenieros nos gusta complicarnos la vida… Inicialmente pensé en hacerlo en Terraform, ya que la conozco muy bien, pero se me ocurrió la idea de aprender algo nuevo y perdí unos días trasteando con
Pulumi
. El código que compartiré no es perfecto, ni de cerca, pero funciona; prometo mejorarlo en cuanto mis habilidades con
Pulumi
se enriquezcan, ya que me gustó mucho.
Usando AWS CLI
El rol que necesitamos debe permitir delegar permisos, por lo tanto vamos a crear un archivo JSON con nombre TrustPolicy.json y vamos a agregar el siguiente contenido:
Ésto nos permitirá suscribirnos, desuscribirnos o listar nuestras subscripciones de modelos fundacionales en Amazon Bedrock. De esta salida copiamos la dirección ARN porque la usaremos pronto.
Finalmente creamos el rol y adjuntamos las políticas.
aws iam create-role \
--role-name Test-UserAccess-Role \
--assume-role-policy-document file://TrustPolicy.json
Adjuntamos la política de manejo de las subscripciones:
aws iam attach-role-policy \
--role-name Test-UserAccess-Role \
--policy-arn arn:aws:iam::123456789012:policy/bedrock-fms-access-policy
Sólo por propósitos de prueba agregaremos la política de acceso completo a Bedrock como menciona en la
documentación
, caso contrario deberíamos crear una política con permisos granulares.
aws iam attach-role-policy \
--role-name Test-UserAccess-Role \
--policy-arn arn:aws:iam::aws:policy/AmazonBedrockFullAccess
Para comprobar que esté correcto, describimos el rol:
No olvidar reemplazar el ID de la cuenta con el suyo.
Usando Pulumi
El setup para ejecutar ésta solución depende principalmente de Devbox, a partir de ahí todas las dependencias y las configuraciones deberían estar solventadas, excepto por algunas variables de entorno que pueden exponerse en el archivo .envrc si se tiene direnv instalado, de otra manera deben exportarse manualmente. Para más detalles leer el README.md.
After executing the Pulumi code, we can see the role has been created:
Role created
AWS Organizations
Para una estructura de cuentas AWS en AWS Organizations con usuarios y permisos manejados en una cuenta principal mediante AWS Identity Center es necesario crear un Permissions set y adjuntarlo a la cuenta donde se habilitarán los modelos fundacionales. Luego creamos un grupo al cuál adjuntamos el Permissions set y finalmente agregamos usuarios al grupo, éstos serán los que tengan acceso a los modelos de Bedrock.
La configuración del Permissions set debería ser similar a ésta, aunque vale recalcar que ésta configuración sólo es de prueba, en un ambiente de producción no debería agregarse la política AmazonBedrockFullAccess sino algo mucho más granular cumpliendo la regla del privilegio mínimo (least privilege).
Managed policies
Inline policy
Crear un Group en IAM y Agregar Usuarios
Para agregar un grupo en IAM podemos ejecutar el siguiente comando:
aws iam create-group --group-name iausers
Luego agregamos usuario(s):
aws iam add-user-to-group --user-name Walsen --group-name iausers
Se puede correr el comando previo por cada usuario a agregar o automatizar con un pequeño script leyendo los usuario de un archivo de texto.
#!/bin/bash
if[$# -ne 2];thenecho"Usage: $0 <users-file> <group-name>"echo"Example: $0 users.txt Developers"exit1fiUSERS_FILE="$1"GROUP_NAME="$2"if[ ! -f "$USERS_FILE"];thenecho"Error: File '$USERS_FILE' not found"exit1fiif ! aws iam get-group --group-name "$GROUP_NAME" >/dev/null 2>&1;thenecho"Error: Group '$GROUP_NAME' does not exist"exit1fiwhileIFS=read -r username ||[ -n "$username"];doif[ -z "$username"];thencontinuefiusername=$(echo"$username"| tr -d '[:space:]')echo"Adding user '$username' to group '$GROUP_NAME'..."if aws iam add-user-to-group --user-name "$username" --group-name "$GROUP_NAME" 2>/dev/null;thenecho"Successfully added '$username' to '$GROUP_NAME'"elseecho"Failed to add '$username' to '$GROUP_NAME'. User might not exist or you may not have sufficient permissions."fidone < "$USERS_FILE"echo"Process completed!"
Si hemos usado el método automatizado con Pulumi es posible modificarlo y agregar la funcionalidad para crear el grupo si no existe y agregar a los usuarios. Actualmente esa funcionalidad no existe.
Solicitar Acceso a los Modelos Fundacionales de Amazon Bedrock
Para solicitar acceso a uno o más modelos fundacionales podemos seguir los siguientes pasos:
En la consola de AWS cambiar de rol al previamente creado. (Podemos seguir los pasos descritos en la
documentación
para ésto).
Cambiar a la región de Virginia si no estamos ahí (us-east-1).
En la parte inferior izquiera del menú buscar Accesso a Modelos y seleccionarla.
Lista de modelos
En la página Acceso a Modelos, como se puede ver en la imágen se listan todos los modelos disponibles en Amazon Bedrock.
Por cada modelo en la tabla de Modelos Base es posible consultar el Contrato de licencia para el usuario final (EULA).
Para obtener acceso a los modelos tenemos las siguientes opciones:
Para solicitar el acceso a todos los modelos, elegimos Activar todos los modelos. La página que se abre, se rellenarán las casillas de verificación situadas junto a todos los modelos. Antrophyc requiere rellenar un formulario adicional. Nosotros iremos por ésta vía:
Todos los modelos elegidos
Para solicitar el acceso a modelos específicos, elegimos Activar modelos específicos. En la página que se abre, tendremos las siguientes opciones:
Para solicitar acceso a todos los modelos por parte de un proveedor, seleccionamos la casilla de verificación situada junto al nombre del proveedor.
Para solicitar acceso a un modelo, seleccionamos la casilla de verificación situada junto al nombre del modelo.
Puede tardar varios minutos en obtener el acceso. Cuando se concede el acceso a un modelo, el Estado de acceso de ese modelo pasa a ser Acceso concedido.
Acceso concedido
Probamos el Modelo Fundacional de Amazon: Titan G1 Large
Tenemos dos objetivos en éste test:
Listar los modelos disponibles.
Introducir un prompt sencillo y visualizar el resultado.
El script que usaremos está escrito en Python, su lógica es básica, dos métodos disponibles, uno para listar los modelos y otro para ejecutar el prompt.
Para la comunicación con Bedrock utilizaremos la librería Boto3 y recibiremos argumentos por línea de comando para especificar la opción que deseamos, para ello usaremos la librería argparse. Finalmente usamos la librería json para parsear los parámetros que enviamos y recibimos del modelo.
A continuación listamos el script:
importboto3importjsonimportargparsedefget_models():bedrock=boto3.client(service_name='bedrock',region_name='us-east-1')model_list=bedrock.list_foundation_models()print("\nAvailable Foundation Models:")print("-"*50)forxinrange(len(model_list.get('modelSummaries'))):print(f"{x+1}. {model_list.get('modelSummaries')[x]['modelId']}")print("-"*50)deftest_amazon_titan(prompt=None):"""
Test Amazon Titan model with a given prompt
"""ifnotprompt:prompt="What is Amazon Bedrock?"bedrock_rt=boto3.client(service_name='bedrock-runtime',region_name='us-east-1')configs={"inputText":prompt,"textGenerationConfig":{"maxTokenCount":4096,"stopSequences":[],"temperature":0,"topP":1}}body=json.dumps(configs)model_id='amazon.titan-tg1-large'accept='application/json'content_type='application/json'print(f"\nSending prompt: '{prompt}'")print("Waiting for response...\n")try:response=bedrock_rt.invoke_model(body=body,modelId=model_id,accept=accept,contentType=content_type)response_body=json.loads(response.get('body').read())print("Response:")print("-"*50)print(response_body.get('results')[0].get('outputText'))print("-"*50)exceptExceptionase:print(f"Error: {str(e)}")defmain():parser=argparse.ArgumentParser(description='AWS Bedrock CLI Tool')parser.add_argument('option',type=int,choices=[1,2],help='Choose option: 1 (list models) or 2 (test Titan)')parser.add_argument('--prompt',type=str,help='Prompt for Titan model (option 2 only)',default=None)args=parser.parse_args()ifargs.option==1:get_models()elifargs.option==2:test_amazon_titan(args.prompt)if__name__=="__main__":main()
Ejecución
Antes de ejecutar el script debemos asegurarnos de “asumir” el rol que hemos creado en la terminal. Si hemos usado el script en Pulumi el nombre del rol será diferente:
Si estamos en una cuenta federada, podemos iniciar sesión en el perfil:
aws configure sso --profile bedrock-test
Llenamos los datos de entrada que nos pide el script y finalmente exportamos el perfil al ambiente, como lo hicimos en la opción anterior.
A partir de aquí ya podemos empezar la prueba.
El pequeño script tiene una función de ayuda para mostrar al usuario la sintaxis para invocarlo.
Script help
Pasando el parámetro “1” listamos los modelos fundacionales.
FMs List
Si ejecutamos el script con el parámetro “2”, nos muestra la salida del prompt por defecto.
Standard Prompt
Pasando los parámetros “2” y “prompt” más una cadena de texto en lenguaje natural obtenemos un resultado personalizado. Cabe resaltar que pasamos el prompt en español y nuestra salida volvió en español igualmente.
Habilitar los modelos fundacionales es moroso; hay muchos pasos que seguir y mucha documentación que consultar, pero una vez logrado, Bedrock nos permite interactuar con muchos de los mejores modelos fundacionales existentes hoy en día. Este es solo el comienzo. Es verdad que hay soluciones que brindan acceso a plataformas donde uno solo debe arrastrar y soltar para que el agente o modelo esté listo, pero hay muchas cosas que no vemos que suceden por detrás. No digo que esa manera de crear soluciones sea mala, simplemente que, a cambio de velocidad y facilidad de construcción, renunciamos a bastante control y capacidad de personalización.
Bedrock nos permite, además, integrar fácilmente los modelos con otros servicios de AWS. Nos da un área de pruebas completamente aislada llamada
Partyrock
donde es posible crear aplicaciones solo ingresando el prompt en lenguaje natural y configurando algunas opciones.
El sueño de un asistente virtual está muy cerca y va más allá de solo eso; para las empresas con sistemas complejos, para la investigación e implementación de procesos, la IA generativa y los agentes vislumbran un futuro que desarrollará su potencial más allá de lo que alguna vez imaginamos.