ウミガメのスープを文章生成AIが出題してくれるサイトを作った。
何をやっている?
LLMを使用して、水平思考クイズを遊ぶ上での課題を解決しようとしてWebアプリをリリースしました。
水平思考クイズとは?
水平思考クイズは、一見不思議な状況が提示され解答者が質問を繰り返して真相を突き止める推理ゲームです。
質問は「はい」か「いいえ」で答えられるものに限られ、解答者は制限された情報の中で答えを見つけなければなりません。
例えば、以下のような問題があるとします。
花子さんは仕事場に向かい、市営バスに乗った。しかし、終点に着いてもバスから降りずずっと座っている。なぜだろう?
これに対して以下のようなやり取りで、解答者は答えの可能性を狭めていきます。
解答者:「バスジャックに遭ってしまいましたか?」
出題者:「いいえ」
解答者:「花子さんは動ける状態ですか?」
出題者:「はい」
無限にある可能性の中から、自ら探索的に答えを導いていく面白さが水平思考クイズの魅力です。
何が課題?
水平思考クイズは2人以上でやり取りしながら遊ぶゲームなので、基本的に1人で遊ぶことができません。
そこで質問に回答する側を自動化したいのですが、今までの技術では(自分の理解している範疇では)質問の自然言語を解して分類を行うだけではなく論理的に正しい回答を得ることが困難でした。
そこで今流行りのOpen AIを利用してみることにしました。
できたもの
Yesonor(いえそな)という「AIとウミガメのスープを楽しめる水平思考クイズの投稿サイト」をリリースしました。
サービス内容
このサイトは以下のサービスを提供します。
- 自作の水平思考クイズが投稿できます。
- 投稿されている水平思考クイズに挑戦できます。(その際、AIが質問に対して回答してくれるので1人でいつでも暇な時に挑戦できます。)
機能と実装
①質問に対して回答する機能
AIが質問に対して「はい」か「いいえ」で回答してくれます。
Chat Completions APIにクイズの真相と質問を結合したプロンプトを与え、回答を出力として得るようにしました。
プロンプトの例(実際は英語です。)↓
## 命令
以下の情報と例に基づいて、ユーザーの質問にTrue(はい)、False(いいえ)、Unknown(不明/言及なし)で答えなさい。
## 問題
太郎さんは目がいいのにメガネを掛けている。なぜ?
## 真相
太郎さんはオシャレ好きであり、度が入っていない伊達メガネを掛けている。
## 質問(解答者の入力した文章)
太郎さんは自分の意思でメガネをかけていますか?
回答はFunction Callingの機能を使用し、True
/False
/Unknown
のいずれかの値を持つJSONとして返却させます。返却の値を制限しているのは、以下の理由からです。
- 回答に使用するトークンを小さくすることでレスポンスを早くする。
- AIが余計なことを喋ってネタバレになってしまうことを防止する。
回答の精度を向上させるためのFew-shot Learning
水平思考クイズには一捻りされているクイズが多く、通常のLLMの文章生成では作者の意図した回答を得られないこともあリます。
そのためクイズの作者には1つの問題に対して質問とその回答の例(以降、QuestionExample)を3問以上入力するように求め、それらをプロンプトに含ませています。(いわゆるFew-shot Learning)
ただし、多すぎる数のQuestionExampleをプロンプトに含めすぎると回答の精度が落ちてしまう現象が発生したため、解答者がした質問とベクトル上の距離が近いQuestionExampleのみを送信するようにしました。
この時、質問同士の距離を計算するのにOpen AIのEmbeddingsを利用しています。
解答者の満足度を向上させるためのカスタムメッセージ機能
クイズの形式上、ネタバレ防止のため質問の回答が「はい」か「いいえ」しか返さないようにしているため解答者視点どうしても情報が不足してしまいます。
それに対する対策として、回答に加え作者が設定した独自の返答(以降、CustomMessage)を返すことができる機能を実装しました。
CustomMessageはQuestionExampleに対して紐づけて設定することが可能で、解答者がした質問とベクトル上の距離(上記参照)が閾値以上に近いQuestionExampleに設定されているCustomMessageをメッセージとして表示します。
これにより、あたかも「AIが気を利かせて適当な返答をしている」かのような体験を提供することを目指します。
②正解・不正解を判定する機能
AIが解答者の解答(クイズの答え)を評価し、正解/不正解を判定してくれます。
前述の質問機能と同様にChat Completions APIにクイズの真相と解答を結合したプロンプトを与え、判定をさせます。
ただ、前述の質問機能と違いこういった文章を解答として受け取るクイズの正解判定を行うためには、何を正解とするかをLLM側に理解させる必要があるのがかなり難しいです。
今回は「入力と正解を比較して、入力が正解で説明されている要素を全て網羅しているか?」を判定条件としてプロンプトに入れました。
また、Embeddingsを使って解答がどれだけ的を得ているかをある程度数値化してユーザーに見せるようにすることで、ユーザーに「少しずつ真相に近づいている」感覚を与えるようにしています。
運用してみて
運用し始めてそろそろ半年が経っているわけですが、「LLMを使ったシステムを運用してどうか」という感想を雑に
LLMはまあまあ賢い
自分でも1ユーザーとして色々質問を投げたりしていますが、意外とLLMがちゃんと回答をくれるので嬉しかったです。
とはいえ、人間レベルの気が利いた対応は全然できておらず厳密な回答を期待するユーザーに対してはあまりいい体験を提供できてないと思われます。
高い
Open AIに払っているお金が趣味の範囲を超えてきています。
お陰様で一定数の方々に遊んでいただいているとはいえ、決してバズったとは言えないレベルのユーザー数でも月当たり数千円くらいかかっています。(正確な値は自分の個人的なLLM利用の分も混ざっている関係でわからない)
実際にこのサービスで本格的に黒字を生み出そうとすると現状のOpen AIのコスト設定では厳しいという印象です。
終わりに
まだまだ改善の余地があるサービスです。
特に質問機能の体験はモデルの精度向上に伴ってよくなっていくと思われるので今後のOpen AIのアップデートに期待です。
そもそもGPT以外にも色々なAIソリューションがあるため色々試していければと思います。
ぜひ、Yesonorに遊びに来てください。
Discussion