É muito fácil construir um chatbot num servidor Discord graças aos grandes modelos AI como GPT-3, GPT-J, e GPT-NeoX. Neste artigo, mostramos-lhe como codificar o seu próprio bot conversacional em Node.js, usando GPT-J e GPT-NeoX através da NLP Cloud API.

O Discord é uma plataforma de mensagens amplamente adoptada. É cada vez mais comum ver as pessoas criarem o seu próprio servidor Discord para o seu projecto, de modo a que uma comunidade se possa reunir facilmente. Muitas empresas criaram de facto o seu próprio servidor Discord a fim de fomentar a sua própria comunidade de utilizadores.
A Discord pode ser auto-hospedada ou utilizada através da aplicação web Discord. Uma coisa excelente com a Discord é que tem uma API extensa para interagir com o servidor, e é muito fácil de criar um chatbot que irá interagir com os utilizadores na Discord.
Muitas pessoas criam chatbots na Discord para que os utilizadores possam discutir com uma IA sobre muitas coisas. É muito fácil integrar um chatbot no seu servidor Discord. Vamos ver como fazer isso!
Ao longo destes últimos 2 anos, vários grandes modelos de IA foram lançados: GPT-3, GPT-J, e GPT-NeoX. Estes modelos são muito impressionantes e são especialmente bons a lidar com IA de conversação (i.e. chatbots).
Pode-se ter uma grande discussão sobre literalmente qualquer coisa com estes modelos, e é bastante fácil adaptar os modelos a uma situação específica. Por exemplo, pode configurar o seu chatbot baseado em GPT para ser empático, sarcástico, ou mesmo bom em responder a perguntas específicas sobre a sua própria indústria (médica, legal, marketing, etc.).
O único problema é que estes modelos requerem muito poder de computação, pelo que poucas pessoas se podem realmente dar ao luxo de os instalar no seu próprio servidor. A NLP Cloud propõe ambos GPT-J e GPT-NeoX através de uma API, pelo que vamos utilizar estes modelos através da NLP Cloud API no seguinte exemplo.
Vamos supor que tenha criado uma conta no Discord.com. Vá para o portal do desenvolvedor: aqui. Seleccione "Nova Aplicação", nomeie a sua aplicação, e crie-a:

Agora clique em "Add a bot", e recupere a sua ficha bot.
Último passo: ligue o seu bot ao seu servidor Discord. Para o fazer, primeiro clique no menu "OAuth2" e recupere o seu ID de cliente:

Em seguida, permita que o seu bot aceda ao seu servidor visitando o seguinte URL: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (substitua CLIENT_ID pelo seu próprio ID de cliente recuperado anteriormente).
Tudo está bem no lado da Discórdia. Agora vamos recuperar uma ficha API da NLP Cloud!
Vamos supor que tenha criado uma conta na NLP Cloud. Basta recuperar a sua ficha API no seu tablier:

Em seguida, subscreva o plano pay-as-you-go que lhe dará acesso aos modelos GPT-J e GPT-NeoX (os primeiros 100k tokens são gratuitos, o que facilitará os seus testes).

Pode agora começar a codificar o seu Node.js bot!
Tanto a Discord como a NLP Cloud têm clientes Node.js, pelo que o desenvolvimento será muito fácil.
Aqui está uma primeira versão:
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']}`});
})();
});
Como pode ver, primeiro recuperamos o símbolo Discord e NLP Cloud a partir de variáveis ambientais. Portanto, primeiro exportem os vossos tokens em 2 variáveis de ambiente chamadas "NLPCLOUD_TOKEN" e "DISCORD_BOT_TOKEN". Também pode simplesmente copiar o seu token directamente no código durante os seus testes, se preferir.
Estamos a utilizar o modelo Fast GPT-J da NLP Cloud - uma implementação mais rápida do GPT-J - o que é interessante para os chatbots, uma vez que normalmente queremos que o tempo de resposta seja o mais curto possível. Se quiser usar o GPT-NeoX 20B, basta usar "gpt-neox-20b" em vez de "fast-gpt-j".
A função "chatbot()" da NLP Cloud facilita o manuseamento de um chatbot baseado num modelo GPT sem se incomodar com parâmetros complexos, prompting, aprendizagem de poucos disparos, etc. O único truque é que após cada resposta de chatbot devemos manter a resposta na memória e adicioná-la ao histórico para os seguintes pedidos. Se não o fizermos, o chatbot nunca se lembrará da história da conversa!
O nosso chatbot está agora a funcionar. Basta lançar o seu script (com "node my_script.js" por exemplo) e deverá ver que o seu chatbot está online no seu servidor Discord. Pode começar a falar com ele a sério!
O nosso exemplo funciona, mas existe uma fraqueza: Os modelos GPT não podem manusear mais de 2048 fichas ao mesmo tempo (2048 fichas são mais ou menos iguais a 1700 palavras). Assim, a dada altura, a sua história de chatbot poderá tornar-se demasiado grande e terá de a truncar! Eis como o poderia fazer:
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);
Como pode ver, estamos simplesmente a certificar-nos de que a história não é demasiado grande, e quando o é, removemos os elementos mais antigos!
Na prática é raramente um problema porque os elementos mais antigos da história raramente são relevantes para a conversa. Mas se o forem, também se pode implementar uma estratégia mais avançada que consiste em manter e remover selectivamente alguns elementos com base na sua relevância.
A construção de um chatbot avançado nunca foi tão fácil, graças aos modelos Discord e GPT.
O principal desafio é que estes modelos modernos de IA são cada vez mais difíceis de utilizar devido ao seu enorme tamanho, razão pela qual pode ser muito mais simples e muito mais rentável utilizar um API como a NLP Cloud em vez disso.
Se gostaria de implementar o seu próprio chatbot mas não tem a certeza de como lidar com ele, por favor não hesite em contactar-nos!
Julien Salinas
CTO em NLP Cloud