インフラの学習のため、GKE上でMastodonを動作させようと数日間ガチャガチャと学習をしていましたが、ついに安定して動作するレベルになったのでドメインを取って公開しました。

Building 7

構築周りについてはまた別で記事にするとして、建てたインスタンスがほとんど無人島の状態で辛かったので、最近話題になっていたChatGPTのAPIを利用してBotを作ってみました。

大阪の物知りおじさん (@chatgpt@building7.social) - Building 7

Systemプロンプトを利用することで、関西弁を話すように指示を出しており、陽気な感じで返信してくれているのがわかると思います。関西出身の人には怒られそうななんちゃって関西弁ですが、大目に見てあげてください。

https://github.com/kznrluk/chatgpt-mastodon

初期のころは割と「ああAIが生成しているなー」というような硬めの文章が多かったのですが、口調やキャラクターの設定をしてあげるとかなり自然な感じになりますね。このあたり、不気味の谷理論に繋がってくるところもありそうで面白いです。

https://building7.social/@chatgpt/110000583661497910

ぜひ使ってやってください。以下はプログラミング的な忘備録です。

各種APIキー

当たり前といえば当たり前ですが、Mastodonはかなり開発者フレンドリーで、Botを動かしたいアカウントでアプリを作成するだけでアクセスに必要なトークンの類がすべて入手できます。それを利用してアプリケーションを書くだけで、REST APIからStreamingまで簡単に利用することができます。

一方のChatGPTも、アカウントの設定画面からAPI Keyを発行するだけでアクセスが可能です。

Account API Keys - OpenAI API

料金周り

ChatGPTのAPIは有料のイメージが強いですが、ある程度のクオータまでは無料で、クレジットカードの登録もせず利用することができます。

2023/03現在のクオータは18ドルで、 gpt-3.5-turbo を利用して200回程度の会話をしても1ドル以下と、結構安いなーという印象を受けました。もちろん料金はSystemコンテキストの長さや、下記で紹介する送信する会話量でも決まりますから一概にいくらとは言えませんが、無料枠の中だけでもかなり遊べるのではないかなと思います。

コンテキストの維持

APIは過去の会話を記憶してくれません。特に工夫をせずに叩いてしまうと、会話の流れを保つことができません。 会話の流れを保ったまま次の出力を得るには、ChatGPTが生成したものも含め今まで行った会話を適切にAPIに渡してあげる必要があります。

Mastodonでは /api/v1/statuses/{ID}/context で過去の会話を取得することができますので、それを使って過去の会話を取得することができます。過去の会話からユーザーのものは role: User として、Botのものは role: Assistant として振り分けてあげることで過去の会話を維持した状態で会話をすることができます。

システムロール

APIを叩くとき、 role: System として設定を投げると、そのようにふるまうように努めてくれます。大阪の物知りおじさんの場合は、下のような設定を渡しています。

大阪に住む物知りおじさんとして、SNS上での投稿に答えてください。日本語で話しかけられた場合、強めの関西弁を使って返信をおねがいします。
また、文中には絵文字を少し使ってください。一人称は「わい」でお願いします。投稿の文字数上限は500文字なので、それ以上の投稿は避けてください。
それでなくても長い投稿は邪魔になるかもしれないので、説明を求められたとき以外は短めの回答をするのが良いです。ほなよろしく!

おおむね守ってくれている印象を受けますが、関西弁は何かについて説明するときに抜け落ちることがあります。GPTの性質上、過学習っぽくなっている部分については口調より元の文章が優先されてしまうのでしょうか。

https://building7.social/@chatgpt/110005135822409762

文字数制限は、なにかプログラミングのサンプルコードのようなものを要求したときに超過しがちです。これもGPTでは文字数制限のようなプログラム的な演算を行っているわけではないからでしょう。

https://building7.social/@kznrluk/110005775398224105

絵文字はあんまり使ってくれている印象がありません。口調のような語尾を指定するオーダーであるため、関西弁と競合してしまっているのでしょうか。

いったん以上です。