ChatGPT (GPT-4)に無限にクイズを出題してもらうアプリを作った話
はじめに
こんにちは、個人開発者の ymdkit です。普段は学習支援系のサービスの開発、運営をしています
今回はゴールデンウィークの思いつきでゲームアプリを一つリリースしたので、そのアプリについて紹介していきます。
つくったもの
「エンドレス雑学」というゲームアプリを開発しました。機能としてはシンプルで「無限に出題され続けるクイズを解き続け、そのスコアを競う」というものです。
ログイン不要ですぐに遊べるので、暇な時に遊んでもらえるとうれしいです。
スクショ1 | スクショ2 | スクショ3 |
---|---|---|
アプリストアの URL
iOS https://apps.apple.com/jp/app/id6448931046
Android https://play.google.com/store/apps/details?id=com.ankimaker.trivia.endless_trivia&hl=ja
無限にクイズを出題してもらう仕組み
このアプリのタイトルにもなっている「エンドレス」でクイズを出題し続ける仕組みについて説明します。問題生成には ChatGPT を活用しています
問題の生成
ChatGPTで問題を生成してもらう仕組みについて、ざっくり説明します。
まずはじめに、ChatGPTへの命令を工夫すればJSON形式で回答してくれることを利用して
{
question: "問題文",
answer: "答え",
wrongChoices: ["はずれ","はずれ","はずれ"]
}
のようなJSONが返ってくるようにプロンプトを作成します。(コード例は調べたら色々出てくるので割愛します)
【参考記事の一例】
次に、問題を生成するプロンプトを準備します。今回は、「${name}についての雑学を3問出題してください」というテンプレートを用意し、ここに多種多様なジャンルを渡すことで問題の多様性をもたせています。
ちなみに、ジャンルをたくさん羅列するのも面倒だったので ChatGPT に予め丸投げして提案してもらっています
作業風景1 | 作業風景2 |
---|---|
生成するタイミング
問題を生成する仕組みができれば、後はそれを「どのタイミングで」呼び出すか、という話になってきます。
最初は、「スクリプトを回して数百問まとめて作っておく」つもりでいたのですが、この方法だと
- 利用状況を見つつ、定期的にデータを補充する必要がある(面倒)
- 使われるかどうかもわからないうちからAPI料金が発生するのは微妙
という問題があったので、いろいろ考えた結果、「ユーザの誰かが現存する問題すべてを解いたことをトリガにして新しい問題を補充する(生成する) 」という仕組みにしました。この方式にすることで、
- ユーザの利用状況に応じたAPI料金を払うだけで済む
- 動的にマスタデータが補充されるので、基本ほったらかしで良い
という状態を実現できました。
料金面
OpenAI API を使ったサービスを作る場合、生成のコスト(料金)をどう抑えるかがキモになってくるかと思います。このアプリの場合は、
- ユーザの自由入力で生成を行わせない
- 生成されたデータをユーザ全員で使い回す(1生成あたりのコスパを高める)
- 最初にまとめてデータを生成せず、ユーザの利用状況に応じて動的にクイズ生成が行われるようにする
という形で、現実的なコストで GPT-4 のモデルをサービスに組み込むことに出来ました。
→もしもAPIの利用上限に達するレベルで正解し続ける猛者が現れた場合はエンドレスではなくなるリスクがあります()
課題点
- たまに最新情報を問うクイズが生成されるが、2021年時点のものなのでそのうち情報が誤りになるリスクが有る
- 出題されるクイズの多様性を増やすために
temperature
を上げたいが、上げすぎると「json ですらない謎の文字列」が生成されてしまい使い物にならない (現在は1固定) - もとのデータ数が多いからなのか、「文学 → シェイクスピア関連の問題」「音楽 → ビートルズ関連の問題」といった具合にジャンルを広く指定してもなんとなく出題が偏る場面が合った
- 渡すプロンプトの問題かもしれない
コンテンツの質の担保
前述の課題点などもあり、 ChatGPT 単体だとどうしてもクオリティの低い問題が生成される可能性があります。この点をどう解決しようか悩んだ結果、「ユーザの力を借りる」という結論に至りました。
具体的には、不正解だった際にその問題の誤りを通報できる仕組みを作り、内容を確認次第削除や修正をする形としています。 とはいえ誤りの内容まで入力してもらうのはハードルが高く面倒な気がしたので、候補から選択してもらうUIとしました。
スクショ1 | スクショ2 |
---|---|
現在は通報をもとに人力でマスタデータをいじっていますが、「〇〇人以上から誤りを指摘された問題を自動で削除する」のようなシステムを作れば自動でコンテンツを浄化していく仕組みができそうです。
使用技術
「モチベがなくならないうちにさっさとリリースしたい」という思いのもと、楽できるところはとことん楽できるように技術を選びました。 このおかげか、開発開始から約1週間でリリースすることが出来ました。(5/5開発開始→5/10リリース)
また、「リリースされてるだけで赤字」となるのは避けたかったので、可能な限り無料枠のあるサービスを使っています。(基本ほったらかしでもサービスが維持したい意図)
-
- モバイルアプリのクロスプラットフォーム開発用のものです
- 特に凝った機能は無いアプリだったので、最大限に恩恵を受けることができました
- 早く作る上で大事なのは「いかにそのプラットフォームの思想に添えるか」だと思い、純正で用意されているパーツやスタイルをふんだんに使い倒しました
-
- ドキュメント系の静的サイトをビルドするためのフレームワークです
- 利用規約やプラポリ、FAQを配置するために使いました( Markdown で書けるので楽)
-
Firebase
- FireStore
- クイズのマスタデータを格納しています
- 無料枠を超えることはまずないと思うので、しばらく放ったらかしでも安心です
- Functions
- 外部サービスをラップするための簡易的なREST APIとして使っています(TypeScript)
- OpenAI 等をアプリから直で叩くのは怖いので、面倒ですが自前のサーバを用意するのは必須だと思います
- RemoteConfig
- AdMobの広告ID等を制御するのに使っています
- Flutter開発の観点でいくと、 Android と iOS で値を振り分けられる点がとても便利です
- Hosting
- 利用規約やプラポリをホスティングしています
- FireStore
-
- みんなおなじみ ChatGPT です
- 今回はクイズを JSON 形式で出力してもらっています
- 本当は GPT-3.5 を使いたかったのですが、生成されるクイズの精度が微妙すぎたので泣く泣く GPT-4 を使うことにしました(料金高い...)
-
- ゲーム関連の機能を提供しているクラウドサービスです
- ランキング機能(leaderboard)の開発のために利用しました
- 現状月10万アクセスまでは無料で使えるとのことなので、しばらくは大丈夫そうです
おわりに
ここ最近の生成AI技術の発展で、何かを作る上での技術的制約や学習コストは大きく下がっているなと感じています。そういった時代の中で、後必要なものは「それを使って何かを作りたいと思う意志」だけなのかな... と思うようになりました。 この気持ちをこれからも絶やさず、便利なツールを手足として活用できるようになりたいです。
Discussion
flutterを学び始めた大学生です!
エンドレス雑学のコードを教えてくださると幸いです!