Costruire un chatbot Discord GPT-J/GPT-NeoX con NLP Cloud

È molto facile costruire un chatbot in un server Discord grazie a modelli di intelligenza artificiale come GPT-3, GPT-J e GPT-NeoX. In questo articolo vi mostriamo come codificare il vostro bot conversazionale in Node.js utilizzando GPT-J e GPT-NeoX attraverso l'API NLP Cloud.

Discord chatbot

Un Chatbot Discord?

Discord è una piattaforma di messaggistica ampiamente adottata. È sempre più comune vedere persone che creano il proprio server Discord per il loro progetto, in modo che la comunità si riunisca facilmente. Molte aziende hanno creato il proprio server Discord per promuovere la propria comunità di utenti.

Discord può essere ospitato autonomamente o utilizzato attraverso l'applicazione web Discord. L'aspetto positivo di Discord è che dispone di un'ampia API per interagire con il server ed è molto facile creare un chatbot che interagisca con gli utenti su Discord.

Molte persone creano chatbot su Discord in modo che gli utenti possano discutere con un'intelligenza artificiale di molte cose. È molto semplice integrare un chatbot nel proprio server Discord. Vediamo come fare!

GPT-3, GPT-J e GPT-NeoX

Negli ultimi 2 anni sono stati rilasciati diversi modelli AI di grande qualità: GPT-3, GPT-J e GPT-NeoX. Questi modelli sono davvero impressionanti e sono particolarmente adatti a gestire l'IA conversazionale (cioè i chatbot).

Con questi modelli si può discutere di qualsiasi cosa ed è abbastanza facile adattarli a una situazione specifica. Ad esempio, è possibile configurare il chatbot basato su GPT in modo che sia empatico, sarcastico o addirittura in grado di rispondere a domande specifiche sul proprio settore (medico, legale, marketing, ecc.).

L'unico problema è che questi modelli richiedono una grande potenza di calcolo, quindi poche persone possono permettersi di implementarli sul proprio server. NLP Cloud propone GPT-J e GPT-NeoX attraverso un'API, quindi nell'esempio seguente utilizzeremo questi modelli attraverso l'API di NLP Cloud.

Ottenere le chiavi API di Discord e NLP Cloud

Supponiamo che abbiate creato un account su Discord.com. Accedere al portale degli sviluppatori: qui. Selezionare "Nuova applicazione", assegnare un nome all'applicazione e crearla:

New Discord Application

Ora fate clic su "Aggiungi un bot" e recuperate il vostro token bot.

Ultimo passo: collegare il bot al server Discord. Per farlo, fare clic sul menu "OAuth2" e recuperare il proprio ID cliente:

Discord OAuth2

Quindi consentire al bot di accedere al server visitando il seguente URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (sostituire CLIENT_ID con il proprio ID cliente recuperato in precedenza).

Tutto è a posto sul lato Discord. Ora recuperiamo un token API di NLP Cloud!

Supponiamo che abbiate creato un account su NLP Cloud. È sufficiente recuperare il token API nella propria dashboard:

NLP Cloud Account

Quindi sottoscrivete il piano a pagamento che vi darà accesso ai modelli GPT-J e GPT-NeoX (i primi 100k token sono gratuiti, il che faciliterà i vostri test).

NLP Cloud Pay-as-you-go Plan

Ora potete iniziare a codificare il vostro bot Node.js!

Codice del server Node.js

Sia Discord che NLP Cloud hanno client Node.js, quindi lo sviluppo sarà molto semplice.

Ecco una prima versione:

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

Come si può vedere, per prima cosa recuperiamo i token di Discord e NLP Cloud dalle variabili d'ambiente. Quindi, per prima cosa esportate i vostri token in due variabili d'ambiente chiamate "NLPCLOUD_TOKEN" e "DISCORD_BOT_TOKEN". Se si preferisce, si può anche copiare e incollare il token direttamente nel codice durante i test.

Stiamo utilizzando il modello Fast GPT-J di NLP Cloud, un'implementazione più veloce di GPT-J, che è interessante per i chatbot, poiché di solito vogliamo che il tempo di risposta sia il più breve possibile. Se si desidera utilizzare GPT-NeoX 20B, è sufficiente utilizzare "gpt-neox-20b" invece di "fast-gpt-j".

La funzione "chatbot()" di NLP Cloud semplifica la gestione di un chatbot basato su un modello GPT, senza preoccuparsi di parametri complessi, prompting, apprendimento a pochi colpi, ecc. L'unico accorgimento è che dopo ogni risposta del chatbot dobbiamo mantenere la risposta in memoria e aggiungerla alla cronologia per le richieste successive. Se non lo facciamo, il chatbot non ricorderà mai la storia della conversazione!

Il nostro chatbot è ora funzionante. È sufficiente lanciare lo script (ad esempio con "node my_script.js") per vedere che il chatbot è online sul server Discord. Potete iniziare a parlargli davvero!

Tronca automaticamente la cronologia

Il nostro esempio funziona, ma c'è un punto debole: I modelli GPT non possono gestire più di 2048 token contemporaneamente (2048 token sono più o meno pari a 1700 parole). Quindi, a un certo punto la cronologia del chatbot potrebbe diventare troppo grande e sarà necessario troncarla! Ecco come fare:

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

Come si può vedere, ci assicuriamo semplicemente che la cronologia non sia troppo grande e, quando lo è, rimuoviamo gli elementi più vecchi!

In pratica, questo è raramente un problema, perché gli elementi più vecchi della cronologia sono raramente rilevanti per la conversazione. Ma se lo sono, è possibile implementare una strategia più avanzata che consiste nel mantenere e rimuovere selettivamente alcuni elementi in base alla loro rilevanza.

Conclusione

Costruire un chatbot avanzato non è mai stato così facile grazie ai modelli Discord e GPT.

La sfida principale è che questi moderni modelli di IA sono sempre più difficili da usare a causa delle loro enormi dimensioni, motivo per cui può essere molto più semplice e conveniente utilizzare un'API come NLP Cloud.

Se desiderate implementare il vostro chatbot ma non siete sicuri di come gestirlo, non esitate a contattarci!

Julien Salinas
CTO di NLP Cloud