DEV Community

Cover image for Construyendo un asistente genAI de WhatsApp con Amazon Bedrock y Claude 3
Elizabeth Fuentes L for AWS Español

Posted on • Originally published at community.aws

Construyendo un asistente genAI de WhatsApp con Amazon Bedrock y Claude 3

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

El diagrama ilustra un flujo de trabajo que integra servicios de AWS para procesar mensajes de WhatsApp

En el blog anterior "Construyendo un asistente genAI de WhatsApp con Amazon Bedrock", aprendiste cómo desplegar una aplicación de WhatsApp que te permite chatear en cualquier idioma utilizando Anthropic Claude 1 o 2 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 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

Claude 3 maneja contenido visual: Describe un diagrama.

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

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.

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\).

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\).

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:

💰 Costo para completar:

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

En versiones anteriores, se utilizaba Create a Text Completion (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:

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'))
Enter fullscreen mode Exit fullscreen mode

Con Anthropic Claude 3, la conversación se maneja a través de The Messages API: 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"}]}
Enter fullscreen mode Exit fullscreen mode

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?"}
]}
Enter fullscreen mode Exit fullscreen mode

🖼️ 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.

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())
Enter fullscreen mode Exit fullscreen mode

Esta API de Mensajes nos permite agregar contexto o instrucciones al modelo a través de un System Prompt (system).

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

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

Enter fullscreen mode Exit fullscreen mode

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

Diagrama

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 envía el texto del mensaje a otra Función Lambda 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, 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. Esta función Lambda descarga el audio de WhatsApp desde el enlace en el mensaje a un bucket de Amazon S3, utilizando la autenticación de Token de WhatsApp. Luego convierte el audio a texto utilizando la API start_transcription_job de Amazon Transcribe, que deja el archivo de transcripción en un bucket de salida de Amazon S3. La función Lambda transcriber_done se activa mediante una notificación de evento de Amazon S3 una vez que se completa el Trabajo de Transcripción. Extrae la transcripción del bucket de salida de S3 y la envía a la función Lambda whatsapp_out 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.

Enter fullscreen mode Exit fullscreen mode

💡 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.

🚀 ¡Construyamos!

Sigue los pasos en 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:

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

Digrama parte 1

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

Digrama parte 1

✅ 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

🚀 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
Enter fullscreen mode Exit fullscreen mode

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 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:

Top comments (0)