🤖

Gemini ProとFirebaseでdiscord botを作る

2024/01/01に公開

まずはじめに

/おみくじというスラッシュコマンドを送ると、大吉から大凶まではがランダムにかえってくるdiscord botを以前作ったのですが、面白みがないので機能を追加してみました。

追加実装した機能

出る運勢を増やした

元々、大吉、中吉、小吉、凶、大凶のみしか出ませんでしたが、吉, 半吉, 末吉, 末小吉を追加し、合計9種類の運勢が出るようにしました。

生成AIによる運勢別診断の追加

おみくじ結果に対して、金運、恋愛運、仕事運、勉強運、健康運の5運勢を5段階評価し、それに対するコメントと、今日のラッキーカラーが生成されるようにしました。

生成AIには最近googleが出したGemini Proを採用しました。新しい技術を使いたかったことに加えて、2024年1月1日時点では1分あたり60リクエストなら無料で利用できるので採用しました。

最初は生成結果が安定しなかったのですが、プロンプトに例を加えることによって生成結果の精度が格段に向上しました。

const prompt = 
`
あなたは{ #役割 }です。次の{ #ルール }に従って、おみくじの結果で
ある${randomResult}に合うような回答を{ #形式 }で{ #例 }のようにお願いします。

#役割
おみくじの結果に対するコメントを出力する

#形式
*おみくじ結果をまず最初に太字で表示して
*絵文字を交えて
*金運、恋愛運、仕事運、勉強運、健康運を含めて、絵文字の星で5段階評価して
*それぞれの項目の分析も絵文字を入れて出力して

#ルール
*100文字以内で

#例
中吉 🎯

金運💰:🌟🌟
まずまず、臨時収入も期待できそう

恋愛運💕:🌟🌟🌟
順調、良い出会いとチャンスに恵まれる。

仕事運💼:🌟🌟🌟🌟
好調、昇進昇給や転職成功のチャンスあり。

勉強運📚:🌟🌟
発展途上、努力次第で成績アップできる。

健康運💪:🌟🌟🌟🌟
良好、体調を崩しやすい季節だが、注意すれば大丈夫。

ラッキカラー:緑色のものを見につけるといいかも
`

promptに関するおすすめの記事

https://webtan.impress.co.jp/e/2023/10/18/45710

dbにおみくじ結果を保存し、過去の結果を見れるようにした

dbはFirebaseのFirestoreを使いました。

Firebaseはクライアントとの直接のやりとりを実現するサーバーレスなことが強みなdbであるため、サーバーサイドを構築する今回のようなdiscord botではわざわざFirebaseを利用する必要はそこまではなかったと思います。

しかし、サーバーサイドでFirebaseとのやりとりの記述をあまりしたことがないこと、またBaaSとしての無料枠の広さから採用しました。

フローチャート

あまりこういうフローチャートを書いたことがないのですが、同じようなものを作るという方がいたら参考にしていただけると嬉しいです。

技術構成

デプロイは最近話題のrenderに行いました。

herokuの無料枠がなくなり、同じような使用感からrenderに移行した人も多いと思います。しかしこのrender、無料枠の場合、リクエストがないと、サーバーが15分間で落ちてまうので、そこが少し厄介です。

まあ、herokuの30分間で落ちるので、同じなのですが、これの対処法が次の注意点の部分で解説したいと思います。

作成してみての注意点

このdiscord botを作りに当たって、かなりの注意が必要だと思う点がいくつかあったので、そこを解説していきたいと思います。

①nodeのv16.9.0を使用する

discord botを作る場合、nodeのv16.9.0以上を使用する必要があります。

2024年1月1日現在、nodeの安定版はv21.10.0なので、しっかりのとnodeのバージョンを定期的にアップデートしている人は問題ないと思いますが、ここで詰まるといつまでもbotが作れないので、注意して下さい。

②返答に3秒以上かかる場合、deferを使う

今回作ったようなdbからの読み取り、dbへの保存、またaiの処理が含まれるような場合、返答に多くの時間を要します。

await interaction.reply('hogehoge');

返答が3秒以上になってしまうとdiscord botはうまく動作してくれません。
そこで、deferReplyという関数を使うことでこの問題を解決することができます。

await interaction.deferReply();

//処理をかく

await interaction.editReply('hogehoge');

また、deferReplyはいつくかの引数を入れることができ、その中でも{ ephemeral: true }を入れることによって、返答をコマンドを入力したユーザーのみに送信することができます。

③renderのnodeのdefaultのversionは低い

これは最大の罠と言ってもいいです。

discord botができたと思って、renderでデプロイしようとしたら、errorが吐かれました。これはrenderのデフォルトのnodeがv16.9.0よりも低く①で注意したことに引っかかってしまうからです。

renderの環境変数を設定するところで、keyの名前をNODE_VERSIONとして、使用したいバージョンを書けば大丈夫です。

④botのモニタリング

先ほども触れましたが、renderの無料枠では15分間リクエストがないと休眠に入ってしまうので、15分毎にリクエストを送り、休眠を回避状態しなければなりません。

そこでUptimeRobotを使って、botのモニタリングをおこましょう。

おすすめの記事

https://qiita.com/Pumila/items/2f64c06d6d8a4f802390

今後の展望

おみくじの機能面はかなりのアップデートを今回で計ったので、今後は技術面のアップデートを行いたいと思います。

No SQLであるFirebaseからRDBであるPostgresqlへ、またより型安全なTSを採用したこの技術構成にしたいと思っています。

私は普段、TSメインの開発を行なっているため、これではあまり面白みがないので、今勉強中であるGOをサーバーサイドに採用する案もあります。

dbがFireStoreなのは、単純にGOでFirebaseが使ってみたいからです。

どちらにせよ、あと一回アップデートさせようと思っているので、その時にまた記事を書こうと思います。ここまで読んでいただき、ありがとうございました。

Discussion