GPT-3, GPT-J ve GPT-NeoX gibi harika yapay zeka modelleri sayesinde Discord sunucusunda bir sohbet botu oluşturmak çok kolaydır. Bu makalede, NLP Cloud API aracılığıyla GPT-J ve GPT-NeoX kullanarak Node.js'de kendi konuşma botunuzu nasıl kodlayacağınızı gösteriyoruz.

Discord, yaygın olarak benimsenen bir mesajlaşma platformudur. İnsanların, bir topluluğun kolayca bir araya gelebilmesi için projeleri için kendi Discord sunucularını oluşturduklarını görmek giderek daha yaygın hale geliyor. Aslında birçok şirket kendi kullanıcı topluluklarını geliştirmek için kendi Discord sunucularını oluşturdu.
Discord kendi kendine barındırılabilir veya Discord web uygulaması aracılığıyla kullanılabilir. Discord ile ilgili harika bir şey, sunucu ile etkileşim kurmak için kapsamlı bir API'ye sahip olması ve Discord'daki kullanıcılarla etkileşime girecek bir sohbet robotu oluşturmanın çok kolay olmasıdır.
Birçok kişi Discord'da sohbet robotları oluşturur, böylece kullanıcılar bir yapay zeka ile birçok şey hakkında tartışabilir. Discord sunucunuza bir sohbet robotu entegre etmek çok kolaydır. Bunu nasıl yapacağımızı görelim!
Son 2 yılda, birkaç harika AI modeli piyasaya sürüldü: GPT-3, GPT-J ve GPT-NeoX. Bu modeller çok etkileyicidir ve özellikle diyalogsal yapay zeka (yani sohbet robotları) ile başa çıkmada iyidir.
Bu modellerle kelimenin tam anlamıyla her şey hakkında harika bir tartışma yapabilirsiniz ve modelleri belirli bir duruma uyarlamak oldukça kolaydır. Örneğin, GPT tabanlı sohbet robotunuzu empatik, alaycı ve hatta kendi sektörünüzle (tıp, hukuk, pazarlama vb.) ilgili belirli soruları yanıtlamada iyi olacak şekilde yapılandırabilirsiniz.
Tek sorun, bu modellerin çok fazla hesaplama gücü gerektirmesidir, bu nedenle çok az kişi bunları kendi sunucusuna yerleştirmeyi göze alabilir. NLP Cloud hem GPT-J hem de GPT-NeoX'u bir API aracılığıyla önermektedir, bu nedenle aşağıdaki örnekte bu modelleri NLP Cloud API aracılığıyla kullanacağız.
Discord.com'da bir hesap oluşturduğunuzu varsayalım. Geliştirici portalına gidin: Burada. "Yeni Uygulama "yı seçin, uygulamanızı adlandırın ve oluşturun:

Şimdi "Bot ekle "ye tıklayın ve bot token'ınızı alın.
Son adım: botunuzu Discord sunucunuza bağlayın. Bunu yapmak için önce "OAuth2" menüsüne tıklayın ve istemci kimliğinizi alın:

Ardından aşağıdaki URL'yi ziyaret ederek botunuzun sunucunuza erişmesine izin verin: https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID (CLIENT_ID yerine daha önce aldığınız kendi istemci kimliğinizi yazın).
Discord tarafında her şey yolunda. Şimdi bir NLP Cloud API belirteci alalım!
NLP Cloud'da bir hesap oluşturduğunuzu varsayalım. Gösterge tablonuzdan API belirtecinizi almanız yeterlidir:

Ardından GPT-J ve GPT-NeoX modellerine erişmenizi sağlayacak kullandıkça öde planına abone olun (ilk 100 bin token ücretsizdir ve bu da testlerinizi kolaylaştıracaktır).

Artık Node.js botunuzu kodlamaya başlayabilirsiniz!
Hem Discord hem de NLP Cloud Node.js istemcilerine sahiptir, bu nedenle geliştirme çok kolay olacaktır.
İşte ilk versiyon:
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']}`});
})();
});
Gördüğünüz gibi önce Discord ve NLP Cloud token'larını ortam değişkenlerinden alıyoruz. Bu yüzden önce tokenlarınızı "NLPCLOUD_TOKEN" ve "DISCORD_BOT_TOKEN" adlı 2 ortam değişkenine aktarın. İsterseniz token'ınızı testleriniz sırasında doğrudan koda da kopyalayıp yapıştırabilirsiniz.
NLP Cloud'un GPT-J'nin daha hızlı bir uygulaması olan Fast GPT-J modelini kullanıyoruz - bu, genellikle yanıt süresinin olabildiğince kısa olmasını istediğimizden sohbet robotları için ilginçtir. GPT-NeoX 20B kullanmak istiyorsanız, "fast-gpt-j" yerine "gpt-neox-20b" kullanmanız yeterlidir.
NLP Cloud "chatbot()" işlevi, karmaşık parametreler, komut istemi, birkaç vuruşlu öğrenme vb. ile uğraşmadan GPT modeline dayalı bir sohbet botunu işlemeyi kolaylaştırır (chatbot() işlevi yerine generation() işlevini kullanan başka bir örnek için aşağıya bakın). Tek püf noktası, her chatbot yanıtından sonra yanıtı bellekte tutmamız ve sonraki istekler için geçmişe eklememiz gerektiğidir. Bunu yapmazsak, sohbet robotu konuşmanın geçmişini asla hatırlamayacaktır!
Sohbet robotumuz artık çalışıyor. Komut dosyanızı başlatın (örneğin "node my_script.js" ile) ve sohbet botunuzun Discord sunucunuzda çevrimiçi olduğunu görmelisiniz. Onunla gerçekten konuşmaya başlayabilirsiniz!
Örneğimiz çalışıyor ancak bir zayıflık var: GPT modelleri aynı anda 2048 token'dan fazlasını işleyemez (2048 token aşağı yukarı 1700 kelimeye eşittir). Yani bir noktada sohbet botu geçmişiniz çok büyük olabilir ve onu kesmeniz gerekebilir! İşte bunu nasıl yapabileceğiniz:
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);
Gördüğünüz gibi sadece geçmişin çok büyük olmadığından emin oluyoruz ve olduğunda en eski öğeleri kaldırıyoruz!
Pratikte bu nadiren bir sorun teşkil eder çünkü geçmişteki en eski öğeler konuşmayla nadiren ilgilidir. Ancak eğer öyleyse, bazı öğeleri alaka düzeylerine göre seçici olarak saklayan ve kaldıran daha gelişmiş bir strateji de uygulayabilirsiniz.
Yukarıdaki örnekte, generation() fonksiyonunun etrafında bir sarmalayıcı olan chatbot() fonksiyonu kullanılmıştır. generation() fonksiyonunun kullanımı biraz daha zordur, ancak sohbet robotunuz üzerinde daha fazla kontrol sahibi olmanızı sağlar. İşte bir örnek:
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);
Bir sohbet tartışmasını biraz sohbetle manuel olarak başlatmamız gerektiğini fark ettiniz. Buradaki fikir, metin oluşturma modeline sohbet modunda olmak istediğimizi göstermektir. Bu gevezelik önemsizdir ve konuşmanın geri kalanını etkilememesi için mümkün olduğunca tarafsız olmalıdır.
Ayrıca modeli, oluşturulan her yanıtın sonuna "###" eklemeye zorladığımızı da unutmayın. Bu şekilde, bu karakterler karşılandığında metin üretimini kolayca durdurabiliriz.
Bir kez daha, bu örnek yalnızca ileri düzey kullanım içindir!
Discord ve GPT modelleri sayesinde gelişmiş bir chatbot oluşturmak hiç bu kadar kolay olmamıştı.
Asıl zorluk, bu modern yapay zeka modellerinin devasa boyutları nedeniyle kullanımının giderek zorlaşmasıdır, bu nedenle bunun yerine NLP Cloud gibi bir API kullanmak çok daha basit ve çok daha uygun maliyetli olabilir.
Kendi chatbotunuzu hayata geçirmek istiyor ancak nasıl yapacağınızdan emin değilseniz, lütfen bizimle iletişime geçmekten çekinmeyin!
Julien Salinas
NLP Cloud'da CTO