Este proyecto sirve como base para que los desarrolladores extiendan sus casos de uso a través de varios modelos de lenguajes grandes (LLM) utilizando agentes de Amazon Bedrock. El objetivo es mostrar el potencial de aprovechar múltiples modelos en Bedrock para crear respuestas encadenadas que se adapten a diversos escenarios. Además de generar resultados basados en texto, esta aplicación también admite la creación y examen de imágenes mediante generación de imágenes y modelos de texto a imagen. Esta funcionalidad ampliada mejora la versatilidad de la aplicación, haciéndola adecuada para casos de uso más creativos y visuales.
Para aquellos que prefieren un enfoque de infraestructura como código (IaC), también proporcionamos una plantilla de AWS CloudFormation que configura los componentes principales, como un agente de Amazon Bedrock, un depósito S3 y una función Lambda. Si prefiere implementar este proyecto a través de AWS CloudFormation, consulte la guía del taller aquí.
Alternativamente, este README lo guiará a través del proceso paso a paso para instalar y configurar manualmente los agentes de Amazon Bedrock a través de la consola de AWS, brindándole la flexibilidad de experimentar con los últimos modelos y desbloquear completamente el potencial de los agentes de Bedrock.
La descripción general de alto nivel de la solución es la siguiente:
Configuración del agente y del entorno: la solución comienza configurando un agente de Amazon Bedrock, una función de AWS Lambda y un depósito de Amazon S3. Este paso establece las bases para la interacción del modelo y el manejo de datos, preparando el sistema para recibir y procesar indicaciones desde una aplicación de front-end. Procesamiento de mensajes e inferencia del modelo: cuando se recibe un mensaje de la aplicación front-end, el agente de Bedrock evalúa y envía el mensaje, junto con el ID del modelo especificado, a la función Lambda utilizando el mecanismo del grupo de acciones. Este paso aprovecha el esquema API del grupo de acciones para un manejo preciso de los parámetros, lo que facilita la inferencia efectiva del modelo basada en el mensaje de entrada. Manejo de datos y generación de respuestas: para tareas que involucran conversión de imagen a texto o de texto a imagen, la función Lambda interactúa con el depósito S3 para realizar las operaciones de lectura o escritura necesarias en imágenes. Este paso asegura el manejo dinámico del contenido multimedia, culminando en la generación de respuestas o transformaciones dictadas por el mensaje inicial.
En las siguientes secciones, lo guiaremos a través de:
AWS SAM (modelo de aplicación sin servidor) es un marco de código abierto que le ayuda a crear aplicaciones sin servidor en AWS. Simplifica la implementación, la administración y el monitoreo de recursos sin servidor como AWS Lambda, Amazon API Gateway, Amazon DynamoDB y más. Aquí encontrará una guía completa sobre cómo configurar y utilizar AWS SAM.
Framework simplifica el proceso de creación, implementación y administración de aplicaciones sin servidor al abstraer las complejidades de la infraestructura de la nube. Proporciona una forma unificada de definir y administrar sus recursos sin servidor mediante un archivo de configuración y un conjunto de comandos.
Cree un nuevo proyecto sin servidor con una plantilla de Python. En su terminal, ejecute: cd infer-models Luego ejecute serverless
Esto iniciará el proceso de creación de proyectos interactivos de Serverless Framework. Se le solicitarán varias opciones: Elija "Crear nueva aplicación Serverless". Seleccione la plantilla "aws-python3" y proporcione "infer-models" como nombre de su proyecto.
Esto creará un nuevo directorio llamado infer-models con una estructura de proyecto básica sin servidor y una plantilla de Python.
También es posible que se le solicite iniciar sesión/registrarse. seleccione la opción "Iniciar sesión/Registrarse". Esto abrirá una ventana del navegador donde podrá crear una nueva cuenta o iniciar sesión si ya tiene una. Después de iniciar sesión o crear una cuenta, elija la opción "Framework Open Source", que es de uso gratuito.
Si su pila no se implementa, comente la línea 2 del archivo serverless.yml.
Después de ejecutar el comando sin servidor y seguir las indicaciones, se creará un nuevo directorio con el nombre del proyecto (por ejemplo, infer-models), que contiene la estructura estándar y los archivos de configuración para el proyecto sin servidor.
Ahora instalaremos el complemento serverless-python-requirements: El complemento serverless-python-requirements ayuda a administrar las dependencias de Python para su proyecto Serverless. Instálalo ejecutando:
npm instala requisitos-python sin servidor —save-dev
3.) npx sls deploy
(ANTES DE EJECUTAR EL COMANDO ANTERIOR, SERÁ NECESARIO INSTALAR Y EJECUTAR EL MOTOR DOCKER. PUEDE ENCONTRAR MÁS INFORMACIÓN AQUÍ)
(Esto empaquetará e implementará la función AWS Lambda)
Inspeccione la implementación dentro de CloudFormation en la consola de AWS
Necesitamos proporcionar permisos al agente base para invocar la función lambda. Abra la función lambda y desplácese hacia abajo para seleccionar la pestaña Configuración . A la izquierda, seleccione Permisos . Desplácese hacia abajo hasta Declaraciones de políticas basadas en recursos y seleccione Agregar permisos.
Seleccione el servicio AWS en el medio para su declaración de política. Elija Otro para su servicio y coloque el agente permitido para StatementID. Para el director, escriba bedrock.amazonaws.com .
Ingrese arn:aws:bedrock:us-west-2:{aws-account-id}:agent/*
. Tenga en cuenta que AWS recomienda privilegios mínimos para que solo el agente autorizado pueda invocar esta función Lambda. Un * al final del ARN otorga a cualquier agente de la cuenta acceso para invocar este Lambda. Idealmente, no usaríamos esto en un entorno de producción. Por último, para la Acción, seleccione lambda:InvokeFunction y luego Guardar.
Para ayudar con la inferencia, aumentaremos la CPU/memoria en la función Lambda. También aumentaremos el tiempo de espera para permitir que la función tenga tiempo suficiente para completar la invocación. Seleccione Configuración general a la izquierda, luego Editar a la derecha.
Cambie la memoria a 2048 MB y el tiempo de espera a 1 minuto . Desplácese hacia abajo y seleccione Guardar.
Agents
. Proporcione un nombre de agente, como agente multimodelo, luego cree el agente. You are a research agent that interacts with various large language models. You pass the model ID and prompt from requests to large language models to create and store images. Then, the LLM will return a presigned URL to the image similar to the URL example provided. You also call LLMS for text and code generation, summarization, problem solving, text-to-sql, response comparisons and ratings. Remeber. you use other large language models for inference. Do not decide when to provide your own response, unless asked.
Después, asegúrese de desplazarse hasta la parte superior y seleccionar el botón Guardar antes de pasar al siguiente paso.
A continuación, agregaremos un grupo de acciones. Desplácese hacia abajo hasta Action groups
y luego seleccione Agregar . Llame al grupo de acción call-model
.
Para el tipo de grupo de acción, elija Definir con esquemas de API.
En la siguiente sección, seleccionaremos una función Lambda existente infer-models-dev-inferModel .
Para el esquema API, elegiremos Define with in-line OpenAPI schema editor
. Copie y pegue el esquema que aparece a continuación en el editor de esquemas OpenAPI en línea , luego seleccione Agregar : (This API schema is needed so that the bedrock agent knows the format structure and parameters required for the action group to interact with the Lambda function.)
{
"openapi": "3.0.0",
"info": {
"title": "Model Inference API",
"description": "API for inferring a model with a prompt, and model ID.",
"version": "1.0.0"
},
"paths": {
"/callModel": {
"post": {
"description": "Call a model with a prompt, model ID, and an optional image",
"parameters": [
{
"name": "modelId",
"in": "query",
"description": "The ID of the model to call",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "prompt",
"in": "query",
"description": "The prompt to provide to the model",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"multipart/form-data": {
"schema": {
"type": "object",
"properties": {
"modelId": {
"type": "string",
"description": "The ID of the model to call"
},
"prompt": {
"type": "string",
"description": "The prompt to provide to the model"
},
"image": {
"type": "string",
"format": "binary",
"description": "An optional image to provide to the model"
}
},
"required": ["modelId", "prompt"]
}
}
}
},
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"result": {
"type": "string",
"description": "The result of calling the model with the provided prompt and optional image"
}
}
}
}
}
}
}
}
}
}
}
Orchestration
, habilite la opción Override orchestration template defaults
. Here is an example of what a url response to access an image should look like:
URL Generated to access the image:
https://bedrock-agent-images.s3.amazonaws.com/generated_pic.png?AWSAccessKeyId=123xyz&Signature=rlF0gN%2BuaTHzuEDfELz8GOwJacA%3D&x-amz-security-token=IQoJb3JpZ2msqKr6cs7sTNRG145hKcxCUngJtRcQ%2FzsvDvt0QUSyl7xgp8yldZJu5Jg%3D%3D&Expires=1712628409
Este mensaje ayuda a proporcionar al agente un ejemplo de cómo formatear la respuesta de una URL prefirmada después de generar una imagen en el depósito de S3. Además, existe una opción para utilizar una función Lambda de analizador personalizado para un formato más granular.
Desplácese hasta el final y seleccione el botón Save and exit
.
Después, asegúrese de presionar nuevamente el botón Save and exit
en la parte superior, luego el botón Preparar en la parte superior de la interfaz de usuario del agente de prueba a la derecha. Esto nos permitirá probar los últimos cambios.
(Antes de continuar, asegúrese de habilitar todos los modelos a través de la consola Amazon Bedrock con los que planea realizar pruebas).
Para comenzar a probar, prepare el agente buscando el botón de preparación en la página del generador de agentes.
A la derecha, debería ver una opción para probar el agente con un campo de entrada del usuario. A continuación se muestran algunas indicaciones que puede probar. Sin embargo, le recomendamos que sea creativo y pruebe variaciones de las indicaciones.
Una cosa a tener en cuenta antes de realizar la prueba. Cuando realiza la conversión de texto a imagen o de imagen a texto, el código del proyecto hace referencia estática al mismo archivo .png. En un entorno ideal, este paso se puede configurar para que sea más dinámico.
Use model amazon.titan-image-generator-v1 and create me an image of a woman in a boat on a river.
Use model anthropic.claude-3-haiku-20240307-v1:0 and describe to me the image that is uploaded. The model function will have the information needed to provide a response. So, dont ask about the image.
Use model stability.stable-diffusion-xl-v1. Create an image of an astronaut riding a horse in the desert.
Use model meta.llama3-70b-instruct-v1:0. You are a gifted copywriter, with special expertise in writing Google ads. You are tasked to write a persuasive and personalized Google ad based on a company name and a short description. You need to write the Headline and the content of the Ad itself. For example: Company: Upwork Description: Freelancer marketplace Headline: Upwork: Hire The Best - Trust Your Job To True Experts Ad: Connect your business to Expert professionals & agencies with specialized talent. Post a job today to access Upwork's talent pool of quality professionals & agencies. Grow your team fast. 90% of customers rehire. Trusted by 5M+ businesses. Secure payments. - Write a persuasive and personalized Google ad for the following company. Company: Click Description: SEO services
(Si desea configurar una interfaz de usuario con este proyecto, continúe con el paso 6)
Necesitará tener un agent alias ID
, junto con el agent ID
para este paso. Vaya a la consola de administración de Bedrock, luego seleccione su agente multimodelo. Copie la Agent ID
en la parte superior derecha de la sección Agent overview
. Luego, desplácese hacia abajo hasta Alias y seleccione Crear . Nombra el alias a1
y luego crea el agente. Guarde el ID de alias generado, NO el nombre de alias.
ahora, regrese al IDE que utilizó para abrir el proyecto.
Navegue al directorio streamlit_app :
Actualizar configuración :
Abra el archivo invoke_agent.py .
En las líneas 19 y 20, actualice las variables agentId
y agentAliasId
con los valores apropiados y luego guárdelas.
Instale Streamlit (si aún no está instalado):
Ejecute el siguiente comando para instalar todas las dependencias necesarias:
pip install streamlit boto3 pandas
Ejecute la aplicación Streamlit :
streamlit_app
: streamlit run app.py
Recuerde que puede utilizar cualquier modelo disponible en Amazon Bedrock y no está limitado a la lista anterior. Si un ID de modelo no aparece en la lista, consulte los últimos modelos (ID) disponibles en la página de documentación de Amazon Bedrock aquí.
Puede aprovechar el proyecto proporcionado para ajustar y comparar esta solución con sus propios conjuntos de datos y casos de uso. Explore diferentes combinaciones de modelos, supere los límites de lo posible e impulse la innovación en el panorama en constante evolución de la IA generativa.
Consulte CONTRIBUCIÓN para obtener más información.
Esta biblioteca tiene la licencia MIT-0. Ver el archivo de LICENCIA.