Construyendo un asistente genAI de WhatsApp con Amazon Bedrock
Tags: python, tutorial, ai, aws
Published: 2024-05-05 02:59:27

[Versión en inglés](https://community.aws/content/2cjgSEay78GOI7rfc0gsuMWWHUD/building-a-whatsapp-genai-assistant-with-amazon-bedrock)

### Chatea en cualquier idioma con un LLM en Bedrock. Envía notas de voz y recibe transcripciones. Con un pequeño ajuste en el código, envía la transcripción al modelo.


Con esta aplicación de WhatsApp, puedes chatear en cualquier idioma con un LLM en Amazon Bedrock. Envía notas de voz y recibe transcripciones. Realizando un pequeño cambio en el código, también puedes enviar la transcripción al modelo.

Tus datos se almacenarán de forma segura en tu cuenta de AWS y no se compartirán ni se utilizarán para el entrenamiento de modelos. No se recomienda compartir información privada, ya que la seguridad de los datos con WhatsApp no está garantizada.

✅ **Nivel de AWS**: Intermedio - 200

**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/)

## Cómo funciona la aplicación

![flujo](https://assets.community.aws/a/2cjnQx5AtP7VZnChPfEYBEgTJe6/flow-jpg.webp)

### 1- Entrada de mensaje:

![Entrada de mensaje](https://assets.community.aws/a/2cjoB2RQ1mYgVGpg3Ij2hmaSanC/1_step-jpg.webp)

1. WhatsApp recibe el mensaje: voz/texto.
2. [Amazon API Gateway](https://aws.amazon.com/api-gateway/) recibe el mensaje desde el [webhook de WhatsApp](https://business.whatsapp.com/blog/how-to-use-webhooks-from-whatsapp-business-api) (previamente autenticado).

3. Luego, una [función AWS Lambda](https://aws.amazon.com/es/pm/lambda) llamada [whatsapp_in](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/whatsapp_in/lambda_function.py) procesa el mensaje y lo envía a una tabla [Amazon DynamoDB](https://aws.amazon.com/pm/dynamodb/) llamada whatsapp-metadata para almacenarlo.

4. La tabla DynamoDB whtsapp-metadata tiene un [streaming de DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) configurado, que activa 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).

### 2 - Procesamiento de mensajes:

#### Mensaje de texto:

![Procesamiento de mensajes - Mensaje de texto](https://assets.community.aws/a/2cjoHkKpeQpmZH82iJeiwOEIQj5/2_1_step-jpg.webp)

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 la función Lambda llamada [langchain_agent_text](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/langchain_agent_text/lambda_function.py) (en el siguiente paso la exploraremos).

#### Mensaje de voz:

![Procesamiento de mensajes - Mensaje de voz](https://assets.community.aws/a/2cjoNgnZ6OBiKccXwQWC2qHnDT3/2_2_step-jpg.webp)

1. 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 en un bucket [Amazon S3](https://aws.amazon.com/es/s3/), utilizando la autenticación de Token de Whatsapp, luego convierte el audio a texto usando la API [start_transcription_job](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/transcribe/client/start_transcription_job.html) de Amazon Transcribe, que deja el archivo de transcripción en un bucket de salida de Amazon S3.

La función que invoca a audio_job_transcriptor se ve así:

```python
def start_job_transciptor(jobName, s3Path_in, OutputKey, codec):
    response = transcribe_client.start_transcription_job(
        TranscriptionJobName=jobName,
        IdentifyLanguage=True,
        MediaFormat=codec,
        Media={
            'MediaFileUri': s3Path_in
        },
        OutputBucketName=BucketName,
        OutputKey=OutputKey
    )
```

> 💡 Observa que el parámetro IdentifyLanguage está configurado como True. Amazon Transcribe puede determinar el idioma principal en el audio.

1. 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 con una [Notificación de Evento de Amazon S3 put item](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html) una vez que el trabajo de Transcribe se completa. 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.

> ✅ Tienes la opción de descomentar el código en 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) y enviar la transcripción de la nota de voz a la Función Lambda [langchain_agent_text](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/langchain_agent_text/lambda_function.py).

```python
try:
    response_3 = lambda_client.invoke(
        FunctionName=LAMBDA_AGENT_TEXT,
        InvocationType='Event', #'RequestResponse',
        Payload=json.dumps({
            'whats_message': text,
            'whats_token': whats_token,
            'phone': phone,
            'phone_id': phone_id,
            'messages_id': messages_id
        })
    )
    print(f'\nRespuesta: {response_3}')
    return response_3

except ClientError as e:
    err = e.response
    error = err
    print(err.get("Error", {}).get("Code"))
    return f"Un error invocando {LAMBDA_AGENT_TEXT}"
```

### 3- Procesamiento LLM:

![Procesamiento LLM](https://assets.community.aws/a/2cu96sN71r2bjyqJUZpga2FzPr0/3_step-jpg.webp)

El agente recibe el texto y realiza lo siguiente:

1. Consulta la tabla de Amazon DynamoDB llamada `user_metadata` para ver si la `session` ha expirado. Si está activa, recupera el `SessionID`, necesario para el siguiente paso; si expira, crea un nuevo temporizador de sesión.

2. Consulta la tabla de Amazon DynamoDB llamada `session Table` para ver si hay algún historial de conversación anterior.

3. Consulta el LLM a través de Amazon Bedrock utilizando el siguiente prompt:

```
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 honestamente que no la conoce.
Siempre responde en el idioma original del usuario.
Conversación actual:
{history}
Humano: {input}
Asistente:
```

4. Envía la respuesta a WhatsApp a través de la función Lambda `whatsapp_out`.

> 💡 La frase **"Siempre responde 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/), que es el modelo utilizado en esta aplicación.

## ¡Construyámoslo!

### Paso 0: Activar la cuenta de WhatsApp en Facebook Developers

1- [Get Started with the New WhatsApp Business Platform](https://www.youtube.com/watch?v=CEt_KMMv3V8&list=PLX_K_BlBdZKi4GOFmJ9_67og7pMzm2vXH&index=2&t=17s&pp=gAQBiAQB) (No se traduce)

2- [How To Generate a Permanent Access Token — WhatsApp API](https://www.youtube.com/watch?v=LmoiCMJJ6S4&list=PLX_K_BlBdZKi4GOFmJ9_67og7pMzm2vXH&index=1&t=158s&pp=gAQBiAQB) (No se traduce)

3- [Get started with the Messenger API for Instagram](https://www.youtube.com/watch?v=Pi2KxYeGMXo&list=PLX_K_BlBdZKi4GOFmJ9_67og7pMzm2vXH&index=5&t=376s&pp=gAQBiAQB) (No se traduce)

### Paso 1: Configuración de la APP

✅ **Clonar el repositorio**

git clone https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python

✅ **Ir a**:

cd private-assistant

### Paso 2: Desplegar la arquitectura con CDK.

![Arquitectura](https://assets.community.aws/a/2cu9GayyPEKN7weoALLpbcWVG2m/arquitectura-jpg.webp)

En [private_assistant_stack.py](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/private_assistant/private_assistant_stack.py) edita esta línea con el número de la aplicación de WhatsApp de Facebook Developer:

`DISPLAY_PHONE_NUMBER = 'TU-NUMERO'`

Este agente gestiona la memoria de la conversación, y debes configurar el tiempo de sesión [aquí](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/langchain_agent_text/lambda_function.py) en esta línea:

`if diferencia > 240: #tiempo de sesión en seg`

> **Consejo:** [Kenton Blacutt](https://github.com/KBB99), un Desarrollador Asociado de Aplicaciones en la Nube de AWS, colaboró con Langchain, creando la [clase de memoria basada en Amazon DynamoDB](https://github.com/langchain-ai/langchain/pull/1058) que nos permite almacenar el historial de un agente de langchain en [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html?sc_channel=el&sc_campaign=genaiwave&sc_content=working-with-your-live-data-using-langchain&sc_geo=mult&sc_country=mult&sc_outcome=acq).

  * Configura la [Interfaz de Línea de Comandos de AWS](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)

  * [Comenzando con AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html)

  * Despliega la arquitectura con CDK [Sigue los pasos:](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/README.md)

✅ **Crea el Entorno Virtual**: siguiendo los pasos en el [README](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/README.md)

```
python3 -m venv .venv
source .venv/bin/activate
```

para Windows:

```
.venv\Scripts\activate.bat
```

✅ **Instala los Requisitos**:

```
pip install -r requirements.txt
```

✅ **Sintetiza la Plantilla de CloudFormation con el siguiente comando**:

```
cdk synth
```

✅🚀 **El Despliegue**:

```
cdk deploy
```

![deployment_time](https://assets.community.aws/a/2cu9qSGjunaCuRwShAqUR2HzDOs/deployment_time-jpg.webp)


### Paso 3: Configuración de WhatsApp

Edita los valores de configuración de WhatsApp en Facebook Developer en la [consola de AWS Secrets Manager](https://console.aws.amazon.com/secretsmanager/).

![Secret](https://assets.community.aws/a/2cuA0JKrHkt34LcK5Ad1atPhYBy/secr.webp)

> ✅ El **token de verificación** es cualquier valor, pero debe ser el mismo en los pasos 3 y 4.

### Paso 4: Configuración del Webhook

1. Ve a la [Consola de Amazon API Gateway](https://console.aws.amazon.com/apigateway)

2. Haz clic en `myapi`.

3. Ve a **Stages** -> **prod** -> **/cloudapi** -> **GET**, y copia la **Invoke URL**.

4. Configura el Webhook en la aplicación de desarrollador de Facebook.

   * Establece la **Invoke URL**.

   * Establece el **verification token**.

![Invoke Url](https://assets.community.aws/a/2cuA7kw2oUDfWwjfjL8PLyVoPdX/invoke_url-jpg.webp)

***

## ¡Disfruta de la aplicación!:

✅ Chatea y haz preguntas de seguimiento. Prueba las habilidades de la aplicación para manejar múltiples idiomas.

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

🚀 Sigue probando la aplicación, juega con el prompt [langchain_agent_text](https://github.com/build-on-aws/building-gen-ai-whatsapp-assistant-with-amazon-bedrock-and-python/blob/main/private-assistant/lambdas/code/langchain_agent_text/lambda_function.py) de la función Lambda de Amazon y ajústalo a tus necesidades.

## Conclusión:

En este tutorial, desplegaste una aplicación sin servidor de WhatsApp que permite a los usuarios interactuar con un LLM a través de Amazon Bedrock. Esta arquitectura utiliza API Gateway como conexión entre WhatsApp y la aplicación. Las funciones Lambda de Amazon procesan el código para manejar las conversaciones. Las tablas de Amazon DynamoDB gestionan y almacenan la información de los mensajes, los detalles de la sesión y el historial de conversación.

Ahora tienes el código esencial para mejorar la aplicación. Una opción a seguir es incorporar [Retrieval-Augmented Generation (RAG)](https://aws.amazon.com/what-is/retrieval-augmented-generation/?nc1=h_ls) para generar respuestas más sofisticadas dependiendo del contexto.

Para manejar escenarios de servicio al cliente, la aplicación podría conectarse a [Amazon Connect](https://aws.amazon.com/connect/features/) y transferir llamadas a un agente si el LLM no puede resolver un problema.

Con un mayor desarrollo, esta arquitectura sin servidor demuestra cómo la IA conversacional puede potenciar experiencias de chat atractivas y útiles en plataformas de mensajería populares.

##🚀 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)

* [Elevando el Soporte al Cliente con un Asistente de Whatsapp.](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 con agentes de memoria histórica utilizando Amazon Bedrock, Amazon Kendra, Amazon Lambda Function y Amazon DynamoDB](https://github.com/build-on-aws/qa-agent-with-bedrock-kendra-and-history-memory)

* [Cómo Elegir Tu LLM](https://community.aws/posts/how-to-choose-your-llm) 

* [Trabajando Con Tus Datos En Vivo Utilizando LangChain](https://community.aws/posts/working-with-your-live-data-using-langchain)

----

## 🇻🇪🇨🇱 ¡Gracias!

🇻🇪🇨🇱 [Dev.to](https://dev.to/elizabethfuentes12) [Linkedin](https://www.linkedin.com/in/lizfue/) [GitHub](https://github.com/elizabethfuentes12/) [Twitter](https://twitter.com/elizabethfue12) [Instagram](https://www.instagram.com/elifue.tech) [Youtube](https://www.youtube.com/channel/UCr0Gnc-t30m4xyrvsQpNp2Q)
[Linktr](https://linktr.ee/elizabethfuentesleone)