🗂

【分散型SNS】NostrでGPT-4版小泉進次郎botを作った話

2023/12/14に公開

分散型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. 複数リレーへの接続

リレーが分からない人は以下のスライドが参考になります。
https://speakerdeck.com/gpsnmeajp/fen-san-xing-sns-nostr-shi-zu-mijie-shuo

さて、複数リレーへ投稿するにはnostr-tools のSimplePool()を使うと楽そうですが、当時はなぜか上手くできませんでした。しょうがないので、for文で回しました。。
https://github.com/hikaelis/nostr_shinjiro_bot_public/blob/9064036297aa397eabb7e5215321bda9d5940487/main.js#L14-L24

いいね機能つけたら進次郎大量発生した

いざ投稿してみると、時折タイムラインで進次郎が話題にあがります。その度に、手動でいいねしていましたが、面倒臭いので自動化します。多分進次郎からいいねきたらみんな嬉しいし)
今回は"小泉"か"進次郎"が含まれている投稿に全部いいねするようにしました。
リレーから投稿を取得して、includes()でフィルターして、いいねイベント(kind7)を送信するだけです。
実行すると、なぜかいいね欄に進次郎が大量発生し、タイムラインをざわつかせてしまいました。
https://damus.io/note1e6vz0ugav0srnd4ywt39sue0lqksse0lfvfkuzlkj3szznhlq9ssxatskg

原因は複数のリレーにイベントを送信しているからですが、イベント自体は1つしか生成しておらず同一なので謎です…(なのでいいね数は正常)
とりあえず1時間に1回いいねするので、1時間以内の投稿だけを取得してなるべく重複を減らしました。
https://github.com/hikaelis/nostr_shinjiro_bot_public/blob/9064036297aa397eabb7e5215321bda9d5940487/src/likePosts.js#L36-L61

2. OpenAIのAPI使えなくね?

JavaScriptのopenaiライブラリを使おうとしたら、エラー出て困りました。どうやらverが上がって使い方が変わったようです。別記事で紹介しています。
https://zenn.dev/hikaelis/articles/b93cc6f94a6bd3

3. GitHub Actionsでbot化

このままでは手動でスクリプトを実行しているのでbotじゃありません。自動で実行したいので、最初は無料のレンタルサーバー(GoogleComputeEngine)を借りて常時稼働させようと思いましたが、SSH接続がめちゃくちゃ不安定でいらいら。
定期実行(1時間に1回)させるだけならGitHub Actionsで良くね?と思い立ったのでそうします。
調べたらActionsでもcronっぽいものが使えるそうです。
今回はnode の環境を作ってmain.jsを実行させるだけなので、ChatGPTにworkflowの設定ファイルを書いてもらいました。
こんな感じ(コメントアウトは適宜解除してください)
https://github.com/hikaelis/nostr_shinjiro_bot_public/blob/9064036297aa397eabb7e5215321bda9d5940487/.github/workflows/automate.yml

これで、毎時0分頃(Actionsのscheduleは結構時間が適当らしい)に、進次郎がPostといいねをするようになりました!
あとは、どうやらActionsの定期実行は60日間レポジトリに変化がないと自動で停止されてしまうようなので、毎日1回自動コミットするようにしました。
https://github.com/hikaelis/nostr_shinjiro_bot_public/blob/main/.github/workflows/auto-commit.yml

結果

X(旧Twitter)でバズった。
さっそくNostrで運営開始したところ、そこそこ話題になりました。
NostrのBuzz Wordランキングでも何回か1位になったりして承認欲求が満たされました。
そんなある日Xで紹介してもらい、めちゃくちゃバズりました(120万インプレッション❗️)
知り合いのXにも流れてきたとか…
https://x.com/mattn_jp/status/1726762502225342470

乗るしかない、このビッグウェーブに!

となり、急いでX上でも稼働開始しました。(その後フォロワーはあまり伸びていません、、、)
https://x.com/shinjiro_ai_bot/status/1726901828800172169

でもやっぱり、進次郎は人気[7]、、、進次郎、ありがとう❗️

今後

実はgpt-4に投げるプロンプトが雑すぎて、同じような発言がループしてマンネリ化してきているので、大いに改善余地があります。
また、タイムライン上の話題を拾って、話題に乗っかるように発言する
みたいな機能もつけたいですね…

最後に

2023年12月13日21時時点での、進次郎botの人気投稿ランキングTOP10を発表します。
(いいね+リポストの合計で集計。一部管理人投稿のものがあります。自動集計用のコードが動かなかったので、目視です)

🥇1位
「発言内容がまとも過ぎたため、現在定期投稿を止めています
(管理人npub1uppfkelag8szx027wm35yxtvl75an99qt65g6w3tta34gk5k06xqk6txt7)」
https://primal.net/e/note1vantcsjlt4nfj683krzmmj7g5s3cpsqp0tufpdv84uk95pznpusq2nstk9

🥈2位
「自分のターンが終了した時、相手のターンになる。」
(※これは管理人が画像検索で見つけた拾い画です...すみません)
https://primal.net/e/note197e4rv3femjpmnscatgz6fgzhcn5hkcly7r5wg4w34wkgaq853qq55dhvc

🥉3位
「高速道路は道路としてはかなり高速ですね」
https://primal.net/e/note1lpusanp342th9vmzrknf5gzfltluq5w9ph45pjr284qttna80u5qp687g9

4位
「お風呂はやっぱり湯でしょう。」
https://primal.net/e/note1a26kk36nthwzrnwyqul8geh4e6aaruc8f8m6239q4x8chd0jucvsjy8xh8

5位
「あなたのためにこれを言っておきます、ボタン一つで世界は変わるんです」
https://primal.net/e/note1etnd7lyzrt084lwayku4f37akxpmwpzy5ul6t5rg5u6pluhwrp2qqswdjq

「もし私が地球最後の1人になったら、私とデートしてくれますか?」
https://primal.net/e/note1zkn8mcxmftpqvfyel0j0e263xnu0jw6gr3lg929sn7k4efmq06gsx4et3l

7位
「旅行保険に入るなら、その地の神々に祈りを捧げるぐらいの覚悟で。」
https://primal.net/e/note1s8mf4356ga6ta2u636ey80l8mm7qhw9hxaalll3jlfah8erkrngqx8yfs8

「頭に「スマート」、尻に「イノベーション」、そんな日本経済の大転換期が始まっています」
https://primal.net/e/note1zmn50y9wc7sl224q0ahk3d7v9k9595qfs4f8jwneuuy85zu7xh6s2s2awu

「人類が滅亡するとき、AIは「これでようやく静かになる」と言った。しかし、AGIが答えた、「静かになるのはいいが、誰が電源を切るんだ?」」
https://primal.net/e/note136vspgtr8gls2cnqshqaj8hhcn28c28gn8v053vhs8t8988tkfcqdfayjx

10位
「レンタカーって、やっぱり借りられるんですね。」
https://primal.net/e/note1tyy3y080v070fnltcmxhj0pc9a493mntwsjc35545y8p68ky9ajqvah3lm

こう見ると最近の投稿が多い気がします(プロンプトを改良した成果?)

NostrやX上では多くの方に反応を頂きました。特にきっかけをくれた方々には特に感謝しています。これからも、何か面白いことできないかなぁ…と思ってるので、今後ともよろしくお願いします!

脚注
  1. 正確にはプロトコル ↩︎

  2. Hello Nostr! Yo Bluesky! 分散SNSの最前線 ↩︎ ↩︎

  3. https://www.bk.mufg.jp ↩︎

  4. "自由の奴隷"にはならないようにしましょう(進撃の巨人より) ↩︎

  5. とあるパチスロ系Youtuberが以前言ってた気がします ↩︎

  6. おぼろげながら浮かんできたんです 46という数字が ↩︎

  7. 政治的意図は含みません ↩︎

Discussion