【分散型SNS】NostrでGPT-4版小泉進次郎botを作った話
分散型SNS NostrとX(旧Twitter)上で稼働するGPT-4で動く小泉進次郎botを作りました。
各種リンク↓
はじめに
はじめまして、最近Nostrの住人になりつつある、hikaelisです。今年から会社に入ってソフトウェアエンジニアになりました。学生時代は薬学でせかせかフラスコ振り回してただけなので、技術的には全然詳しくありません。よろしくお願いします。
きっかけ
ある日、友人から、NostrというSNS?[1]が面白いと布教されました。その友人は普段から色んなものを布教してくるので、またか)と思いましたが、送られてきたとある本[2]を読んでみると意外と面白そう。
私は中央集権があまり好きじゃありません。送金するだけで高い手数料取ってくる老舗銀行[3]、広告ばかり出してくるSNS、検閲ばかりのチャットツール、理不尽です。
その点、Nostrというプロトコルはとても「自由」[4]で惹かれました。その仕組み自体もシンプルだけど革新的。ユーザーもまだ多くないとのことで、これはもう"アーリーアダプター"になるしかない[5]。
しかもそのNostrのSNS上でbotを作ってる方の話があり、npmやらなんやら書いてあります。最近、TypeScriptを使っていたので、「これなら自分も出来そう」と思いやってみることにしました。
いざ!
まず、何のbotを作るかですが、迷いはありませんでした。
おぼろげながら浮かんできたんです。小泉進次郎という人物が。[6]
実装の方法は、先駆者様たちのリポジトリや本[2:1]にあるので、詳しくは説明しません。
ただ、工夫や詰まった点がいくつかあるので絞って説明します。
1. 複数リレーへの接続
リレーが分からない人は以下のスライドが参考になります。
さて、複数リレーへ投稿するにはnostr-tools のSimplePool()を使うと楽そうですが、当時はなぜか上手くできませんでした。しょうがないので、for文で回しました。。
いいね機能つけたら進次郎大量発生した
いざ投稿してみると、時折タイムラインで進次郎が話題にあがります。その度に、手動でいいねしていましたが、面倒臭いので自動化します。多分進次郎からいいねきたらみんな嬉しいし)
今回は"小泉"か"進次郎"が含まれている投稿に全部いいねするようにしました。
リレーから投稿を取得して、includes()でフィルターして、いいねイベント(kind7)を送信するだけです。
実行すると、なぜかいいね欄に進次郎が大量発生し、タイムラインをざわつかせてしまいました。
原因は複数のリレーにイベントを送信しているからですが、イベント自体は1つしか生成しておらず同一なので謎です…(なのでいいね数は正常)
とりあえず1時間に1回いいねするので、1時間以内の投稿だけを取得してなるべく重複を減らしました。
2. OpenAIのAPI使えなくね?
JavaScriptのopenaiライブラリを使おうとしたら、エラー出て困りました。どうやらverが上がって使い方が変わったようです。別記事で紹介しています。
3. GitHub Actionsでbot化
このままでは手動でスクリプトを実行しているのでbotじゃありません。自動で実行したいので、最初は無料のレンタルサーバー(GoogleComputeEngine)を借りて常時稼働させようと思いましたが、SSH接続がめちゃくちゃ不安定でいらいら。
定期実行(1時間に1回)させるだけならGitHub Actionsで良くね?と思い立ったのでそうします。
調べたらActionsでもcronっぽいものが使えるそうです。
今回はnode の環境を作ってmain.jsを実行させるだけなので、ChatGPTにworkflowの設定ファイルを書いてもらいました。
こんな感じ(コメントアウトは適宜解除してください)
これで、毎時0分頃(Actionsのscheduleは結構時間が適当らしい)に、進次郎がPostといいねをするようになりました!
あとは、どうやらActionsの定期実行は60日間レポジトリに変化がないと自動で停止されてしまうようなので、毎日1回自動コミットするようにしました。
結果
X(旧Twitter)でバズった。
さっそくNostrで運営開始したところ、そこそこ話題になりました。
NostrのBuzz Wordランキングでも何回か1位になったりして承認欲求が満たされました。
そんなある日Xで紹介してもらい、めちゃくちゃバズりました(120万インプレッション❗️)
知り合いのXにも流れてきたとか…
乗るしかない、このビッグウェーブに!
となり、急いでX上でも稼働開始しました。(その後フォロワーはあまり伸びていません、、、)
でもやっぱり、進次郎は人気[7]、、、進次郎、ありがとう❗️
今後
実はgpt-4に投げるプロンプトが雑すぎて、同じような発言がループしてマンネリ化してきているので、大いに改善余地があります。
また、タイムライン上の話題を拾って、話題に乗っかるように発言する
みたいな機能もつけたいですね…
最後に
2023年12月13日21時時点での、進次郎botの人気投稿ランキングTOP10を発表します。
(いいね+リポストの合計で集計。一部管理人投稿のものがあります。自動集計用のコードが動かなかったので、目視です)
🥇1位
「発言内容がまとも過ぎたため、現在定期投稿を止めています
(管理人npub1uppfkelag8szx027wm35yxtvl75an99qt65g6w3tta34gk5k06xqk6txt7)」
🥈2位
「自分のターンが終了した時、相手のターンになる。」
(※これは管理人が画像検索で見つけた拾い画です...すみません)
🥉3位
「高速道路は道路としてはかなり高速ですね」
4位
「お風呂はやっぱり湯でしょう。」
5位
「あなたのためにこれを言っておきます、ボタン一つで世界は変わるんです」
「もし私が地球最後の1人になったら、私とデートしてくれますか?」
7位
「旅行保険に入るなら、その地の神々に祈りを捧げるぐらいの覚悟で。」
「頭に「スマート」、尻に「イノベーション」、そんな日本経済の大転換期が始まっています」
「人類が滅亡するとき、AIは「これでようやく静かになる」と言った。しかし、AGIが答えた、「静かになるのはいいが、誰が電源を切るんだ?」」
10位
「レンタカーって、やっぱり借りられるんですね。」
こう見ると最近の投稿が多い気がします(プロンプトを改良した成果?)
NostrやX上では多くの方に反応を頂きました。特にきっかけをくれた方々には特に感謝しています。これからも、何か面白いことできないかなぁ…と思ってるので、今後ともよろしくお願いします!
-
正確にはプロトコル ↩︎
-
"自由の奴隷"にはならないようにしましょう(進撃の巨人より) ↩︎
-
とあるパチスロ系Youtuberが以前言ってた気がします ↩︎
-
政治的意図は含みません ↩︎
Discussion