Bygg en GPT-J/GPT-NeoX Discord Chatbot med NLP Cloud

Det är mycket enkelt att bygga en chatbot på en Discord-server tack vare fantastiska AI-modeller som GPT-3, GPT-J och GPT-NeoX. I den här artikeln visar vi hur du kodar din egen samtalsbot i Node.js med hjälp av GPT-J och GPT-NeoX via NLP Cloud API.

Discord chatbot

En Discord Chatbot?

Discord är en allmänt använd meddelandeplattform. Det blir allt vanligare att folk skapar en egen Discord-server för sitt projekt så att en grupp lätt kan samlas. Många företag har faktiskt skapat en egen Discord-server för att främja sin egen användargrupp.

Discord kan antingen vara självhyst eller användas via Discords webbapplikation. En bra sak med Discord är att det har ett omfattande API för att interagera med servern, och det är mycket enkelt att skapa en chatbot som interagerar med användare på Discord.

Många skapar chattrobotar på Discord så att användarna kan diskutera med en AI om många saker. Det är mycket enkelt att integrera en chatbot i din Discord-server. Låt oss se hur du gör det!

GPT-3, GPT-J och GPT-NeoX

Under de senaste två åren har flera fantastiska AI-modeller släppts: GPT-3, GPT-J och GPT-NeoX. Dessa modeller är mycket imponerande och är särskilt bra när det gäller AI för konversation (dvs. chatbots).

Med dessa modeller kan man föra en bra diskussion om bokstavligen vad som helst, och det är ganska lätt att anpassa modellerna till en specifik situation. Du kan till exempel konfigurera din GPT-baserade chatbot så att den är empatisk, sarkastisk eller till och med bra på att svara på specifika frågor om din egen bransch (medicinsk, juridisk, marknadsföring osv.).

Det enda problemet är att dessa modeller kräver mycket beräkningskraft, så få människor har råd att installera dem på sin egen server. NLP Cloud erbjuder både GPT-J och GPT-NeoX via ett API, så vi kommer att använda dessa modeller via NLP Cloud API i följande exempel.

Skaffa API-nycklar för Discord och NLP Cloud

Låt oss anta att du har skapat ett konto på Discord.com. Gå till utvecklarportalen: här. Välj "Ny applikation", namnge applikationen och skapa den:

New Discord Application

Klicka nu på "Add a bot" (lägg till en bot) och hämta din bot-token.

Sista steget: koppla roboten till din Discord-server. För att göra detta klickar du först på menyn "OAuth2" och hämtar ditt klient-ID:

Discord OAuth2

Låt sedan din bot få tillgång till din server genom att besöka följande URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (ersätt CLIENT_ID med ditt eget klient-ID som du hämtade tidigare).

Allt är okej på Discord-sidan. Nu hämtar vi en NLP Cloud API-token!

Låt oss anta att du har skapat ett konto på NLP Cloud. Hämta helt enkelt din API-token i din instrumentpanel:

NLP Cloud Account

Prenumerera sedan på en pay-as-you-go plan som ger dig tillgång till modellerna GPT-J och GPT-NeoX (de första 100 000 token är gratis, vilket underlättar dina tester).

NLP Cloud Pay-as-you-go Plan

Du kan nu börja programmera din Node.js-bot!

Kodning av Node.js-servern

Både Discord och NLP Cloud har Node.js-klienter, så det är mycket enkelt att utveckla dem.

Här är en första 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']}`});
        
    })();
    });

Som du kan se hämtar vi först Discord- och NLP Cloud-token från miljövariabler. Exportera därför först dina tokens till två miljövariabler som heter "NLPCLOUD_TOKEN" och "DISCORD_BOT_TOKEN". Du kan också helt enkelt kopiera och klistra in din token direkt i koden under dina tester om du föredrar det.

Vi använder NLP Clouds Fast GPT-J-modell - en snabbare implementering av GPT-J - vilket är intressant för chattrobotar eftersom vi vanligtvis vill att svarstiden ska vara så kort som möjligt. Om du vill använda GPT-NeoX 20B använder du helt enkelt "gpt-neox-20b" i stället för "fast-gpt-j".

Funktionen "chatbot()" i NLP Cloud gör det enkelt att hantera en chatbot baserad på en GPT-modell utan att behöva bry sig om komplexa parametrar, uppmaningar, inlärning med några få skott osv. Det enda knepet är att vi efter varje chatbot-svar måste behålla svaret i minnet och lägga till det i historiken för följande förfrågningar. Om vi inte gör det kommer chattroboten aldrig att komma ihåg historiken för samtalet!

Vår chatbot fungerar nu. Starta helt enkelt ditt skript (med "node my_script.js" till exempel) och du bör se att din chatbot är online på din Discord-server. Du kan börja prata med den på riktigt!

Automatiskt avbryta historiken

Vårt exempel fungerar, men det finns en svaghet: GPT-modellerna kan inte hantera mer än 2048 tokens samtidigt (2048 tokens är mer eller mindre lika med 1700 ord). Så vid någon tidpunkt kan din chattbothistorik bli för stor och du kommer att behöva avbryta den! Här är hur du kan göra det:

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

Som du kan se ser vi helt enkelt att historiken inte är för stor, och när den är det tar vi bort de äldsta elementen!

I praktiken är det sällan ett problem eftersom de äldsta delarna av historien sällan är relevanta för samtalet. Men om de är det kan du också implementera en mer avancerad strategi där du selektivt behåller och tar bort vissa element baserat på deras relevans.

Slutsats

Det har aldrig varit så enkelt att bygga en avancerad chatbot tack vare Discord- och GPT-modellerna.

Den största utmaningen är att dessa moderna AI-modeller blir allt svårare att använda på grund av deras enorma storlek, och därför kan det vara mycket enklare och mer kostnadseffektivt att använda ett API som NLP Cloud i stället.

Om du vill implementera din egen chatbot men inte vet hur du ska göra, tveka inte att kontakta oss!

Julien Salinas
CTO på NLP Cloud