Det er veldig enkelt å bygge en chatbot i en Discord-server takket være gode AI-modeller som GPT-3, GPT-J og GPT-NeoX. I denne artikkelen viser vi deg hvordan du koder din egen konversasjonsbot i Node.js ved å bruke GPT-J og GPT-NeoX gjennom NLP Cloud API.

Discord er en mye brukt meldingsplattform. Det blir mer og mer vanlig å se at folk oppretter sin egen Discord-server for prosjektet sitt, slik at et fellesskap enkelt kan komme sammen. Mange bedrifter har faktisk opprettet sin egen Discord-server for å fremme sitt eget brukerfellesskap.
Discord kan enten hostes selv eller brukes gjennom Discord-nettapplikasjonen. En flott ting med Discord er at den har et omfattende API for å samhandle med serveren, og det er veldig enkelt å lage en chatbot som vil samhandle med brukere på Discord.
Mange lager chatbots på Discord slik at brukerne kan diskutere med en AI om mange ting. Det er veldig enkelt å integrere en chatbot i Discord-serveren din. La oss se hvordan du gjør det!
I løpet av de siste to årene har flere gode AI-modeller blitt lansert: GPT-3, GPT-J og GPT-NeoX. Disse modellene er veldig imponerende og er spesielt gode til å håndtere samtale-AI (dvs. chatbots).
Du kan ha en god diskusjon om bokstavelig talt hva som helst med disse modellene, og det er ganske enkelt å tilpasse modellene til en bestemt situasjon. Du kan for eksempel konfigurere din GPT-baserte chatbot til å være empatisk, sarkastisk eller til og med god til å svare på spesifikke spørsmål om din egen bransje (medisinsk, juridisk, markedsføring osv.).
Det eneste problemet er at disse modellene krever mye datakraft, så få mennesker har faktisk råd til å distribuere dem på sin egen server. NLP Cloud foreslår både GPT-J og GPT-NeoX gjennom et API, så vi kommer til å bruke disse modellene gjennom NLP Cloud API i følgende eksempel.
La oss anta at du har opprettet en konto på Discord.com. Gå til utviklerportalen: her. Velg "Ny søknad", gi søknaden et navn og opprett den:

Klikk nå på "Legg til en bot", og hent bot-tokenet ditt.
Siste trinn: koble boten din til Discord-serveren din. For å gjøre dette klikker du først på "OAuth2"-menyen og henter klient-ID-en din:

La deretter boten få tilgang til serveren din ved å gå til følgende URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (erstatt CLIENT_ID med din egen klient-ID som du fant tidligere).
Alt er ok på Discord-siden. La oss nå hente et NLP Cloud API-token!
La oss anta at du har opprettet en konto på NLP Cloud. Bare hent API-tokenet ditt i dashbordet ditt:

Deretter abonnerer du på pay-as-you-go-planen som gir deg tilgang til GPT-J- og GPT-NeoX-modellene (de første 100k tokens er gratis, noe som vil gjøre testene dine enklere).

Du kan nå begynne å kode Node.js-roboten din!
Både Discord og NLP Cloud har Node.js-klienter, så utviklingen vil være veldig enkel.
Her er en første versjon:
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 henter vi først Discord og NLP Cloud-token fra miljøvariabler. Så eksporter først tokens i to miljøvariabler kalt "NLPCLOUD_TOKEN" og "DISCORD_BOT_TOKEN". Du kan også bare kopiere og lime inn tokenet ditt direkte i koden under testene dine hvis du foretrekker det.
Vi bruker NLP Clouds Fast GPT-J-modell - en raskere implementering av GPT-J - som er interessant for chatbots ettersom vi vanligvis ønsker at responstiden skal være så kort som mulig. Hvis du vil bruke GPT-NeoX 20B, bruker du bare "gpt-neox-20b" i stedet for "fast-gpt-j".
NLP Cloud "chatbot ()" -funksjonen gjør det enkelt å håndtere en chatbot basert på en GPT-modell uten å bry seg med komplekse parametere, spørsmål, læring med få skudd osv (se nedenfor for et annet eksempel ved bruk av generasjonsfunksjonen () i stedet for chatbot () -funksjonen). Det eneste trikset er at etter hvert chatbot-svar må vi holde svaret i minnet og legge det til historikken for følgende forespørsler. Hvis vi ikke gjør det, vil chatboten aldri huske historikken til samtalen!
Chatboten vår fungerer nå. Bare start skriptet ditt (for eksempel med "node my_script.js"), og du bør se at chatboten din er online på Discord-serveren din. Du kan begynne å snakke med den på ordentlig!
Eksemplet vårt fungerer, men det er en svakhet: GPT-modeller kan ikke håndtere mer enn 2048 tokens samtidig (2048 tokens tilsvarer mer eller mindre 1700 ord). Så på et tidspunkt kan chatbot-historikken din bli for stor, og du må avkorte den! Slik kan du gjøre 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, sørger vi ganske enkelt for at historikken ikke er for stor, og når den er det, fjerner vi de eldste elementene!
I praksis er det sjelden et problem fordi de eldste elementene i historikken sjelden er relevante for samtalen. Men hvis de er det, kan du også implementere en mer avansert strategi som selektivt beholder og fjerner noen elementer basert på deres relevans.
Eksemplet ovenfor brukte chatbot()-funksjonen som er en wrapper rundt generasjon()-funksjonen. Generation()-funksjonen er litt vanskeligere å bruke, men den gir deg mer kontroll over chatboten din. Her er et eksempel:
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 = `Input: Hey, how are you today?
Response: Very well thank you, what about you?
###
Input: I am great.
Response: What are you going to do?
###
Input: Most likely read a couple of book and relax.
Response: Fantastic!`;
discordClient.on("messageCreate", function(message) {
if (message.author.bot) return;
(async () => {
if (history != '') {
history += '\n###\n'
}
let finalContent = history+'Input: '+`${message.content}`+'\nResponse:';
// Send request to NLP Cloud.
const response = await nlpCloudClient.generation(finalContent,0,200,true,'###',true,true)
// Remove end_sequence from response.
let cleanedResponse = response.data['generated_text'].replace('###','').trim();
// Send response to Discord bot.
message.reply(cleanedResponse);
// Add the request and response to the chat history.
history = finalContent+cleanedResponse;
// 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.
if (history.length > 1500 * 4) {
history = history.slice(charsCount-(1500 * 4));
}
})();
});
discordClient.login(discordBotToken);
Du la merke til at vi må initialisere en chat-diskusjon manuelt med litt småprat. Tanken her er å vise tekstgenereringsmodellen at vi ønsker å være i samtalemodus. Denne småpraten er ubetydelig og bør være så nøytral som mulig for ikke å ha noen innvirkning på resten av samtalen.
Legg også merke til at vi tvinger modellen til å legge til "###" på slutten av hvert genererte svar. På denne måten kan vi enkelt stoppe tekstgenereringen når disse tegnene er oppfylt.
Igjen, dette eksemplet er kun for avansert bruk!
Å bygge en avansert chatbot har aldri vært så enkelt takket være Discord og GPT-modeller.
Hovedutfordringen er at disse moderne AI-modellene er vanskeligere og vanskeligere å bruke på grunn av deres enorme størrelse, og derfor kan det være mye enklere og mye mer kostnadseffektivt å bruke et API som NLP Cloud i stedet.
Hvis du ønsker å implementere din egen chatbot, men ikke er sikker på hvordan du skal håndtere den, ikke nøl med å kontakte oss!
François
Full Stack-ingeniør hos NLP Cloud