Construyendo un asistente genAI de WhatsApp con Amazon Bedrock y Claude 3
Tags: python, español, aws, ai
Published: 2024-05-05 03:27:33


### El blog enseña a desplegar una aplicación de WhatsApp en Amazon Bedrock para chatear en cualquier idioma con un LLM. Envía notas de voz, obtén transcripciones y conversa con ellas. Anteriormente, utilizabas Claude 1 o 2. Ahora, aprovecha Claude 3 para conversaciones y contenido visual como imágenes, gráficos y diagramas.

![El diagrama ilustra un flujo de trabajo que integra servicios de AWS para procesar mensajes de WhatsApp](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/imagenes/image_claude_v2.gif?raw=true)

![El diagrama ilustra un flujo de trabajo que integra servicios de AWS para procesar mensajes de WhatsApp](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/raw/main/imagenes/gif_001.gif?raw=true)

En el blog anterior "[Construyendo un asistente genAI de WhatsApp con Amazon Bedrock](https://community.aws/content/2cjgSEay78GOI7rfc0gsuMWWHUD/building-a-whatsapp-genai-assistant-with-amazon-bedrock)", aprendiste cómo desplegar una aplicación de WhatsApp que te permite chatear en cualquier idioma utilizando Anthropic [Claude 1](https://www.anthropic.com/news/introducing-claude) o [2](https://www.anthropic.com/news/claude-2-1) como modelo de lenguaje grande (LLM) en Amazon Bedrock. Puedes enviar notas de voz y recibir transcripciones, e incluso, si lo prefieres, puedes dialogar con el modelo usando notas de voz.

En este nuevo blog, te mostraré cómo aprovechar las capacidades mejoradas de Anthropic [Claude 3](https://www.anthropic.com/news/claude-3-family) para manejar conversaciones de manera más efectiva mientras procesas de forma transparente contenido visual como fotos, gráficos, gráficas y diagramas técnicos.



### Ejemplo de Claude 3 manejando contenido visual

![El diagrama ilustra un flujo de trabajo que integra servicios de AWS para procesar mensajes de WhatsApp](https://assets.community.aws/a/2eIBcAyo337sd6eeIeGFbGApoZ1/demo-1-jpg.webp)

Claude 3 maneja contenido visual: Describe un diagrama.

![Claude 3 maneja el contenido visual: entrega un Json de una nota manuscrita.](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/imagenes/image_claude_v2.gif?raw=true)

Claude 3 maneja el contenido visual: entrega un Json de una nota manuscrita.

### Ejemplo de generación de texto de Claude 3

> ![Ejemplo de generación de texto de Claude 3: Solicitud para explicar cómo crear una aplicación compleja.](https://assets.community.aws/a/2eIBxb6XRMzuefe3hjivrQDOmS4/demo-4-jpg.webp)
>
> Ejemplo de generación de texto de Claude 3: Solicitud para explicar cómo crear una aplicación compleja.
>
> ![Ejemplo de generación de texto de Claude 3: respuesta sobre cómo construir una aplicación compleja \(parte 1\).](https://assets.community.aws/a/2eIC3wWh6N8SgZWzaWFOR4gxF97/demo-5-jpg.webp)
>
> Ejemplo de generación de texto de Claude 3: respuesta sobre cómo construir una aplicación compleja. (parte 1)

> ![Ejemplo de generación de texto Claude 3: respuesta sobre cómo construir una aplicación compleja \(parte 2\).](https://assets.community.aws/a/2eICBNtJIIwvCsIhEOxeRKPUdfk/demo-6-jpg.webp)
>
> Ejemplo de generación de texto Claude 3: respuesta sobre cómo construir una aplicación compleja (parte 2).
> 🔐 Sus datos permanecen almacenados de forma segura dentro de su cuenta de AWS y nunca se comparten ni se utilizan para fines de entrenamiento de modelos, garantizando la privacidad completa. Sin embargo, es recomendable evitar compartir información personal sensible, ya que no se puede garantizar la seguridad de los datos de WhatsApp.

✅ **Nivel de AWS**: 300

**Requisitos previos:**

* [Cuenta de AWS](https://aws.amazon.com/resources/create-account/?sc_channel=el&sc_campaign=datamlwave&sc_content=cicdcfnaws&sc_geo=mult&sc_country=mult&sc_outcome=acq)
* [Conocimientos básicos de Python](https://catalog.us-east-1.prod.workshops.aws/workshops/3d705026-9edc-40e8-b353-bdabb116c89c/)

💰 **Costo para completar**:

* [Precios de Amazon Bedrock](https://aws.amazon.com/bedrock/pricing/)
* [Precios de Amazon Lambda](https://aws.amazon.com/lambda/pricing/)
* [Precios de Amazon Transcribe](https://aws.amazon.com/transcribe/pricing/)
* [Precios de Amazon DynamoDB](https://aws.amazon.com/dynamodb/pricing/)
* [Precios de Amazon APIGateway](https://aws.amazon.com/api-gateway/pricing/)
* [Precios de Whatsapp](https://developers.facebook.com/docs/whatsapp/pricing/)

## Qué diferencia la llamada API de Claude 3 de sus versiones anteriores

En versiones anteriores, se utilizaba [Create a Text Completion](https://docs.anthropic.com/claude/reference/complete_post) (ahora API heredada). Para una generación de respuestas adecuada, necesitará formatear su prompt utilizando turnos conversacionales alternados `\n\nHuman: y \n\nAssistant:`.

Así es como se ve el código con Amazon Bedrock:

```python
import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime')

body = json.dumps({
"prompt": "\n\nHuman:explain black holes to 8th graders\n\nAssistant:",
"max_tokens_to_sample": 300,
"temperature": 0.1,
"top_p": 0.9,
})

modelId = 'anthropic.claude-v2'
accept = 'application/json'
contentType = 'application/json'

response = bedrock.invoke_model(body=body, modelId=modelId, accept=accept, contentType=contentType)

response_body = json.loads(response.get('body').read())
# text
print(response_body.get('completion'))
```

Con [Anthropic Claude 3](https://docs.anthropic.com/claude/reference/claude-on-amazon-bedrock), la conversación se maneja a través de [The Messages API](https://docs.anthropic.com/claude/reference/messages_post): `messages=[{"role": "user", "content": content}]`.

Cada mensaje de entrada debe ser un objeto con un `role` (usuario o asistente) y un `content`. El contenido puede ser una cadena única o una matriz de bloques de contenido, cada uno con su propio `type` designado (texto o imagen).

`type` igual a `text`:

```
{"role": "user", "content": [{"type": "text", "text": "Hola, Claude"}]}
```

`type` igual a `image`:

```
{"role": "user", "content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg...",
}
},
{"type": "text", "text": "¿Qué hay en esta imagen?"}
]}
```

> 🖼️ Anthropic actualmente admite el tipo de fuente base64 para imágenes, y los tipos de medios image/jpeg, image/png, image/gif e image/webp. Consulta [más ejemplos de entrada](https://docs.anthropic.com/claude/reference/messages-examples).

```python
import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime')

modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
anthropic_version = "bedrock-2023-05-31"
accept = 'application/json'
contentType = 'application/json'

with open(image_path, "rb") as image_file:
content_image = base64.b64encode(image_file.read()).decode('utf8')
content = [
{"type": "image", "source": {"type": "base64",
"media_type": "image/jpeg", "data": content_image}},
{"type":"text","text":"Hola Claude"}
]
body = {
"system": "Eres un Asistente de IA, siempre responde en el idioma original del texto del usuario.",
"messages":content,"anthropic_version": anthropic_version,"max_tokens":max_tokens}

response = bedrock.invoke_model(body=json.dumps(body), modelId=model_id, accept=accept, contentType=contentType)

response_body = json.loads(response.get('body').read())
```

Esta API de Mensajes nos permite agregar contexto o instrucciones al modelo a través de un [System Prompt](https://docs.anthropic.com/claude/docs/system-prompts) (`system`).

Así es como se ve el código con Amazon Bedrock:

```python
import boto3
import json
bedrock = boto3.client(service_name='bedrock-runtime')

modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
anthropic_version = "bedrock-2023-05-31"
accept = 'application/json'

contentType = 'application/json'

with open(image_path, "rb") as image_file:
    content_image = base64.b64encode(image_file.read()).decode('utf8')
content = [
    {"type": "image", "source": {"type": "base64",
                                  "media_type": "image/jpeg", "data": content_image}},
    {"type": "text", "text": text}
]
body = {
    "system": "Eres un Asistente de IA, siempre responde en el idioma original del texto del usuario.",
    "messages": content, "anthropic_version": anthropic_version, "max_tokens": max_tokens}

response = bedrock.invoke_model(body=json.dumps(body), modelId=model_id, accept=accept, contentType=contentType)

response_body = json.loads(response.get('body').read())

```

## Cómo funciona la aplicación

![La imagen muestra un proceso de 3 pasos de entrada, procesamiento de mensajes y salida de LLM para manejar texto, v](https://assets.community.aws/a/2eKLjLE43XVnFwFfafLFEwswEgG/flow-jpg.webp)

![Diagrama](https://assets.community.aws/a/2eKklqhlX73vP4VSV3WnCa4Rsij/arui.webp)

Desglosemos los componentes clave:

1. El sistema recibe entradas de usuario en forma de texto, voz o imágenes a través de WhatsApp.

2. Se realiza el procesamiento de mensajes según el formato de entrada (texto, voz o imagen).

3. Para el procesamiento de texto, la función Lambda [process_stream](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/process_stream/lambda_function.py) envía el texto del mensaje a otra [Función Lambda](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/agent_text_v3/lambda_function.py) que invoca un Modelo de Lenguaje Grande (LLM) a través de una llamada a la API de Amazon Bedrock. La respuesta del LLM se envía luego utilizando la función Lambda [whatsapp_out](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/transcriber_done/lambda_function.py), que la entrega al usuario a través de WhatsApp.

4. Para el procesamiento de voz, se activa la función Lambda [audio_job_transcriptor](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/audio_job_transcriptor/lambda_function.py). Esta función Lambda descarga el audio de WhatsApp desde el enlace en el mensaje a un bucket de [Amazon S3](https://aws.amazon.com/es/s3/), utilizando la autenticación de Token de WhatsApp. Luego convierte el audio a texto utilizando la API [start_transcription_job](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/transcribe/client/start_transcription_job.html) de [Amazon Transcribe](https://aws.amazon.com/transcribe/), que deja el archivo de transcripción en un bucket de salida de Amazon S3. La función Lambda [transcriber_done](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/transcriber_done/lambda_function.py) se activa mediante una notificación de evento de Amazon S3 una vez que se completa el [Trabajo de Transcripción](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_StartTranscriptionJob.html). Extrae la transcripción del bucket de salida de S3 y la envía a la función Lambda [whatsapp_out](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/transcriber_done/lambda_function.py) para responder a WhatsApp.

5. Para el procesamiento de imágenes, invoca a Claude 3 a través de una llamada a la API de Amazon Bedrock.

6. El sistema puede acceder a bases de datos como Amazon DynamoDB para recuperar información contextual como el historial de mensajes y las sesiones de usuario.

7. Después del procesamiento, el sistema genera una respuesta que se envía de vuelta al usuario a través de WhatsApp.

> ✅ Tienes la opción de descomentar el código en la función Lambda transcriber_done y enviar la transcripción de la nota de voz a la función Lambda agent_text_v3.

El siguiente prompt del sistema se utiliza:

```
Lo siguiente es una conversación amistosa entre un humano y una IA.
La IA es habladora y proporciona muchos detalles específicos de su contexto.
Si la IA no conoce la respuesta a una pregunta, dice con sinceridad que no lo sabe.
Responde siempre en el idioma original del usuario.

```

> 💡 La frase **"Siempre responder en el idioma original del usuario"** asegura que siempre responda en el idioma original y la capacidad multilingüe es proporcionada por [Anthropic Claude](https://aws.amazon.com/bedrock/claude/).

## 🚀 ¡Construyamos!

Sigue los [pasos](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/tree/main?tab=readme-ov-file#lets-build) en [https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python)

## 👾 ¡Disfruta de la aplicación!

Sigue los pasos en [build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python):

✅ Chatea y haz preguntas de seguimiento. Prueba tus habilidades multilingües.

![Digrama parte 1](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/imagenes/memory_2.gif?raw=true)

✅ Envía y transcribe notas de voz. Prueba las capacidades de la aplicación para transcribir múltiples idiomas.

![Digrama parte 1](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/imagenes/voice-note-2.gif?raw=true)

✅ Envía fotos y prueba las capacidades de la aplicación para describir e identificar lo que hay en las imágenes. Juega con los prompts.

![El diagrama ilustra un flujo de trabajo que integra servicios de AWS para procesar mensajes de WhatsApp](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/imagenes/image_claude_v2.gif?raw=true)

### 🚀 Sigue probando la aplicación, juega con el prompt y ajústalo a tus necesidades.

## 🧹 ¡Limpia la casa!:

Si terminas de probar y quieres limpiar la aplicación, solo tienes que seguir estos dos pasos:

1. Elimina los archivos del bucket de Amazon S3 creado en el despliegue.

2. Ejecuta este comando en tu terminal:

```
cdk destroy
```

## Conclusión:

En esta publicación, exploraste cómo construir una aplicación de WhatsApp impulsada por el modelo de lenguaje Claude 3 de Anthropic utilizando Amazon Bedrock. Aprovechaste la nueva API de Mensajes para manejar conversaciones e incorporar contenido visual como imágenes, gráficos y diagramas de manera fluida.

Con las capacidades avanzadas de Claude 3, puedes mantener conversaciones naturales y conscientes del contexto, comprendiendo y respondiendo tanto a entradas de texto como visuales. Ya sea que estés practicando un nuevo idioma, transcribiendo notas de voz o buscando información de diagramas técnicos, este asistente de WhatsApp está listo para ayudarte.

El poder de los grandes modelos de lenguaje combinado con la escalabilidad y facilidad de despliegue que ofrece Amazon Bedrock abre emocionantes posibilidades para construir interfaces conversacionales inteligentes y multimodales.

Si estás interesado en explorar otros casos de uso o profundizar en los detalles técnicos, asegúrate de revisar el [repositorio AWS Samples](https://github.com/aws-samples/amazon-bedrock-samples) para más proyectos y ejemplos de código. Además, la documentación de Anthropic y Amazon Bedrock son excelentes recursos para mantenerte actualizado con las últimas características y mejores prácticas.

Te animamos a experimentar con este chatbot de WhatsApp y compartir tus comentarios o ideas para mejoras en los comentarios a continuación. ¡Feliz codeo!

## 🚀 Algunos enlaces para que continúes aprendiendo y construyendo:

* [Comenzar con Amazon Connect](https://docs.aws.amazon.com/connect/latest/adminguide/amazon-connect-get-started.html)

* [Elevating Customer Support With a Whatsapp Assistant.](https://community.aws/content/2bgPgouKvLhinu8bcE4LZQ1nnwv/elevating-customer-support-with-a-whatsapp-travel-assistant-from-las-vegas-mexico-to-las-vegas-nevada-a-re-invent-2023-history)

* [RAG with history memory agents using Amazon Bedrock, Amazon Kendra, Amazon Lambda Function, and Amazon DynamoDB](https://github.com/build-on-aws/qa-agent-with-bedrock-kendra-and-history-memory)

* [How To Choose Your LLM](https://community.aws/posts/how-to-choose-your-llm)

* [Working With Your Live Data Using LangChain](https://community.aws/posts/working-with-your-live-data-using-langchain)