Construye un chatbot de Messenger con Llama
Este tutorial paso a paso muestra el proceso completo de construcción de un chatbot de Messenger habilitado con Llama. Un video de demostración del uso de la aplicación de Messenger para iOS para enviar una pregunta a una página de negocios de Facebook y recibir la respuesta generada por Llama 3 está aquí.
Si te interesa un chatbot de WhatsApp habilitado con Llama 3, consulta aquí para ver un tutorial.
Descripción general
Messenger de Meta es un servicio de mensajería que permite a una página de negocios de Facebook responder a personas interesadas en su negocio utilizando la Plataforma de Messenger. Los beneficios de un chatbot inteligente y con conocimientos impulsado por Llama 3 son obvios, incluyendo el ahorro de costos y una mejor experiencia del cliente, como la disponibilidad 24x7. En este tutorial, cubriremos los detalles de la integración de Llama 3 con la Plataforma de Messenger para construir un chatbot básico habilitado con Llama 3. Para más demostraciones de desarrollo e implementación de aplicaciones de Llama 3, como la integración de tus propios datos con Llama 3, consulta las recetas.
El siguiente diagrama muestra los componentes y el flujo de datos general de la demostración del chatbot de Messenger habilitado con Llama 3 que construimos, utilizando una instancia de Amazon EC2 como ejemplo para ejecutar el servidor web.

Primeros pasos con la Plataforma de Messenger
Se requiere una página de Facebook para enviar y recibir mensajes usando la Plataforma de Messenger; consulta aquí para obtener detalles sobre las páginas de Facebook y cómo crear una nueva página.
Si seguiste el tutorial del chatbot de WhatsApp con Llama, o si ya tienes una cuenta de desarrollador de Meta y una aplicación de negocios, puedes omitir este paso. De lo contrario, primero necesitas crear una cuenta de desarrollador de Meta y luego crear una aplicación de negocios.
Agrega el producto Messenger a tu aplicación de negocios yendo al Panel de control de tu aplicación de negocios, haz clic en "Agregar producto" y luego selecciona "Messenger".
Configura un webhook para recibir notificaciones HTTP en tiempo real: sigue la Guía de prueba de URL de devolución de llamada de ejemplo para Webhooks para crear una cuenta gratuita en glitch.com y obtener la URL de devolución de llamada de tu webhook, pero puedes omitir la parte de WHATSAPP_TOKEN en la guía; el resto de la configuración del webhook es la misma para WhatsApp y Messenger.
Abre la Configuración de la API de Messenger, como se muestra en la captura de pantalla a continuación, luego en "1. Configurar webhooks", establece la URL de devolución de llamada y el token de verificación configurados en el paso anterior, y suscribe todos los campos relacionados con mensajes para "Campos de Webhook". Finalmente, en "2. Generar tokens de acceso", conecta tu página de Facebook (consulta el paso 1) y copia tu token de acceso de página para usarlo más tarde.

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 o LlamaIndex, otro framework de creación de aplicaciones LLM, y otros proveedores de la nube de Llama 3 u opciones de implementación local para desarrollar aplicaciones de Llama 3, consulta las recetas.
Primero, creemos un nuevo entorno conda (o puedes usar venv si lo prefieres) e instalemos todos los paquetes requeridos:
conda create -n messenger-llama python=3.8
conda activate messenger-llama
pip install langchain replicate flask requests uvicorn gunicorn
Luego, crea un archivo Python llamado llama_messenger.py que crea una instancia de Llama 3 y define un método HTTP msgrcvd_page para:
- recibir el mensaje del usuario reenviado por el webhook;
- pedir a Llama 3 la respuesta;
- enviar la respuesta de vuelta al remitente usando la API de Facebook Graph.
import langchain
from langchain.llms import Replicate
from flask import Flask
from flask import request
import os
import requests
import json
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}
)
app = Flask(__name__)
@app.route('/msgrcvd_page', methods=['POST', 'GET'])
def msgrcvd_page():
message = request.args.get('message')
sender = request.args.get('sender')
recipient = request.args.get('recipient')
answer = llm(message)
url = f"https://graph.facebook.com/v18.0/{recipient}/messages"
params = {
'recipient': '{"id": ' + sender + '}',
'message': json.dumps({'text': answer}),
'messaging_type': 'RESPONSE',
'access_token': '<page_access_token>'
}
headers = {
'Content-Type': 'application/json'
}
response = requests.post(url, params=params, headers=headers)
return message + "<p/>" + answer
Reemplaza
Modificando el Webhook
Abre la URL de tu webhook de glitch.com creada anteriormente y cambia tu app.js para simplemente reenviar el mensaje del usuario y los ID de usuario y página enviados por la Plataforma de Messenger a la aplicación web habilitada con Llama 3 llama_messenger.py descrita en la sección anterior:
"use strict";
// Imports dependencies and set up http server
const request = require("request"),
express = require("express"),
body_parser = require("body-parser"),
axios = require("axios").default,
app = express().use(body_parser.json()); // creates express http server
// Sets server port and logs message on success
app.listen(process.env.PORT || 1337, () => console.log("webhook is listening"));
// Accepts POST requests at /webhook endpoint
app.post("/webhook", (req, res) => {
// Parse the request body from the POST
let body = req.body;
let sender = req.body["entry"][0]["messaging"][0]['sender']['id']
let recipient = req.body["entry"][0]["messaging"][0]['recipient']['id']
let message = req.body["entry"][0]["messaging"][0]['message']['text']
// Check if this is an event from a page subscription
if (body.object === "page") {
// Returns a '200 OK' response to all requests
res.status(200).send("EVENT_RECEIVED");
let url = "http://<web server public IP>:5000/msgrcvd_page?sender=" + sender + "&recipient=" + recipient + "&message=" + encodeURIComponent(message)
console.log(url)
axios.get(url)
.then(response => {
// Handle the response data
console.log(response.data);
})
.catch(error => {
// Handle errors
console.error('Axios error:', error);
});
} else {
// Return a '404 Not Found' if event is not from a page subscription
res.sendStatus(404);
}
});
// Accepts GET requests at the /webhook endpoint. You need this URL to setup webhook initially.
// info on verification request payload: https://developers.facebook.com/docs/graph-api/webhooks/getting-started#verification-requests
app.get("/webhook", (req, res) => {
/**
* UPDATE YOUR VERIFY TOKEN
*This will be the Verify Token value when you set up webhook
**/
const verify_token = process.env.VERIFY_TOKEN;
// Parse params from the webhook verification request
let mode = req.query["hub.mode"];
let token = req.query["hub.verify_token"];
let challenge = req.query["hub.challenge"];
// Check if a token and mode were sent
if (mode && token) {
// Check the mode and token sent are correct
if (mode === "subscribe" && token === verify_token) {
// Respond with 200 OK and challenge token from the request
console.log("WEBHOOK_VERIFIED: " + token);
res.status(200).send(challenge);
} else {
// Responds with '403 Forbidden' if verify tokens do not match
res.sendStatus(403);
}
}
});
Recuerda cambiar
Nota: Es posible e incluso recomendable implementar un webhook en Python y llamar a Llama 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 y envía la respuesta a Messenger.
Ejecutando el Chatbot
En tu servidor web, ejecuta el siguiente comando en una Terminal (consulta aquí para obtener más información sobre Gunicorn):
gunicorn -b 0.0.0.0:5000 llama_messenger: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.
Ahora puedes abrir tu aplicación de Messenger, seleccionar la página de Facebook que conectaste en la Configuración de la API de Messenger, ingresar un mensaje y recibir la respuesta de Llama 3 en breve, como se muestra en el video de demostración al principio de esta publicación.
Para depurar cualquier posible problema, ve al registro de tu aplicación glitch.com y copia la URL generada allí cuando se envía un mensaje de Messenger, que se ve así:
http://<web server public IP>:5000/msgrcvd_page?sender=<user id>&recipient=<page id>&message=<msg>
Luego, abre la URL en un navegador para verificar que tu servidor web pueda recibir el mensaje y los dos ID, y generar una respuesta de Llama antes de enviar la respuesta de vuelta a Messenger.