GPT-3、GPT-J、GPT-NeoXなどの優れたAIモデルのおかげで、Discordサーバーでチャットボットを構築するのは非常に簡単です。この記事では、NLP Cloud API を介して GPT-J と GPT-NeoX を使用し、Node.js で独自の会話ボットをコーディングする方法を紹介します。
Discord は広く採用されているメッセージングプラットフォームです。コミュニティが簡単に集まれるように、プロジェクトのために独自の Discord サーバーを作成するのが一般的になってきています。実際に多くの企業が、自社のユーザーコミュニティを育成するために独自の Discord サーバーを作成しています。
Discordは、セルフホスティングでも、Discordウェブアプリケーションを通してでも使用できます。Discordの素晴らしいところは、サーバーと対話するためのAPIが充実しており、Discord上のユーザーと対話するチャットボットを非常に簡単に作成できることです。
多くの人が Discord でチャットボットを作成し、ユーザーが AI と様々なことについて話し合うことができるようにしています。Discord サーバーにチャットボットを組み込むのはとても簡単です。では、その方法を見ていきましょう
この2年間で、いくつかの素晴らしいAIモデルがリリースされました。GPT-3、GPT-J、そしてGPT-NeoXです。これらのモデルは非常に印象的で、特に会話型AI(つまりチャットボット)を扱うのに優れています。
これらのモデルを使えば、文字通り何にでも素晴らしいディスカッションができますし、特定の状況にモデルを適応させることもかなり簡単です。例えば、GPTベースのチャットボットは、共感したり、皮肉ったり、あるいは自分の業界(医療、法律、マーケティングなど)に関する特定の質問に答えるのが得意になるように設定することができます。
唯一の問題は、これらのモデルは多くの計算能力を必要とするので、実際に自分のサーバーに展開できる人は少ないということです。NLPクラウドではGPT-JとGPT-NeoXをAPIで提供していますので、以下の例ではNLPクラウドのAPIでこれらのモデルを利用します。
Discord.comでアカウントを作成したと仮定します。開発者ポータルに移動します。 これ. 新規アプリケーション」を選択し、アプリケーションの名前を付けて作成します。
ここで「ボットを追加」をクリックし、ボットトークンを取得します。
最後のステップ:ボットをあなたの Discord サーバーにリンクします。これを行うには、まず "OAuth2" メニューをクリックし、クライアント ID を取得します。
次に、ボットが次のURLにアクセスしてサーバーにアクセスできるようにします。https://discord.com/oauth2/authorize?scope=bot&permissions=8&client_id=CLIENT_ID(CLIENT_IDを、先ほど取得した自分のクライアントIDに置き換えてください)。
Discord 側はすべて OK です。では、NLP Cloud API トークンを取得してみましょう。
NLPクラウドにアカウントを作成したと仮定します。ダッシュボードでAPIトークンを取得するだけです。
その後、GPT-JとGPT-NeoXモデルにアクセスできる有料プランに加入します(最初の10万トークンは無料なので、テストが楽になります)。
これで、Node.jsのボットのコーディングを開始することができます。
DiscordもNLP CloudもNode.jsのクライアントを持っているので、開発は非常に簡単でしょう。
ここでは、ファーストバージョンをご紹介します。
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']}`});
})();
});
ご覧のように、まず環境変数からDiscordとNLP Cloudのトークンを取得します。ですから、まずあなたのトークンを「NLPCLOUD_TOKEN」と「DISCORD_BOT_TOKEN」という2つの環境変数にエクスポートしてください。必要であれば、テスト中にトークンをコードに直接コピー・ペーストすることもできます。
NLPクラウドのFast GPT-Jモデル(GPT-Jの高速実装)を使用しています。通常、応答時間はできるだけ短くしたいので、チャットボットには興味深いものです。GPT-NeoX 20Bを使用したい場合は、「fast-gpt-j」の代わりに「gpt-neox-20b」を使用するだけです。
NLPクラウドの「chatbot()」機能を使うと、複雑なパラメータやプロンプト、数発学習などに悩まされることなく、GPTモデルに基づくチャットボットを簡単に扱えるようになります。唯一のトリックは、各チャットボットのレスポンスの後、レスポンスをメモリに保持し、次のリクエストのためにそれを履歴に追加しなければならないことです。そうしないと、チャットボットは会話の履歴を覚えていないのです。
これでチャットボットが動作するようになりました。スクリプトを起動すれば (例えば "node my_script.js" で)、チャットボットが Discord サーバ上でオンラインになっていることが確認できるはずです。これでチャットボットに話しかけることができます。
この例はうまくいくのですが、弱点があります。GPTモデルは、同時に2048トークンを超えるものを扱うことができません(2048トークンは、ほぼ1700ワードに相当します)。つまり、ある時点でチャットボットの履歴が大きくなりすぎて、それを切り捨てる必要があるかもしれません。以下はその方法です。
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);
見ての通り、履歴が大きくなりすぎないようにし、大きくなったら一番古い要素を削除しているだけです
実際には、履歴の中で最も古い要素が会話に関連することはほとんどないため、問題になることはほとんどありません。しかし、もしそうであれば、関連性に基づいていくつかの要素を選択的に保持したり削除したりする、より高度な戦略を実施することも可能です。
DiscordとGPTモデルのおかげで、高度なチャットボットを構築することは決して容易ではありませんでした。
主な課題は、これらの最新のAIモデルは、その巨大なサイズのために使用するのが難しくなっていることです。そのため、代わりにNLP CloudのようなAPIを使用すると、はるかにシンプルではるかにコスト効率の良いものになります。
自社でチャットボットを導入したいけど、どうしたらいいかわからないという方は、ぜひお気軽にご相談ください
Julien Salinas
NLP CloudのCTO。