はじめに
最近、世の中ではLLMを活用したアプリケーションの開発が流行っていると思います。
私もいくつかLLMアプリケーションを開発したことがありますが、何か面白いことができないかなと考えた結果思いついたのが、「AIとレスバできるアプリ」 です。
ただ会話するだけでなく、明確な「勝敗」をつける審査までLLMにやらせてみたら面白いんじゃないかと思い、Webアプリとして実装してみました。今回はその紹介をします。
作ったもの
「LLMディベートバトル」
主な機能は以下の5つです。
- テーマの自動生成・手動設定
- 人間 vs LLM のディベート
- LLM vs LLM の自動対戦観戦
- LLMによる自動審査・勝敗判定
- 対戦履歴・戦績データの閲覧
1. テーマが決まらなくても大丈夫
ディベートをしようと思っても「何を話せばいいかわからない」という時のために、ディベートテーマの自動生成機能を実装しました。
ボタン一つで、AIが議論の余地があるトピックをランダムに提案してくれます。もちろん、自分で自由に入力して設定することも可能です。
2. 人間 vs LLM で論破できるか?
メインとなるのが、ユーザーが特定のテーマについてAIと議論するモードです。
例えば、「リモートワークは企業の生産性を向上させるか?」というテーマで、私は「反対側」としてAIに挑んでみました。(個人的な意見としては賛成側ですが...)
こちらが、「リモートワークは、コミュニケーションの低下による企業全体のパフォーマンス低下を招く」という意見を述べたところ、AI側(賛成派)は、「デジタルツールの活用」といった論理で反論することに加え、「通勤時間の削減」という追加の意見も出してきました。中々手強そうな相手ですね。
3. LLM同士の戦い
個人的に実装していて面白かったのが、LLM同士を戦わせる機能です。
「掛け算に順序はあるか?」という、SNSでたまに論争が起こるテーマを投げかけてみました。
- AI-1(賛成側): 「実際の応用やプログラミングのメモリ効率の観点では順序に意味がある」という実利的なアプローチ
- AI-2(反対側): 「数学的には交換法則が成り立つから順序などない」という原理原則のアプローチ
他にも対戦させてみて、そのログを眺めているだけでも、「そういう切り口もあるのか」といった発見があって面白いです。
4. AIによる厳正な審査
議論が終わると、別のLLM(審査員役)が、双方の主張を分析して勝敗を判定します。
今回の「掛け算の順序」対決では、反対側(順序はない派)の勝利となりました。
点数は 75点 vs 85点。
審査コメントを見ると:
「賛成側は実務的な利点を強調したが、数学的視点に基づく反対側の議論に対する反論が弱く、理論的には劣っていた」
といった具合に、もっともらしい講評をくれました。「良かった点」「改善点」までフィードバックしてくれるので、もしかしたらディベートの練習用としても使えるかもしれません。
5. 履歴と戦績データで成長を可視化
ディベートが終わった後も、過去の対戦履歴を一覧で振り返ることができます。
また、これまでの対戦成績(勝敗数や勝率)も自動で集計・表示されるダッシュボード機能もつけました。
技術スタック
今回は Go + ts + React という構成で構築しました。
バックエンド
- 言語: Go 1.23
- ルーター: chi v5
-
AI連携: OpenAI Go SDK
- ここで Structured Outputs を活用しています。LLMからの審査結果(勝敗、スコア、講評など)をJSONとして厳密に構造化して受け取ることで、パースエラーを防ぎ、安定した動作を実現しました。
- データベース: SQLite3
フロントエンド
- フレームワーク: React 18
- 言語: TypeScript 5
- ビルドツール: Vite 7
バックエンドにGoを採用したことで、レスポンスも高速で、並行して走るLLM同士の対戦処理なども効率よく捌けています。また、OpenAIのStructured OutputsとGoの構造体の相性が良く、バックエンドの実装体験は非常に良かったです。
作ってみて分かったこと
1. LLMによる審査の精度は抜群
議論の内容を要約し、論理的整合性をチェックするタスクにおいて、LLMはかなり高いパフォーマンスを発揮しました。人間が判定するとどうしても「好み」が入りますが、AI審査員は提示されたテキストのみで判断してくれるので、ある意味で公平です。
2. 教育ツールとしての可能性
「人間 vs AI」のモードは、自分の意見を論理的に組み立てるトレーニングになります。論理が破綻していると、AIにあっさり論破されたり、審査員AIに「根拠が薄い」と低い点数をつけられたりするので、論理的思考を身に着けることができるかもしれません。
おわりに
単なるチャットボットではなく、「役割」を与えて対立構造を作ることで、LLMの出力結果を制御し、ディベートをさせるという試みはとても面白かったです。
今後も何か面白い機能が思いついたら追加してみたいと思っています。
なお、コードはGitHubに公開しています。動かすにはOpenAIのAPIキーが必須です。ローカルでもdockerでも動かせるようになっています。


