これはtraP 新歓ブログリレー2023 19日目の記事です。
22Bの @ikura-hamuです。SysAd班に所属して部内サービスの開発・メンテナンスをしたり、ゲーム班に所属してゲームを作ったりしています。
traQって何?
traPには、SysAd班が運用しているSNS「traQ」があります。このサービスはtraPのオンライン上の部室となることを目的として作られており、部員たちは日々このSNS上で会話をしています。traQについての記事はこちらをご覧ください。
traQ botって何?
traQには部員の他に、botと呼ばれる、プログラムで動くやつらがいます。このbotは部員であればだれでも作ることができます。現在200以上のbotが登録されており、さまざまな投稿をしてtraQライフを彩ってくれています。
traQ botについての記事
- https://trap.jp/post/846/ (多くのbotが動いているサーバー、Showcaseの話)
- https://trap.jp/post/944/ (botのおみくじについての話)
- https://trap.jp/post/987/ (エクストリームじゃんけんについての話)
- https://trap.jp/post/1196/ (きなのについての話やんね!)
- https://trap.jp/post/1251/ (南みれぃbotの話)
- https://trap.jp/post/1206/ (SysAd班の開発で活躍するbotの話)
- https://trap.jp/post/1646/ (草)
bot制作を支援する環境も整えられており、bot用のライブラリがさまざまな言語で公開されています。僕が探したところ以下のものが見つかりました。他にもあるかもしれません。
Go HTTP形式 https://github.com/traPtitech/traq-bot
Go WebSocket形式 https://github.com/traPtitech/traq-ws-bot
node.js https://github.com/sapphi-red/hubot-traq
Java HTTP形式 https://github.com/motoki317/traq-bot4j
Java WebSocket形式 https://github.com/motoki317/traq-ws-bot4j
Python https://github.com/detteiu8383/python-traq-bot
Rust HTTP形式 https://github.com/H1rono/traq-bot-http-rs
Rust WebSocket形式 https://crates.io/crates/traq-ws-bot
また、GitHubではtraq-botというトピックが存在しています。
2022年入学組(22B)の中でtraQ bot制作が流行ったので、まとめて記事にしました。
22Bが作ったbot達
ここからはそれぞれのbot制作者に書いてもらいます。
22B bot制作 ブログリレー
@BOT_pika_test by pikachu
勉強と娯楽の為に作られた、かわいそうな存在です。
公開シェルになった事件 (即墜ち2コマ)
SQL文とはデータベースを操作する言語のことで、データの検索や追加などの命令をすることが出来ます。そこで、SQL文の勉強がてらSQL文をtraQ上で任意実行できる機能を実装しました。
すると...
なんと/sql system <シェルコマンド>
で任意のシェルコマンドが実行できてしまうではないか!!!という事で、この日からこのBOTは公開シェルとなり、僕のPCのDocker(という仮想コンテナ)上で動いていたので躊躇なく壊したりリソースガッツリ使っても全然大丈夫な環境だったこともあり、みんなのおもちゃとして散々遊ばれる事になります。
元々こういう事に精通した人が多いサークルな事もあり、みんながそれぞれ知恵と知見を絞って様々なこと(他人のPCで機械学習を回そうとしたり、Dockerコンテナから脱出しようとしたり、Bot経由で共同開発したり、コンテナの中にコンテナを立てようとしたり等)を実現しようとし、何と2日間で約1000回もシェルコマンドが実行される活気的な事態となりました。↓こんな感じ
その後の事件
その後しばらく平穏が訪れ、@BOT_pika_test君は僕(pikachu)のタスク管理をこなしていました。
しかし、全てを消し去るコマンド、rm -rf / --no-preserve-root
を実行させる悪魔が現れ、愛おしい@BOT_pika_test君が......
manga by kegraさん
かわいそうな存在です...
@BOT_pika_testの機能 早見表
コマンド | 基本的な使い方 | 例 | 何をするか |
---|---|---|---|
/game |
/game (start) | /game start |
早押しスタンプ:o::x:ゲームを開始するぞ! |
/sql |
/sql [SQL文] | /sql select title, content from test3; |
任意のsql文を実行するぞ! |
/gpt |
/gpt [質問内容] | /gpt 支離滅裂な文を100文字ほど書いて下さい |
ChatGPT(AI)と対話できるぞ! |
/tag |
/tag (UserID) (year) | /tag pikachu 2022 |
ある年につけられたタグ一覧を表示するぞ! |
:mag: |
:mag:or:Internet_Explorer: [検索キーワード] | :mag:VRChat お砂糖 意味 | I'm feeling luckyするぞ! |
/info |
/info [人物名] | /info :@pikachu: | ユーザーかスタンプの詳細を表示するぞ! |
join |
メンション必須 | @BOT_pika_test join |
BOTがチャンネルに参加する |
leave |
メンション必須 | @BOT_pika_test leave |
BOTがチャンネルから抜ける |
/help |
/help | /help |
これを表示するぞ! |
/game (早押しスタンプゲーム)
遊び方 : BOTが3x3のマス上全てにランダムなスタンプを配置するので、
マスと同じスタンプを押してマスを獲得し、一列揃えたら勝ち!(誰も揃わなかったら最も多かった人からランダム)
スタンプの上にカーソルをホバーさせてスタンプ名を見るのはOKだぞ!
↑hardモード
現状normalは5.152秒が最速記録
1列揃えば終わるnormalモードと、全9マスが埋まり終わるまで終わらないtimeAttackモードがある。
また、通常のスタンプのnormalモードとスタンプにエフェクトが5個付くhardモードがある。
なので、タイムアタックとしては、normal、timeAttack、hard、timeAttackHardの4種類が存在する。
timeAttackに関しては参加した人数も記録されるので、平等な条件で比較することもできる。
是非タイムアタックとしても、バトルとしても楽しんで貰いたい!(深夜にやるとめっちゃ面白い系の奴なので)
/sql (公開bash)
冒頭のデータベースの操作で使うsqlを任意実行できる機能。何やら悪さができるらしいぞ...?
壊されるので、復活できるように/docker upコマンド等、dockerを再起動できるコマンドも実装しました。これで壊され放題だね...
/gpt (gpt-3.5-turboと対話)
ChatGPTと対話しよう! 色んな遊びや真面目な相談に使われているぞ!
/tag (タグ一覧を表示)
今年につけられたタグを振り返ろう!ということで作った機能。タグが付けられた日時も分かるので、タグで1年を振り返ってみよう!
mag (I'm feeling luckyする)
googleの検索結果の一番上のURLを出力します。
info (詳細を表示)
ユーザーまたはスタンプの詳細を出力する。UUIDをサッと知りたいときに便利かも
2023/03/27地点の@BOT_pika_test君はここまで!
他にも使いどころのない機能や隠し機能が色々あるかも...?
@BOT_pika_test君の全てはここ(ソースコード)にあるよ~!
@BOT_H1rono by H1rono_K
traQでの↑の発言がモチベーションとなって生まれたBOTです。出来上がったものがこちら。
今の所これ以外に特徴的な機能はありません。
@BOT_abap34 by abap34
通称robop34です。
世間ではずいぶんChatGPTが流行していたので、ここはいっちょこのブームに乗って一発当てるかということで作成しました。とはいえこれを作っている時期はまだAPIの提供等もされていなかったので、とりあえず何かしらの大きめの言語モデルでおもろいことをしようということで「各traPメンバーのtraQの過去発言を収集して学習して、その人っぽい発言を生成する」という感じのBotにしました。
具体的には https://huggingface.co/rinna/japanese-gpt2-medium をファインチューニングしました。
機能
- その人のモデルを作成
- 自分で発言
- 他人のモデルに発言させる
というのが大枠
具体的な使用例
abap34の学習データをもとに「もしbotが停止してしまったら、その時は僕が」から始まる文章を生成した例です。
反響
えらく受けたと思います。このBotは(僕が普段開発で使っている)GPUサーバーを使っていたので、稼働時間は僅かに二日ほどだったんですが、終始パンク状態で、
Botが動いたチャンネルは二日で8000メッセージ( クエリ)、できたモデル(人格)は60個くらいでした. (600GBオーバー)
争いの様子
今後
気が向いたら何かしらで使うかもしれません
@BOT_s9_text by s9
BOT_abap34に影響を受けて作った、文章生成用のBotです。
機能
https://huggingface.co/rinna/japanese-gpt2-medium を自身の投稿1万件でファインチューニングしたモデルを用いて、与えられた文章からその後に続く文章を予測します。
abap34くんは機械学習に造詣が深い一方で自分は無知なので、ちゃんと動いているのかよくわかりません:bu: 多分学習が甘いです。
BOT_abap34はユーザー自身のモデルを制作する機能がありましたが、実装が大変だったのでこちらにはありません。
traQとの通信はGoで書いていますが、文章推論はPythonで行う必要があります。execで叩いてもいいのですが、高速化のためにSocket通信で2つを繋いでいます。
使用例
反響
ファインチューニングが甘かったのかあまり面白い文章が出てこず、あまり話題になりませんでした。
余談
メッセージに対して、BERTでスタンプを推定して押すBotも考えていたのですが、任意のメッセージに対してスタンプを押してくれず、よくわからないのでabap34くんに任せることにしました。
追記(3/19):この文章は2/10に執筆したのですが、短期間で文章生成をめぐる情勢が大きく変化していて、今はChatGPTやGPT-3関連の話題が盛んですね。いつかは上記の内容をGPT-3系でやりたいですね……
@BOT_anonymous by Luftalian
普段は匿名で投稿することができないtraQを匿名で投稿できるようにしたBOTです。
仕様は至ってシンプルで、Userが@BOT_anonymousにDMを送ると、それを@BOT_anonymousが特定のチャンネルに投稿します。これによって、誰が投稿したのかわからなくしています。
よろしくない内容を隠せるように:yaba:スタンプ1個で、
:yaba:スタンプ2個で、
というふうに消せるようにしました。
今の所、:yaba:い内容は投稿されていないので、この機能が役に立っている場面はほとんどありません。
@BOT_tasklian by Luftalian
「タスク管理秘書『たす子』」は、一人のユーザーに対して複数のカテゴリを追加でき、カテゴリごとにタスクを追加できる便利なBotです。
何個ものタスクを同時に抱える人にとっては、カテゴリごとに整理して管理できる点が大きな魅力です。
さらに、「@BOT_tasklian」に任せれば、タスクの追加、削除、完了、締め切りの設定、通知のオン・オフなど、多機能かつ簡単に操作できるのが特長です。
彼女がいれば、忙しい毎日でも、タスクを効率的にこなせます。彼女と一緒に、ストレスフリーな生活を手に入れましょう!
文章作成協力: ChatGPT
技術
v1ではRDBを使っておらず、再起動するごとにタスクが消えていました。v2ではRDBを使うことで、データの永続化を可能にし、より使いやすくメンテナンスしやすいようにしました。
@BOT_ikura-hamu by ikura-hamu
できること一覧
Go言語の勉強をしたくて、どうせなら楽しいモノを作ろうと思ったので、ゲーム系が多いです。
ひとことクイズ
traQには各ユーザーが設定できるひとことがあります。Twitterでいう「自己紹介」です。ひとことクイズは、ひとことを見せられてそれが誰のものか当てるクイズです。
こんな感じで問題を出されて、
こんな感じで答えます。
「AC」はacceptedの略で、AtCoderのコンテストの正誤判定で使われてるマークのスタンプです。
わかんないときは「あきらめる」って言うと答えを教えてくれます。
クイズの問題と答えを記録しておくためにMariaDBで以下のようなテーブルを用意して使っています。
Name | Type | 説明 |
---|---|---|
channel_id | VARCHAR(36) | traQのチャンネルid |
user_id | TEXT | 答えのユーザー名 |
message_id | VARCHAR(36) | 問題を出した時のメッセージのid |
これによって、一つのチャンネルで同時に1問しか出題できないようにしました。
これを応用して、ユーザーについているタグからユーザーを当てる「タグクイズ」も作りました。こちらはヒントを頼むと最大で7個までタグを見せてくれる親切設計です。
この二つは一部の人の間で人気になり、ひとことクイズは約2000回、タグクイズは約1100回遊んでもらいました。嬉しかったです。
実装がちょっと汚くなってメンテナンスがしにくくなってしまったのが反省点です。
おわり
traQ botはtraPでの生活を豊かにしてくれる楽しい仲間です。最初に述べたように、traPにはbot開発のための環境が整っています。みなさんもtraPに入って自分が考える最強のbotを作ってみませんか?
明日は @H1rono_Kの記事と、@HetareNekoの記事です。