Construir un chatbot de discordia GPT-J/GPT-NeoX con NLP Cloud

Es muy fácil construir un chatbot en un servidor de Discord gracias a grandes modelos de IA como GPT-3, GPT-J y GPT-NeoX. En este artículo, te mostramos cómo codificar tu propio bot conversacional en Node.js utilizando GPT-J y GPT-NeoX a través de la API de NLP Cloud.

Discord chatbot

¿Un chatbot de Discordia?

Discord es una plataforma de mensajería ampliamente adoptada. Cada vez es más común ver que la gente crea su propio servidor de Discord para su proyecto con el fin de que una comunidad se reúna fácilmente. De hecho, muchas empresas han creado su propio servidor de Discord para fomentar su propia comunidad de usuarios.

Discord puede ser auto-alojado o utilizado a través de la aplicación web de Discord. Una gran cosa con Discord es que tiene una amplia API para interactuar con el servidor, y es muy fácil crear un chatbot que interactuará con los usuarios en Discord.

Mucha gente crea chatbots en Discord para que los usuarios puedan discutir con una IA sobre muchas cosas. Es muy fácil integrar un chatbot en tu servidor de Discord. ¡Veamos cómo hacerlo!

GPT-3, GPT-J y GPT-NeoX

En estos dos últimos años, se han lanzado varios modelos de IA excelentes: GPT-3, GPT-J y GPT-NeoX. Estos modelos son muy impresionantes y son especialmente buenos para tratar la IA conversacional (es decir, los chatbots).

Con estos modelos se puede tener una gran conversación sobre literalmente cualquier cosa, y es bastante fácil adaptar los modelos a una situación específica. Por ejemplo, puedes configurar tu chatbot basado en GPT para que sea empático, sarcástico o incluso bueno para responder a preguntas específicas sobre tu propio sector (médico, legal, marketing, etc.).

El único problema es que estos modelos requieren mucha potencia de cálculo, por lo que poca gente puede permitirse desplegarlos en su propio servidor. NLP Cloud propone tanto GPT-J como GPT-NeoX a través de una API, por lo que vamos a utilizar estos modelos a través de la API de NLP Cloud en el siguiente ejemplo.

Obtenga las claves API de Discord y NLP Cloud

Supongamos que has creado una cuenta en Discord.com. Ve al portal de desarrolladores: aquí. Seleccione "Nueva aplicación", nombre su aplicación y créela:

New Discord Application

Ahora haz clic en "Añadir un bot", y recupera tu token de bot.

Último paso: enlaza tu bot con tu servidor de Discord. Para ello, primero haz clic en el menú "OAuth2" y recupera tu ID de cliente:

Discord OAuth2

A continuación, permita que su bot acceda a su servidor visitando la siguiente URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (sustituya CLIENT_ID por su propio ID de cliente recuperado anteriormente).

Todo está bien en el lado de Discord. Ahora vamos a recuperar un token de la API de NLP Cloud.

Supongamos que ha creado una cuenta en NLP Cloud. Simplemente recupere su token de API en su panel de control:

NLP Cloud Account

A continuación, suscríbase al plan de pago por uso que le dará acceso a los modelos GPT-J y GPT-NeoX (los primeros 100k tokens son gratuitos, lo que le facilitará las pruebas).

NLP Cloud Pay-as-you-go Plan

¡Ya puedes empezar a codificar tu bot Node.js!

Codificar el servidor Node.js

Tanto Discord como NLP Cloud tienen clientes Node.js, por lo que el desarrollo será muy fácil.

He aquí una primera versión:

const NLPCloudClient = require('nlpcloud');
const { Client, Intents } = require('discord.js');

// Load NLP Cloud token and Discord Bot token.
const nlpcloudToken = process.env.NLPCLOUD_TOKEN;
if (nlpcloudToken == null) {
    console.error('No NLP Cloud token received');
    process.exit();
}
const discordBotToken = process.env.DISCORD_BOT_TOKEN;
if (discordBotToken == null) {
    console.error('No Discord bot token received');
    process.exit();
}

// Initialize the NLP Cloud and Discord clients.
const nlpCloudClient = new NLPCloudClient('fast-gpt-j', nlpcloudToken, true)
const discordClient = new Client({intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES]});

let history = [];

discordClient.on("messageCreate", function(message) {
    if (message.author.bot) return;

    (async () => {
        // Send request to NLP Cloud.
        const response = await nlpCloudClient.chatbot(`${message.content}`, '', history);

        // Send response to Discord bot.
        message.reply(`${response.data['response']}`);

        // Add the request and response to the chat history.
        history.push({'input':`${message.content}`,'response':`${response.data['response']}`});
        
    })();
    });

Como puedes ver, primero recuperamos el token de Discord y NLP Cloud desde las variables de entorno. Así que primero exporta tus tokens en 2 variables de entorno llamadas "NLPCLOUD_TOKEN" y "DISCORD_BOT_TOKEN". También puedes simplemente copiar y pegar tu token directamente en el código durante tus pruebas si lo prefieres.

Estamos utilizando el modelo Fast GPT-J de NLP Cloud -una implementación más rápida de GPT-J- que es interesante para los chatbots, ya que normalmente queremos que el tiempo de respuesta sea lo más corto posible. Si quieres usar GPT-NeoX 20B, simplemente usa "gpt-neox-20b" en lugar de "fast-gpt-j".

La función "chatbot()" de NLP Cloud facilita el manejo de un chatbot basado en un modelo GPT sin tener que preocuparse de parámetros complejos, de avisos, de aprendizajes de pocos disparos, etc. El único truco es que después de cada respuesta del chatbot debemos mantener la respuesta en la memoria y añadirla al historial para las siguientes peticiones. Si no lo hacemos, ¡el chatbot nunca recordará el historial de la conversación!

Nuestro chatbot ya está funcionando. Simplemente lanza tu script (con "node my_script.js" por ejemplo) y deberías ver que tu chatbot está en línea en tu servidor de Discord. ¡Puedes empezar a hablar con él de verdad!

Truncar automáticamente el historial

Nuestro ejemplo funciona, pero hay un punto débil: Los modelos GPT no pueden manejar más de 2048 tokens al mismo tiempo (2048 tokens son más o menos igual a 1700 palabras). Así que en algún momento el historial de tu chatbot puede ser demasiado grande y tendrás que truncarlo. Así es como puedes hacerlo:

const NLPCloudClient = require('nlpcloud');
const { Client, Intents } = require('discord.js');

// Load NLP Cloud token and Discord Bot token.
const nlpcloudToken = process.env.NLPCLOUD_TOKEN;
if (nlpcloudToken == null) {
    console.error('No NLP Cloud token received');
    process.exit();
}
const discordBotToken = process.env.DISCORD_BOT_TOKEN;
if (discordBotToken == null) {
    console.error('No Discord bot token received');
    process.exit();
}

// Initialize the NLP Cloud and Discord clients.
const nlpCloudClient = new NLPCloudClient('fast-gpt-j', nlpcloudToken, true)
const discordClient = new Client({intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES]});

let history = [];
let charsCount = 0;

discordClient.on("messageCreate", function(message) {
    if (message.author.bot) return;

    (async () => {
        charsCount += `${message.content}`.length;

        // Send request to NLP Cloud.
        const response = await nlpCloudClient.chatbot(`${message.content}`, '', history);

        charsCount += `${response.data['response']}`.length;

        // Send response to Discord bot.
        message.reply(`${response.data['response']}`);

        // Add the request and response to the chat history.
        history.push({'input':`${message.content}`,'response':`${response.data['response']}`});
        
        // If the chat history is bigger than 1500 tokens, we remove the oldest elements from
        // the history. We consider that 1 token = 4 characters.
        // The theoretical GPT context limit is 2048 tokens but we choose 1500 tokens instead
        // in order to be safe since the tokens count is not perfectly accurate.
        while (charsCount > 1500 * 4) {
            charsCount -= history[0]['input'].length + history[0]['response'].length;
            history.shift();  
        }
    })();
    });


discordClient.login(discordBotToken);

Como puedes ver, simplemente nos aseguramos de que el historial no es demasiado grande, y cuando lo es, eliminamos los elementos más antiguos.

En la práctica, rara vez es un problema porque los elementos más antiguos del historial rara vez son relevantes para la conversación. Pero si lo son, también puedes implementar una estrategia más avanzada que consiste en mantener y eliminar selectivamente algunos elementos en función de su relevancia.

Conclusión

Construir un chatbot avanzado nunca ha sido tan fácil gracias a los modelos de Discord y GPT.

El principal reto es que estos modelos modernos de IA son cada vez más difíciles de utilizar debido a su enorme tamaño, por lo que puede ser mucho más sencillo y mucho más rentable utilizar una API como NLP Cloud en su lugar.

Si desea implementar su propio chatbot pero no está seguro de cómo manejarlo, ¡no dude en ponerse en contacto con nosotros!

Julien Salinas
CTO en NLP Cloud