はじめに
AI技術の進化とともに、生成AIを活用したチャットボットの需要が増えています。今回、私は学習機能を持つDiscord Botを開発しました。このボットは、ユーザーが登録した情報を学習し、自然な会話で回答を返します。また、生成AIとして Gemini-1.5-Flash を活用し、柔軟で魅力的な応答を実現しました。
この記事では、このプロジェクトの技術スタックや開発の工夫、直面した課題について共有します。
使った技術スタック
技術 | 内容 |
---|---|
Node.js | サーバーサイドの基盤として採用。 |
Discord.js | Discord Botのインターフェースを実現。 |
TypeScript | 型安全性を確保し、コードの保守性を向上。 |
Prisma | データベースORMとして採用し、MySQLを操作。 |
MySQL | 学習データを保存するデータベース。 |
Gemini-1.5-Flash | 生成AIとして採用。柔軟で高品質な応答を提供。 |
Fuse.js | 質問と学習データをマッチングするためのあいまい検索。 |
主な機能
-
学習機能
-
!l 質問|答え
コマンドで、ユーザーが質問と答えのペアを登録。 - データはMySQLデータベースに保存。
-
-
質問応答機能
-
!q 質問
コマンドで、登録されたデータやAI生成応答を利用。 - Fuse.jsを使った類似度検索で、完全一致しない質問にも柔軟に対応。
-
-
生成AI機能
- 学習データが見つからない場合、Gemini-1.5-Flashを呼び出し、回答を生成。
Gemini-1.5-Flashを使った理由
Gemini-Proでは、ギャンブル関連の質問がSAFETY制約に引っかかることが多く、柔軟性に欠ける場面がありました。一方で、Gemini-1.5-Flash はSAFETYチェックが緩やかで、特定のトピックにも対応可能でした。
const model = genAI.getGenerativeModel({ model: 'gemini-1.5-flash' });
const prompt = `
以下の質問に簡潔かつ正確に回答してください。
質問: "${input}"
`;
const result = await model.generateContent(prompt);
苦労したこと
-
Gemini-ProのSAFETY制約
- パチスロやギャンブルに関する質問がSAFETY制約により応答拒否されました。
- 対応: 規制が緩やかだったGemini-1.5-Flashを採用。
-
質問の完全一致問題
- 登録した質問が完全一致しないとデータベースから答えを取得できない問題がありました。
- 対応: Fuse.jsを使い、学習済みデータとの類似度検索を実装しました。
-
学習データとAI生成の切り分け
- ユーザーの意図を的確に把握し、学習データが存在する場合はそれを優先的に使用。
- 対応: データベース検索と生成AI呼び出しを連携。
工夫したこと
-
類似度検索の導入
- Fuse.jsを使い、曖昧な質問でも学習済みデータに基づく応答を返す設計。
const fuse = new Fuse(learnedQuestions, {
keys: ['question'],
threshold: 0.4,
});
const result = fuse.search(question);
-
エラーハンドリングの強化
- Gemini APIやデータベースエラー時の詳細なログ出力を追加。
- ユーザーには明確なエラーメッセージを返すように対応。
完成したボットの動作例
-
学習
!l パチンコやスロットにはまる人|ぎゃんちゅう
- 質問「パチンコやスロットにはまる人」と回答「ぎゃんちゅう」を登録。
-
質問
!q ぱちんこにはまる人をなんていう?
- 類似検索を行い、登録された回答「ぎゃんちゅう」を返します。
-
生成AI
- 学習データが見つからない場合、Geminiが質問内容に基づいて回答を生成。
まとめ
今回のプロジェクトでは、学習データと生成AIを組み合わせ、柔軟な回答を可能にするDiscord Botを開発しました。特に、Fuse.jsによる類似度検索やGemini-1.5-Flashを活用した生成AI機能は、ギャンブル関連の質問にも適切に対応できる仕組みを提供します。
今後は、以下の改善を検討しています:
- ユーザーインターフェース(フロントエンド)の構築。
- 学習内容の可視化や編集機能の追加。
- 他の生成AIモデル(例: GPT-4)の統合。