Lección 25 · 5 min · Gratis

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

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

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

  3. 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".

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

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

  1. recibir el mensaje del usuario reenviado por el webhook;
  2. pedir a Llama 3 la respuesta;
  3. 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 con el token de acceso copiado en el paso 5 "Abrir la configuración de la API de Messenger" de la sección anterior. 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 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 , que debe ser visible públicamente, a la IP del servidor donde se ejecuta tu aplicación web habilitada con Llama 3 de la sección anterior.

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.

Lección del curso «Llama Cookbook (use cases)» de Meta, publicado con licencia MIT. Traducción y adaptación al español de IA con Clase. IA con Clase no está afiliado a Meta. Ver el original · Licencia
Esta lección es gratuita. El resto del curso se abre con la Membresía de IA con Clase, que incluye todos los cursos del catálogo. Ver precios