AIでAIコンテンツをモデレーションしてみた—AIHallucination開発で学んだこと

Dev.to / 2026/5/3

💬 オピニオンDeveloper Stack & InfrastructureTools & Practical UsageIndustry & Market MovesModels & Research

要点

  • 著者は「失敗や奇妙な出力も含めた、本物のAI体験をそのまま共有する」コミュニティ AIHallucination を構築し、同時に「AIなら仕事ができる」という理由でチームが解雇された現実を目の当たりにした経緯を語っている。
  • AIHallucination では投稿が公開される前に GPT-4o mini を使って自動モデレーションを行い、素早い非同期処理と、スケールしても低コストで運用できる点を重視している。
  • モデレーションの難しさは明らかなスパムを弾くことではなく、プラットフォームの口調理解(皮肉や苛立ちは許容するが、嫌がらせや「本当のAI体験」がない投稿は拒否する)にある。
  • 拒否された投稿には「理由+改善の提案」という実行可能なフィードバックを返し、また投稿はモデレーション完了まで「pending」として保存してから公開するため、ユーザー体験の改善につながっている。
  • 記事では TanStack Start、PostgreSQL/Drizzle、Better Auth、Railway、Tailwind/Shadcn などの技術スタックと、モデレーション手順および(保留/承認/却下/失敗に加え)モデレーションイベントを記録する方向性が説明されている。

「AIなら今は自分の仕事ができる」って理由で、私のチームのほとんどが解雇されました。

たぶん私は最後に残った人です。毎日、私たちを置き換えたのと同じツールを使って、彼らの間違いを直し、AIが手助けしてくれてより速く動けるようになったことを書きつつスタンドアップをしています。

誰もこのことを正直に話していませんでした。そこで私はAIHallucinationを作りました。AI体験のための、実際の、フィルタなしのコミュニティです。失敗も、成功も、突拍子もない出力も、私たちが誰もが黙って味わっている「期待と現実」の瞬間も。

これは、私がそれを作った方法の技術的な物語です。

スタック
TanStack Start — SSRとファイルベースのルーティングを備えたReact 19。これを本番で使うのは初めてです。考え方に慣れるまでが少し大変ですが、ハマるとDXは素晴らしいです。
PostgreSQL + Drizzle ORM — 型安全なクエリ、魔法なし、まさに私が欲しかったもの
Better Auth — メール/パスワード + Google OAuth、usernameプラグイン。意外なほどセットアップは手間がかかりませんでした。
Railway — デプロイ、Postgresホスティング
Tailwind v4 + shadcn — ダークな編集系デザイン、エレクトリックライムのアクセント
面白い部分 — AIコンテンツをモデレートするためにAIを使う
AIHallucinationのすべての投稿は、本番公開前にGPT-4o miniを通します。はい、私はAI体験について語るコミュニティを、AIでモデレートしました。皮肉ですが、私はちゃんと受け止めています。

なぜそれが理にかなっていたのか:

モデレーションは高速で非同期である必要がある — ユーザーは待つべきではない
ルールは微妙なニュアンスがある — スパムは拒否するが、本物の怒り・苛立ち・皮肉で書かれた投稿は許可する
GPT-4o miniは安いので、大規模でもコストはほんのわずか
システムプロンプトは、これまでで最も何度も反復しました。難しかったのは明らかなスパムを落とすことではありませんでした。プラットフォームのトーンを理解できるようにすることが難しかったのです。AIHallucinationは鈍くて正直です。AIへの強い批判は歓迎です。苛立ちも歓迎です。皮肉も歓迎です。ただし、純粋な嫌がらせ、または本当のAI体験が背後にないコンテンツは拒否されます。

初期バージョンはモデレートしすぎていました。皮肉の投稿が「低品質」としてフラグを立てられました。怒りの長文が「純粋にネガティブ」としてフラグを立てられました。私は明確にモデルにこう伝えなければならなかったのです:

「皮肉、苛立ち、くだけた言葉遣いはプラットフォームの声の一部 — トーンだけで拒否しないで」

モデレーションの応答には理由と提案が含まれます。つまり、投稿が拒否された場合に「なぜ拒否されたのか」と「どう直せばいいのか」が明確に分かります。これは重要だと感じました。説明なしの拒否はつらいです。実行可能なフィードバック付きの拒否は役に立ちます。

フロー:

ユーザーが投稿を送信
投稿を「保留」ステータスでDBに保存 — 公開フィードには表示されない
moderatePost() が非同期で実行(fire and forget)
GPT-4o miniが12個のプラットフォームルールに照らして評価
投稿ステータスが承認・拒否・失敗のいずれかに更新
ユーザーは「My Posts」でステータスを確認でき、拒否理由も見られ、編集して再送できる
コスト:この規模ではGPT-4o miniはほぼコストがかからないに等しいです。

データモデル
投稿には高速なフィルタリング用のmoderationStatusカラム(pending, approved, rejected, failed)があります。すべてのモデレーションチェックは、監査ログとして別のmoderation_eventテーブルに書き込みます。つまり、最新のステータスだけでなく、投稿に対するチェック履歴の全体が確認できます。

moderation_event (
id, post_id, user_id, status, reason, suggestion, created_at
)
この分離は重要です。statusカラムはパフォーマンス用(インデックスされ、すべてのフィードクエリで使われる)。イベントテーブルは透明性用(ユーザーに拒否履歴を見せ、異議申し立てを可能にする)です。

私なら次はこうする
コンテンツのシードは、プラットフォームを作るより難しいです。投稿が5件あるコミュニティは死んでいるように見えます。最初に本物の人々に投稿してもらうことが、実際に難しい課題です — 技術の部分は簡単なほうです。

モデレーションのプロンプトエンジニアリングは過小評価されています。私は単一の機能よりも、システムプロンプトにより多くの時間を費やしました。ほんの少しの文言変更で、承認される/拒否されるものの比率が大きく変わりました。

次にやること
本当に誰かがこれを欲しがっているのかを確かめる
もし、AIの返答を見て「これ、冗談なのかな?」と考え込んだことがあるなら、あなたの話を共有しに来てください。

aihallucination.in