Elevando la atención al cliente con un Agente LLM de Viaje de Whatsapp.
Tags: python, langchain, aws, genia
Published: 2024-02-06 13:01:01

🇻🇪🇨🇱 [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)

---

This article was written with [Guillermo Ruiz](https://dev.to/iaasgeek)

Lo que fue un emocionante viaje a Las Vegas para una presentación como ponente en re:Invent 2023 se convirtió en un viaje inesperado a un destino desconocido. Un percance en la reserva provocó que el orador se llevara un billete de avión a Las Vegas, Nuevo México, en lugar de a la conocida Las Vegas.

Este divertidísimo error sentó las bases para investigar cómo las tecnologías avanzadas, como la IA generativa y [Retrieval Augmented Generation(RAG)](https://aws.amazon.com/what-is/retrieval-augmented-generation/) puede revolucionar los modelos tradicionales de canales de soporte, convirtiendo un complicado cambio de billete en una solución rápida a través de una conversación fluida.

Este blog te guiará para crear una aplicación de asistente de Whatsapp que utilice un asistente de LLM. Puede entender y comunicarse en varios idiomas, tanto escritos como hablados, con el objetivo de ofrecer asistencia de autoservicio a través de conversaciones naturales y recordar interacciones anteriores para resolver [problemas de viaje comunes](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/airline-qa-base). Capaz de comprobar el estado de los vuelos de los pasajeros, así como los datos relacionados con su viaje, con tu número de reserva o el identificador del pasajero.

> ✅ La aplicación WhatsApp Assistant está lista para desplegarse mediante [AWS Cloud Development Kit](https://aws.amazon.com/cdk). Encuentra el código en [Elevating Customer Support With Rag Langchain Agent Bedrock Dynamodb And Kendra](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra)
github repo.

## ¿Como funciona el Asistente de Viaje de Whatsapp?

Vamos a dividirlo en tres bloques principales:

![How The Travel Assistant Work](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2bgR9hrrRSScko7uymJC9SP3qOp.jpeg%3FimgSize%3D1582x238&w=1200&q=75  "Fig 1. Travel assistant High-level overview")


### 1. Entrada de mensaje y procesamiento inicial:

![How The Travel Assistant Work](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2bgRHkdCbLn9RxJaMRKwLLuCjoi.jpeg%3FimgSize%3D1174x478&w=1200&q=75 "Fig 1. Travel assistant High-level overview")

Un usuario envía un mensaje de texto o de voz a través de WhatsApp, el mensaje llega al [Amazon API Gateway](https://aws.amazon.com/api-gateway/), luego la AWS [AWS Lambda Function](https://aws.amazon.com/lambda/)  [whastapp_in](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/whatsapp_in/lambda_function.py)  se ejecuta para procesar nuevos mensajes de WhatsApp, extraer los detalles relevantes y escribirlos en [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html).


### 2. Procesamiento de mensaje según el formato:

![How The Travel Assistant Work](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2boQcJUWw7UNJbbgFS06FFFBLvs.jpeg%3FimgSize%3D1260x716&w=1200&q=75 "Fig 1. Travel assistant High-level overview")

La Función Lambda [process_stream](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/process_stream/lambda_function.py) [ se gatilla por eventos de DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html)  e identifica el formato del mensaje (texto o audio):

- *Si el mensaje es Texto:*
Una función Lambda llamada [API_bedrock_agents](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/langchain_agent_text/lambda_function.py) se activa, este es el corazón y el cerebro del asistente de viaje. Te lo explicaremos más adelante. 
- *Si el mensaje es Audio:* La Función Lambda [star_transcibe_job](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/audio_job_transcriptor/lambda_function.py) es activada. Esta función Lambda descarga el audio de WhatsApp del enlace del mensaje de un[Amazon S3 bucket](https://aws.amazon.com/s3), Bucket, mediante la autenticación, luego convierte el audio en texto con Amazon Transcribe [start_transcription_job](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/transcribe/client/start_transcription_job.html) API, que deja el archivo de transcripción en Output [Amazon S3 bucket](https://aws.amazon.com/s3). 

Función que invoca start_transcription_job se ve así:

```
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 
            )
```

> **Note**:Ten en cuenta que el parámetro [IdentifyLanguage](https://docs.aws.amazon.com/transcribe/latest/dg/lang-id.html) está configurado en True. Con esto Amazon Transcribe puede determinar el idioma principal del audio.

La función Lambda transcribe_done se activa una vez que se completa el trabajo de transcripción. Extrae la transcripción del depósito Output S3 y la envía al agente.   

### 3. Procesamiento y respuesta del LLM:

Aquí explicamos el corazón ❤️ y el cerebro 🧠 del asistente de viaje.

El asistente de viaje está gestionado por un [Langchain Agent](https://python.langchain.com/docs/modules/agents/), un framework para desarrollar aplicaciones de LLM, que utiliza la API [Amazon Bedrock](https://aws.amazon.com/bedrock/) para entender y responder a través del lenguaje natural invocando [foundational models](https://community.aws/posts/how-to-choose-your-llm). Este asistente de viaje emplea [Anthropic Claude](https://aws.amazon.com/bedrock/claude/), del cual el asistente adquiere capacidades multilingües.

Mediante el uso [Retrieval Augmented Generation (RAG)](https://docs.aws.amazon.com/sagemaker/latest/dg/jumpstart-foundation-models-customize-rag.html), el asistente puede extraer los detalles del pasajero de una tabla de [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) y responde preguntas sobre cómo resolver casos específicos en una base de conocimientos en [Amazon Kendra](https://aws.amazon.com/kendra/).

Para tener conversaciones fluidas que [recuerden mensajes anteriores](https://community.aws/posts/working-with-your-live-data-using-langchain), utilizamos el [Función Langchain para gestionar la memoria](https://python.langchain.com/docs/modules/memory/types/). Esta función almacena el contenido de las conversaciones en una tabla de DynamoDB llamada session_table. Para gestionar la duración de la sesión, utilizamos una tabla de DynamoDB llamada user_metadata, esta tabla almacena los metadatos del usuario y el inicio de la sesión, que se consultan y se comparan con una duración máxima de sesión definida durante cada interacción. Puedes cambiar la duración de la sesión [aquí](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/langchain_agent_text/lambda_function.py).
v

>📚 **Tip:** [Kenton Blacutt](https://github.com/KBB99), un AWS Associate Cloud App Developer, colaboró con Langchain para crear la [Amazon Dynamodb based memory class](https://github.com/langchain-ai/langchain/pull/1058) que nos permite almacenar el historial de un agente de Langchain en una tabla de [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).

![How The Travel Assistant Work](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2boQe7O7Bj4jw6JspgSwhpQayWs.jpeg%3FimgSize%3D1064x778&w=1200&q=75 "Fig 4. Travel assistant agent")

El agente invoca la Función Lambda query_table_passanger cuando necesita saber la información del pasajero o consultar user_metadata en la tabla de DynamoDB.

Cuando el agente termina de recopilar la respuesta, responde a WhatsApp a través de la Función Lambda[whatsapp_out](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/whatsapp_out/lambda_function.py) Lambda Function. 

## Let's Build The Travel Assistant

![How The Travel Assistant Work](images/diagram.png)

### Paso 0: Activar la cuenta de WhatsApp para desarrolladores de Facebook

1- [Empieza con la nueva plataforma WhatsApp Business](https://www.youtube.com/watch?v=CEt_KMMv3V8&list=PLX_K_BlBdZKi4GOFmJ9_67og7pMzm2vXH&index=2&t=17s&pp=gAQBiAQB)

2- [Cómo generar un token de acceso permanente — API de WhatsApp](https://www.youtube.com/watch?v=LmoiCMJJ6S4&list=PLX_K_BlBdZKi4GOFmJ9_67og7pMzm2vXH&index=1&t=158s&pp=gAQBiAQB)

3- [Empieza con la API de Messenger para Instagram](https://www.youtube.com/watch?v=Pi2KxYeGMXo&list=PLX_K_BlBdZKi4GOFmJ9_67og7pMzm2vXH&index=5&t=376s&pp=gAQBiAQB)

### Paso 1: Configuración inicial

✅ **Clona el repo**

```
git clone https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra.git
```

✅ **Go to**: 

```
cd customer-support-bot
```

✅ **Crea el ambiente virtual**:  siguiendo los pasos del  [README](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/README.md)

```
python3 -m venv .venv
```

```
source .venv/bin/activate
```
for windows: 

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

✅ **Install The Requirements**:

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

✅ **Set Values**:

En[customer_support_bot_stack.py](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/customer_support_bot/customer_support_bot_stack.py) edita esta línea con el número de la aplicación para desarrolladores de Facebook de WhatsApp: 

`
DISPLAY_PHONE_NUMBER = 'YOU-NUMBER'
`

Este agente mantiene el historial de la conversación, que está almacenado en `session_tabble` Amazon DynamoDB, también tienes la gestión de sesiones de control en el `session_active_tabble` de Amazon DynamoDB y establece la hora [here](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/langchain_agent_text/lambda_function.py) en esta linea:


`
if diferencia > 300:  #session time in seg
`

### Paso 2: Implementa la aplicación con el CDK.

Sigue los pasos [here](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/README.md)

✅ **Synthesize The Cloudformation Template With The Following Command**:

```
cdk synth
```

✅🚀 **The Deployment**:

```
cdk deploy
```

✅ **Review what is deployed in the stack:** 

- Ve a[AWS Cloudformation console](console.aws.amazon.com/cloudformation), selecciona la región en la que lo has implementado y haz clic en 
`CustomerSupportBotStack`:

![Amazon CloudFormation Stack](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2bgVDshxmdAcGFd9rDBskxSCF2Y.jpeg%3FimgSize%3D755x574&w=1200&q=75 "Fig 6. Amazon CloudFormation Stack")

✅ **Espera unos minutos:** 

Este stack crea automáticamente un índice de Amazon Kendra con la fuente de datos que contiene la [Base de datos de preguntas y respuestas de la aerolínea «La inventada»](/customer-support-bot/airline-qa-base), debes esperar unos minutos para que se sincronicen todos los datos.


![Amazon Kendra Data Sources](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2bgVai0ursn16VbVyAxK52pmq0H.jpeg%3FimgSize%3D1032x203&w=1200&q=75 "Fig 7. Amazon Kendra Data Sources")


### Paso 3: Activar la mensajería de WhatsApp en la aplicación

Ve a AWS Secrets Manager y edita la configuración de WhatsApp y sustitúyela por la configuración de desarrollador de Facebook.

![Digrama parte 1](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2bgVdqAVfSWy8GAzIP5U3VuQpC9.png%3FimgSize%3D800x626&w=1200&q=75 "Fig 8. Activate WhatsApp Messaging In The App")

### Paso 4: Configure Webhook In Facebook Developer Application


![Digrama parte 1](https://community.aws/_next/image?url=https%3A%2F%2Fassets.community.aws%2Fa%2F2bgVjOyFdrYRse0L8lv0PkFussE.png%3FimgSize%3D2004x1070&w=1200&q=75 "Fig 9. Configure Webhook In Facebook Developer Application")

## Let´s try!

✅ **Q&A:** 

Puedes empezar a pedir información del servicio de atención al cliente como si se tratara de la línea de atención al cliente de una aerolínea.


![Digrama parte 1](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/raw/main/imagen/QA.gif)

✅ **Passenger information:** 

El stack de CDK crea la tabla de DynamoDB llamada `Passenger_ID` con el [sample passenger dataset](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/tree/main/customer-support-bot/airline-dataset) [from Kaggle](https://www.kaggle.com/datasets/iamsouravbanerjee/airline-dataset). Selecciona uno y solicita información al respecto.

![Digrama parte 1](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/raw/main/imagen/passanger_information.gif "Fig 10. Request for information from the passenger")

> The multilanguage function depends on the [LLM you use](https://aws.amazon.com/bedrock).


✅ **Send it voice notes:**  

> [Amazon Transcribe](https://docs.aws.amazon.com/transcribe/latest/dg/lang-id.html) is able to automatically identify the languages spoken in your media without you having to specify a language code.

![Digrama parte 1](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/raw/main/imagen/voice_note.gif "Fig 11. Request for information to the passenger through a voice note")

¿Y si ahora cambio el idioma y pregunto en español?

La función multilingüe depende del LLM.

## 🚀 Continúa probando, juega con el Prompt de [esta función de Amazon Lambda](https://github.com/build-on-aws/elevating-customer-support-with-rag-langchain-agent-bedrock-dynamodb-and-kendra/blob/main/customer-support-bot/lambdas/code/langchain_agent_text/lambda_function.py) y ajústala según sus necesidades.


## Conclusiones

Si bien el viaje del orador a la ciudad equivocada de Las Vegas comenzó como una comedia de errores, también puso de relieve una importante oportunidad para reimaginar el servicio de atención al cliente.

WhatsApp Travel Assistant es la aplicación que el orador imaginó, una aplicación capaz de ofrecer una experiencia de autoservicio a los viajeros a través de conversaciones naturales.

El asistente de viaje de Whatsapp puede:

- Entiende las conversaciones en cualquier idioma, tanto escrito como hablado, y responde en el mismo idioma.
- Consulta una base de datos de conocimientos en Amazon Kendra y una tabla de Amazon DynamoDB con RAG.
- Ofrece respuestas sofisticadas según la consulta mediante RAG, consultando bases de datos de conocimiento en Amazon Kendra y tablas en Amazon DynamoDB.
- Gestiona la memoria de las conversaciones y guárdala en una tabla de Amazon DynamoDB.
- Gestionar el tiempo de sesión a través de una tabla de Amazon Dynamodb.

Te invitamos a crear esta aplicación, jugar con ella, mejorarla y contarnos cómo te fue.

¡Gracias! 👩🏻🧔🏻‍♂️


🚀 Algunos enlaces para que sigas aprendiendo y construyendo:

- [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)

- [Integrating Foundation Models into Your Code with Amazon Bedrock](https://www.youtube.com/watch?v=ab1mbj0acDo)

- [AWS Kendra LangChain Extensions](https://github.com/aws-samples/amazon-kendra-langchain-extensions/tree/main)

- [Prompt Engineering Techniques](https://www.promptingguide.ai/techniques)

- [Learn the fundamentals of generative AI for real-world applications](https://www.deeplearning.ai/courses/generative-ai-with-llms/)

- [LangChain for LLM Application Development](https://www.deeplearning.ai/short-courses/langchain-for-llm-application-development/)

- [Prompt engineering for foundation models](https://docs.aws.amazon.com/sagemaker/latest/dg/jumpstart-foundation-models-customize-prompt-engineering.html)


- [Prompt Engineering for Developers: How AI Can Help With Architecture Decisions](https://community.aws/posts/prompt-engineering-for-developers/how-ai-can-help-with-architecture-decisions)

- [Fun on a Friday with Prompt Engineering and thinking about re:Invent 2023](https://community.aws/posts/friday-fun-style-changing-reinvent-guide)


---

🇻🇪🇨🇱 [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)