Worstel je met AI of full-stack ontwikkeling? Onze experts staan klaar om je te begeleiden: advies op maat, technische integratie en meer. Neem contact op met [email protected].

Bouw een GPT-J/GPT-NeoX Discord Chatbot met NLP Cloud

Het is heel gemakkelijk om een chatbot te bouwen in een Discord server dankzij geweldige AI modellen zoals GPT-3, GPT-J, en GPT-NeoX. In dit artikel laten we zien hoe je je eigen conversatiebot in Node.js kunt coderen door GPT-J en GPT-NeoX te gebruiken via de NLP Cloud API.

Discord chatbot

Een Discord Chatbot?

Discord is een wijdverspreid messaging platform. Het is meer en meer gebruikelijk om te zien dat mensen hun eigen Discord server maken voor hun project, zodat een gemeenschap gemakkelijk samen kan komen. Veel bedrijven hebben zelfs hun eigen Discord server gemaakt om hun eigen gebruikersgemeenschap te bevorderen.

Discord kan ofwel zelf gehost worden of gebruikt worden via de Discord webapplicatie. Een groot voordeel van Discord is dat het een uitgebreide API heeft voor interactie met de server, en het is heel eenvoudig om een chatbot te maken die interactie heeft met gebruikers op Discord.

Veel mensen maken chatbots op Discord zodat gebruikers met een AI kunnen discussiëren over allerlei zaken. Het is heel gemakkelijk om een chatbot te integreren in je Discord server. Laten we eens kijken hoe je dat doet!

GPT-3, GPT-J, en GPT-NeoX

De afgelopen twee jaar zijn er verschillende geweldige AI-modellen uitgebracht: GPT-3, GPT-J, en GPT-NeoX. Deze modellen zijn zeer indrukwekkend en zijn vooral goed in het omgaan met conversational AI (d.w.z. chatbots).

Je kunt met deze modellen over letterlijk alles een goed gesprek voeren, en het is vrij eenvoudig om de modellen aan te passen aan een specifieke situatie. U kunt uw GPT-gebaseerde chatbot bijvoorbeeld zo configureren dat hij empathisch of sarcastisch is, of zelfs goed in het beantwoorden van specifieke vragen over uw eigen branche (medisch, juridisch, marketing, etc.).

Het enige probleem is dat deze modellen veel rekenkracht vergen, zodat maar weinig mensen het zich kunnen veroorloven om ze op hun eigen server in te zetten. NLP Cloud biedt zowel GPT-J als GPT-NeoX aan via een API, dus we gaan deze modellen gebruiken via de NLP Cloud API in het volgende voorbeeld.

Krijg Discord en NLP Cloud API-sleutels

Laten we aannemen dat je een account hebt aangemaakt op Discord.com. Ga naar het ontwikkelaarsportaal: hier. Selecteer "Nieuwe toepassing", geef uw toepassing een naam en maak deze aan:

New Discord Application

Klik nu op "Voeg een bot toe", en haal je bot token op.

Laatste stap: koppel je bot aan je Discord server. Om dit te doen, klik je eerst op het "OAuth2" menu en haal je je client ID op:

Discord OAuth2

Geef je bot dan toegang tot je server door de volgende URL te bezoeken: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (vervang CLIENT_ID door je eigen client ID die je eerder hebt opgehaald).

Alles is in orde aan de Discord kant. Laten we nu een NLP Cloud API token ophalen!

Laten we aannemen dat u een account heeft aangemaakt op NLP Cloud. Haal gewoon uw API token op in uw dashboard:

NLP Cloud Account

Abonneer u dan op het pay-as-you-go plan dat u toegang zal geven tot de GPT-J en GPT-NeoX modellen (de eerste 100k tokens zijn gratis, wat uw tests zal vergemakkelijken).

NLP Cloud Pay-as-you-go Plan

U kunt nu beginnen met het coderen van uw Node.js bot!

Codeer de Node.js server

Zowel Discord als NLP Cloud hebben Node.js clients, dus de ontwikkeling zal zeer eenvoudig zijn.

Hier is een eerste versie:

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

Zoals je kunt zien halen we eerst de Discord en NLP Cloud token op uit omgevingsvariabelen. Dus exporteer eerst uw tokens in 2 omgevingsvariabelen genaamd "NLPCLOUD_TOKEN" en "DISCORD_BOT_TOKEN". U kunt ook gewoon uw token direct in de code kopiëren tijdens uw tests als u dat liever doet.

We gebruiken NLP Cloud's Fast GPT-J model - een snellere implementatie van GPT-J - wat interessant is voor chatbots omdat we meestal de responstijd zo kort mogelijk willen houden. Als u GPT-NeoX 20B wilt gebruiken, gebruik dan "gpt-neox-20b" in plaats van "fast-gpt-j".

De NLP Cloud "chatbot()" functie maakt het gemakkelijk om een chatbot te hanteren op basis van een GPT model zonder last te hebben van complexe parameters, prompting, few-shot learning, etc. De enige truc is dat we na elke reactie van de chatbot de reactie in het geheugen moeten bewaren en toevoegen aan de geschiedenis voor de volgende verzoeken. Als we dat niet doen, zal de chatbot nooit de geschiedenis van het gesprek onthouden!

Onze chatbot werkt nu. Start gewoon je script (met "node my_script.js" bijvoorbeeld) en je zou moeten zien dat je chatbot online is op je Discord server. Je kunt er nu echt mee gaan praten!

Geschiedenis automatisch afkappen

Ons voorbeeld werkt, maar er is een zwak punt: GPT modellen kunnen niet meer dan 2048 tokens tegelijk aan (2048 tokens zijn min of meer gelijk aan 1700 woorden). Dus op een gegeven moment kan de geschiedenis van je chatbot te groot worden en zul je hem moeten inkorten! Hier is hoe je dat zou kunnen doen:

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

Zoals u ziet zorgen we er gewoon voor dat de geschiedenis niet te groot is, en als dat wel zo is verwijderen we de oudste elementen!

In de praktijk is dat zelden een probleem omdat de oudste elementen in de geschiedenis zelden relevant zijn voor het gesprek. Maar als ze dat wel zijn, kun je ook een meer geavanceerde strategie toepassen waarbij je sommige elementen selectief behoudt en verwijdert op basis van hun relevantie.

Conclusie

Het bouwen van een geavanceerde chatbot is nog nooit zo eenvoudig geweest dankzij Discord en GPT-modellen.

De grootste uitdaging is dat deze moderne AI-modellen steeds moeilijker te gebruiken zijn door hun enorme omvang, en daarom kan het veel eenvoudiger en veel kosteneffectiever zijn om in plaats daarvan een API zoals NLP Cloud te gebruiken.

Als u uw eigen chatbot wilt implementeren, maar u weet niet zeker hoe u dit moet aanpakken, aarzel dan niet om contact met ons op te nemen!

Julien Salinas
CTO bij NLP Cloud