NINGENがAIで答えてくれるサービス

:::note warn
[これはクソアプリアドベントカレンダー2024](https://qiita.com/advent-calendar/2024/kuso-app)のジョーク記事です。Artificial Intelligenceの話は出てきません。
:::


# 人工知能（AI）とばかり会話しているみなさ〜ん
こんにちは。昨今 やれこのAIがすごい、あのAIがすごい、もう人間は要らないかもしれないというような言葉がSNSを飛び交い、AIがメキメキと進化をしている一方で、人間が若干ないがしろにされていると感じることはないでしょうか。

みなさん、AIとばかり会話をしていませんか？

もっとあなたと話すべきAIを用意しました。

こちらです。NINGEN AIといいます。そうです、NINGEN AI(人間愛）です。

https://www.ningen-ai.space/

質問を投げかければあっという間に返事が返ってくるということにあまりにも人類は慣れすぎてしまいました。
ここらへんで一旦人間を相手にしたときどうだったかを改めて噛み締めてみましょう。
そしてすごい勢いで無茶振りをされる日々を過ごしているAIの気持ちに思いを馳せてみましょう。


# NINGENに何かを聞く

なんだか普段よく使っているような気がする画面です。
ここではNINGENに何かを聞くことが出来ます。

![スクリーンショット 2024-12-10 21.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/8f56f8ef-93f4-8eed-45b7-089f6fe1ffd3.png)

何かを問いかけることが出来ます。今日のごはんのこと、友達のこと、仕事のこと、恋愛のこと、なんでも自由に聞くことが出来ます。

![スクリーンショット 2024-12-10 22.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/ab1fca98-1c99-5039-b282-75a55a15f89f.png)

答えが来るのを待ちましょう。**誰かが答えてくれれば、返答が表示されます。**
人間なので時間がかかるかもしれません。望んでいない答えが返ってくることもあるかも知れません。**でも相手は人間だから、それらもしょうがありません。**


## NINGENとして誰かに答える

誰かから来たメッセージに対して答えることもできます。普段あなたがAIに求めていることをあなたがやるのです。聡明で真面目なNINGENであるあなたならそれが出来ます。（余談ですがこういう前置きのプロンプトって特に有効な効果はないらしいです）

![スクリーンショット 2024-12-10 22.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/52fb9bb0-eb3c-b8d2-6d5a-6e2fb3caf965.png)

回答することができる質問がランダムに1件表示されます。
回答を行うと、質問者の画面にメッセージが反映されます。

![名称未設定.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/61d31a44-3cdb-773b-7698-87289f9c4a44.gif)

まあつまるところこれが何なのかというと、匿名のチャットなんですが、少しだけ体験を工夫した部分があります。


# 技術面の解説

## リアルタイムのやり取りの実現

これはsupabaseのRealtimeを使って実現しています。

https://supabase.com/docs/guides/realtime

チャットのやり取りのようにリアルタイムでの変更をlistenしたい場合、対象のテーブルに対しての閲覧ポリシーを設定する必要があることに注意が必要です。

```sql
CREATE POLICY "Allow all users to select chats"
ON public.[YOUR TABLE NAME]
FOR SELECT
USING (true);
```

## 匿名のチャットで「質問者」と「回答者」を分けるために行ったこと

質問が投稿された際にチャットルームが作成される形になりますが、そのさい「質問者ページ用ID」「回答者ページ用ID」「閲覧ページ用ID」の3つを発行します。
これのせいで無駄に複雑化してしまい、デバッグがメチャクチャにめんどくさかったです。

![スクリーンショット 2024-12-10 23.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/c22d085e-d50a-a14e-a2d8-77e3c8f74eed.png)


### 質問者を一意のままにするために

体験として、質問者が質問を投げかけているチャットルームに対して、複数名が回答をするのは良いとしても、複数の質問者が発生するのはあまり良くないと考えたため「質問者用ページ」にアクセスできるのは質問者本人だけ、という形にしています。

質問者が質問を投げかけてチャットルームが作成されたときに、自分が作成したチャットルームのID情報をlocalstrageに保持しておき、その情報がなければ質問者本人とは見做さずに共有用ページへ移動させます。

![スクリーンショット 2024-12-10 23.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/42402c46-4a5c-fcfd-357f-f96d444db96d.png)

このような形のためlocalstrageのデータを偽装されたら看破される程度のものですが、そこまで頑張るならもうええやろという顔です。
Firebaseなどで匿名ログインの仕組みを用意すればもうちょっとセキュアにできるんじゃないでしょうか。

### 自作自演の防止

質問者が自分で質問に回答して、あたかも自分に都合の良いことを誰かが答えたように見せることができるのもあんまり良くありません。クソアプリにどの程度の倫理を求めるべきなのかという気もしますが、質問者は自分の回答にはアクセスできないようにしています

![スクリーンショット 2024-12-10 23.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7193/46642906-e6f0-7b53-37fa-d676e84472eb.png)


## この形式にした意図
一覧性を廃したこの形式にすることで、チャットサービスにありがちな、やばい回答がさらされ続けるなどのリスクを防止したかったところもあります。


### 余談
websocketとか使って回答者のリアルタイム接続者数やステータスを出したかったとか、画像を投稿できるようにしたかったとか、質問に答えがついたら通知が来るようにするとか、やってみたいことは結構あったんですが、またの機会にしようと思います。

# 開発を通してわかったこと
このサービスを作るにあたってはメチャクチャCursorを使って作業しました。
**AIってやっぱすげーわ。** NINGENは回答が遅いし不正確ですわ。でも、NINGENがくれる答えに愛はあるかもしれないですね。