Construyendo un chatbot de WhatsApp con Llama 3
Este tutorial paso a paso muestra el proceso completo de construcción de un chatbot de WhatsApp habilitado con Llama 3. Un video de demostración del uso de WhatsApp en iOS para enviar una pregunta a un número de teléfono de prueba y recibir la respuesta generada por Llama 3 está aquí.
Si te interesa un chatbot de Messenger habilitado con Llama 3, consulta aquí para ver un tutorial.
Resumen
Empresas de todos los tamaños pueden usar la API de WhatsApp Business para conectar a sus clientes con agentes humanos o chatbots impulsados por Llama 3. Los beneficios de un chatbot inteligente y con conocimientos son obvios, incluyendo el ahorro de costos y una mejor experiencia del cliente, como la disponibilidad 24/7. En este blog, cubriremos los detalles de la integración de Llama 3 con la API de WhatsApp Business para construir un chatbot básico habilitado con Llama 3.
El siguiente diagrama muestra los componentes y el flujo de datos general de la demostración del chatbot de WhatsApp habilitado con Llama 3 que construimos, usando una instancia de Amazon EC2 como ejemplo para ejecutar el servidor web.

Primeros pasos con la API de la Nube de WhatsApp Business
Primero, abre la Guía de inicio rápido de la API de la Nube de la Plataforma de WhatsApp Business y sigue los primeros cuatro pasos para:
- Agregar el producto WhatsApp a tu aplicación de negocio;
- Agregar un número de destinatario;
- Enviar un mensaje de prueba;
- Configurar un webhook para recibir notificaciones HTTP en tiempo real.
Para el último paso, debes seguir la Guía de URL de Callback de Ejemplo para Pruebas de Webhooks para crear una cuenta gratuita en glitch.com y obtener la URL de callback de tu webhook.
Ahora abre la página Meta for Developers Apps y selecciona la aplicación de negocio de WhatsApp, y deberías poder copiar el comando curl (como se muestra en el Panel de la aplicación - WhatsApp - Configuración de la API - Paso 2 a continuación) y ejecutar el comando en una Terminal para enviar un mensaje de prueba a tu WhatsApp.

Anota el "Token de acceso temporal", el "ID del número de teléfono" y "un número de teléfono de destinatario" en la página de Configuración de la API anterior, que se usarán más adelante.
Escribiendo la aplicación web habilitada con Llama 3
La aplicación web basada en Python que desarrollamos utiliza LangChain, un framework de desarrollo de LLM de código abierto, y Replicate, un proveedor de servicios que aloja modelos LLM en la nube, para recibir la consulta del usuario enviada por el webhook, que se cubrirá en la siguiente sección, pasar la consulta a Llama 3 y enviar la respuesta de Llama 3 de vuelta al webhook. Para obtener más información sobre cómo usar LangChain y Replicate para desarrollar aplicaciones de Llama 3, consulta las recetas; también puedes reemplazar Replicate con otras opciones de implementación de Llama que se muestran en las aplicaciones de demostración.
Primero, creemos un nuevo entorno conda (o puedes usar venv si lo prefieres) e instalemos todos los paquetes requeridos:
conda create -n whatsapp-llama python=3.8
conda activate whatsapp-llama
pip install langchain replicate flask requests uvicorn gunicorn
Luego, crea un archivo Python llamado llama_chatbot.py con el siguiente código, que define una clase WhatsAppClient y un método send_text_message para publicar un mensaje (la respuesta generada por Llama 3 a una consulta de usuario) en la API de la Nube de WhatsApp, que luego envía la respuesta de vuelta al usuario de WhatsApp. Recuerda establecer WHATSAPP_API_TOKEN y WHATSAPP_CLOUD_NUMBER_ID a los valores que guardaste en la sección anterior.
import langchain
from langchain.llms import Replicate
from flask import Flask
from flask import request
import os
import requests
import json
class WhatsAppClient:
API_URL = "https://graph.facebook.com/v17.0/"
WHATSAPP_API_TOKEN = "<Temporary access token from your WhatsApp API Setup>"
WHATSAPP_CLOUD_NUMBER_ID = "<Phone number ID from your WhatsApp API Setup>"
def __init__(self):
self.headers = {
"Authorization": f"Bearer {self.WHATSAPP_API_TOKEN}",
"Content-Type": "application/json",
}
self.API_URL = self.API_URL + self.WHATSAPP_CLOUD_NUMBER_ID
def send_text_message(self, message, phone_number):
payload = {
"messaging_product": 'whatsapp',
"to": phone_number,
"type": "text",
"text": {
"preview_url": False,
"body": message
}
}
response = requests.post(f"{self.API_URL}/messages", json=payload, headers=self.headers)
return response.status_code
Finalmente, agrega el siguiente código a llama_chatbot.py, que crea una instancia de Llama 3 y define un método HTTP msgrcvd para:
- recibir el mensaje del usuario reenviado por el webhook;
- pedir a Llama 3 la respuesta;
- llamar a `send_text_message` de
WhatsAppClientcon el número de teléfono de un destinatario.
os.environ["REPLICATE_API_TOKEN"] = "<your replicate api token>"
llama3_8b_chat = "meta/meta-llama-3-8b-instruct"
llm = Replicate(
model=llama3_8b_chat,
model_kwargs={"temperature": 0.0, "top_p": 1, "max_new_tokens":500}
)
client = WhatsAppClient()
app = Flask(__name__)
@app.route("/")
def hello_llama():
return "<p>Hello Llama 3</p>"
@app.route('/msgrcvd', methods=['POST', 'GET'])
def msgrcvd():
message = request.args.get('message')
answer = llm(message)
client.send_text_message(answer, "<a recipient phone number from your WhatsApp API Setup>")
return message + "<p/>" + answer
El script completo de llama_chatbot.py está aquí.
Ahora es el momento de modificar el webhook para completar toda la aplicación.
Modificando el Webhook
Abre la URL de tu webhook de glitch.com creada anteriormente, y después del fragmento de código en app.js:
// message received!
console.log(req.body["entry"][0]["changes"][0]["value"]["messages"][0]["text"]["body"]);
agrega el siguiente código; recuerda cambiar
let url = "http://<web server public IP>:5000/msgrcvd?message=" +
req.body["entry"][0]["changes"][0]["value"]["messages"][0]["text"]["body"]
axios.get(url)
.then(response => {
console.log(response.data);
})
.catch(error => {
console.error('Axios error:', error);
});
El código simplemente reenvía el mensaje del usuario recibido por la Plataforma de la Nube de WhatsApp a la aplicación web habilitada con Llama 3 llama_chatbot.py descrita en la sección anterior. Debido a que la funcionalidad de llamar a la API de la Nube de WhatsApp para enviar un mensaje se ha implementado en send_text_message en Python arriba, puedes comentar todo el siguiente fragmento de código en el app.js original:
'// info on WhatsApp text message payload: https://developers.facebook.com/docs/whatsapp/cloud-api/webhooks/payload-examples#text-messages
if (req.body.object) {
...
}
Nota: Es posible e incluso recomendable implementar un webhook en Python y llamar a Llama 3 directamente dentro del webhook, en lugar de hacer una solicitud HTTP, como lo hace el código JavaScript anterior, a una aplicación Python que llama a Llama 3 y envía la respuesta a WhatsApp.
Ejecutando el Chatbot
En tu servidor web, ejecuta el siguiente comando en una Terminal:
gunicorn -b 0.0.0.0:5000 llama_chatbot:app
Si usas Amazon EC2 como tu servidor web, asegúrate de haber agregado el puerto 5000 a las reglas de entrada del grupo de seguridad de tu instancia EC2. Anota la IP pública de tu servidor web, actualiza la URL a continuación con ella, luego abre la URL en un navegador para verificar que puedes ver la respuesta enviada a tu aplicación de WhatsApp, así como se muestra en el navegador:
http://<web server public IP>:5000/msgrcvd?message=who%20wrote%20the%20book%20godfather
Ahora puedes abrir tu aplicación de WhatsApp, ingresar una pregunta y recibir la respuesta de Llama 3 en breve, como se muestra en el video de demostración al principio de esta publicación.