Construire un Chatbot Discord GPT-J/GPT-NeoX avec NLP Cloud

Il est très facile de créer un chatbot dans un serveur Discord grâce à d'excellents modèles d'IA comme GPT-3, GPT-J et GPT-NeoX. Dans cet article, nous vous montrons comment coder votre propre robot conversationnel en Node.js en utilisant GPT-J et GPT-NeoX via l'API NLP Cloud.

Discord chatbot

Un Chatbot Discord ?

Discord est une plateforme de messagerie largement adoptée. Il est de plus en plus courant de voir des personnes créer leur propre serveur Discord pour leur projet afin de permettre à une communauté de se réunir facilement. De nombreuses entreprises ont même créé leur propre serveur Discord afin d'encourager leur propre communauté d'utilisateurs.

Discord peut être soit auto-hébergé, soit utilisé via l'application Web Discord. L'un des avantages de Discord est qu'il dispose d'une API complète pour interagir avec le serveur. Il est donc très facile de créer un chatbot qui interagira avec les utilisateurs sur Discord.

De nombreuses personnes créent des chatbots sur Discord afin que les utilisateurs puissent discuter avec une IA sur de nombreux sujets. Il est très facile d'intégrer un chatbot dans votre serveur Discord. Voyons comment faire !

GPT-3, GPT-J, et GPT-NeoX

Au cours de ces deux dernières années, plusieurs modèles d'IA de grande qualité ont été publiés : GPT-3, GPT-J et GPT-NeoX. Ces modèles sont très impressionnants et sont particulièrement efficaces pour traiter l'IA conversationnelle (c'est-à-dire les chatbots).

Vous pouvez avoir une grande discussion sur littéralement n'importe quoi avec ces modèles, et il est assez facile d'adapter les modèles à une situation spécifique. Par exemple, vous pouvez configurer votre chatbot basé sur les TPG pour qu'il soit empathique, sarcastique, ou même bon pour répondre à des questions spécifiques sur votre propre secteur (médical, juridique, marketing, etc.).

Le seul problème est que ces modèles nécessitent une grande puissance de calcul, de sorte que peu de personnes peuvent se permettre de les déployer sur leur propre serveur. NLP Cloud propose GPT-J et GPT-NeoX via une API, nous allons donc utiliser ces modèles via l'API de NLP Cloud dans l'exemple suivant.

Obtenir les clés API de Discord et de NLP Cloud

Supposons que vous ayez créé un compte sur Discord.com. Allez sur le portail des développeurs : ici. Sélectionnez "Nouvelle application", nommez votre application et créez-la :

New Discord Application

Cliquez maintenant sur "Add a bot", et récupérez votre jeton de robot.

Dernière étape : lier votre bot à votre serveur Discord. Pour ce faire, cliquez d'abord sur le menu "OAuth2" et récupérez votre ID client :

Discord OAuth2

Autorisez ensuite votre robot à accéder à votre serveur en visitant l'URL suivante : https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (remplacez CLIENT_ID par votre propre ID client récupéré précédemment).

Tout est ok du côté de Discord. Maintenant, récupérons un jeton d'API NLP Cloud !

Supposons que vous ayez créé un compte sur NLP Cloud. Il suffit de récupérer votre jeton API dans votre tableau de bord :

NLP Cloud Account

Ensuite, souscrivez au plan payant qui vous donnera accès aux modèles GPT-J et GPT-NeoX (les 100 premiers jetons sont gratuits, ce qui facilitera vos tests).

NLP Cloud Pay-as-you-go Plan

Vous pouvez maintenant commencer à coder votre robot Node.js !

Coder le serveur Node.js

Discord et NLP Cloud ont tous deux des clients Node.js, le développement sera donc très facile.

Voici une première version :

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']}`});
        
    })();
    });

Comme vous pouvez le voir, nous récupérons d'abord le jeton Discord et NLP Cloud à partir de variables d'environnement. Donc, exportez d'abord vos jetons dans 2 variables d'environnement appelées "NLPCLOUD_TOKEN" et "DISCORD_BOT_TOKEN". Vous pouvez aussi simplement copier-coller votre jeton directement dans le code pendant vos tests si vous préférez.

Nous utilisons le modèle Fast GPT-J de NLP Cloud - une implémentation plus rapide de GPT-J - ce qui est intéressant pour les chatbots car nous souhaitons généralement que le temps de réponse soit aussi court que possible. Si vous souhaitez utiliser GPT-NeoX 20B, utilisez simplement "gpt-neox-20b" au lieu de "fast-gpt-j".

La fonction "chatbot()" de NLP Cloud permet de manipuler facilement un chatbot basé sur un modèle GPT sans s'embarrasser de paramètres complexes, de messages-guides, d'apprentissage en quelques coups, etc. Le seul problème est qu'après chaque réponse du chatbot, nous devons garder la réponse en mémoire et l'ajouter à l'historique pour les requêtes suivantes. Si nous ne le faisons pas, le chatbot ne se souviendra jamais de l'historique de la conversation !

Notre chatbot est maintenant opérationnel. Il suffit de lancer votre script (avec "node my_script.js" par exemple) et vous devriez voir que votre chatbot est en ligne sur votre serveur Discord. Vous pouvez commencer à lui parler pour de vrai !

Tronquer automatiquement l'historique

Notre exemple fonctionne mais il y a une faiblesse : Les modèles GPT ne peuvent pas gérer plus de 2048 tokens en même temps (2048 tokens sont plus ou moins égaux à 1700 mots). Donc, à un moment donné, l'historique de votre chatbot peut devenir trop important et vous devrez le tronquer ! Voici comment vous pouvez le faire :

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

Comme vous pouvez le constater, nous nous assurons simplement que l'historique n'est pas trop grand, et lorsqu'il l'est, nous supprimons les éléments les plus anciens !

En pratique, c'est rarement un problème car les éléments les plus anciens de l'historique sont rarement pertinents pour la conversation. Mais s'ils le sont, vous pouvez également mettre en œuvre une stratégie plus avancée qui consiste à conserver et à supprimer sélectivement certains éléments en fonction de leur pertinence.

Conclusion

Construire un chatbot avancé n'a jamais été aussi facile grâce aux modèles Discord et GPT.

Le principal problème est que ces modèles d'IA modernes sont de plus en plus difficiles à utiliser en raison de leur taille énorme. C'est pourquoi il peut être beaucoup plus simple et beaucoup plus rentable d'utiliser une API comme NLP Cloud à la place.

Si vous souhaitez mettre en œuvre votre propre chatbot mais que vous ne savez pas comment vous y prendre, n'hésitez pas à nous contacter !

Julien Salinas
Directeur technique de NLP Cloud