diff --git a/%E3%82%B0%E3%82%AB%E3%83%8D%E3%83%BC%E3%82%BF%E8%A6%81%E4%BB%B6.md b/%E3%82%B0%E3%82%AB%E3%83%8D%E3%83%BC%E3%82%BF%E8%A6%81%E4%BB%B6.md new file mode 100644 index 0000000..996ca0e --- /dev/null +++ b/%E3%82%B0%E3%82%AB%E3%83%8D%E3%83%BC%E3%82%BF%E8%A6%81%E4%BB%B6.md @@ -0,0 +1,268 @@ +# グカネータ要件メモ + +* グカネータは、タグ広場上の投稿を当てる Akinator 風ゲームである。 +* 単なる投稿当てゲームではなく、プレーを通じて質問・回答例を蓄積し、次回以降の挙動を改善する学習機構でもある。 +* ユーザが投稿を 1 つ思ひ浮かべ、グカネータが質問を重ねて候補を絞り、最終的に投稿を推測する。 +* 回答は少なくとも以下を扱ふ。 + + * はい + * いいえ + * 部分的にそう + * たぶん違ふ + * わからない +* `わからない` はユーザが判断不能な場合のために必要である。 +* `わからない` は学習例として保存しない。 + +## 基本方針 + +* グカネータは「遊べること」と「学習すること」の両方を満たす必要がある。 +* ゲーム中の回答は、単なる履歴として残すだけでは不十分である。 +* 質問への回答後、それが送信され、今後の質問選択・候補推定・類似判定に影響する必要がある。 +* 投稿を当てるだけでなく、投稿を識別するための良い質問を蓄積していくことが重要である。 +* 既存タグの復唱だけでなく、投稿同士を分ける分類軸を発見することを重視する。 + +## 公開範囲 + +* 現時点では管理者向け機能としてよい。 +* ただし、将来的には一般ユーザにも遊ばせる前提で設計する。 +* 公表版では内部情報を見せない。 +* 以下のような情報は、一般ユーザ向け UI では隠す。 + + * 候補スコア + * 内部パラメータ + * デバッグ用ログ + * `question_generation_stalled` のような内部状態 + * 「考え込んでます」など、内部都合が見える文言 + +## 質問数ルール + +* 原則として 25 問までは推測しない。 +* 不正解後も、すぐ再推測せず、一定数の質問を挟む。 +* 最大質問数は 80 問とする。 +* 80 問に到達した場合は、通常の推測継続ではなく、正解投稿の指定・訂正導線へ進める。 +* 「続けますか」に対してユーザが続行を選んだ場合でも、すぐに再推測してはいけない。 + +## winning_run + +* `winning_run` は、候補がほぼ 1 件まで絞れた場合の最終確認モードである。 +* `winning_run` 専用の質問リストは持たない。 +* 以下のような専用質問は廃止する。 + + * 投稿そのものと言ってよさそう? + * かなり近いイメージ? + * 少し違う印象もある? +* これらは比較対象が画面上に示されないため、ユーザにとって意味が分かりづらい。 +* `winning_run` 中も、通常時と同じ形式の質問を使ふ。 +* 通常時と `winning_run` で違ふのは、質問生成器ではなく質問選択基準である。 +* 通常時は、候補集合をよく分割できる質問を選ぶ。 +* `winning_run` 時は、対象投稿に対して期待回答が判定できる質問を選ぶ。 +* `winning_run` が崩れて通常候補に戻るときは、背景を急に切り替へず、滑らかに遷移させる。 + +## 候補 0 件時の扱ひ + +* 候補 0 件でゲームを壊してはいけない。 +* 候補 0 件は、回答ミス・質問の曖昧さ・データ不足などで普通に起こり得る。 +* 候補 0 件になった場合は、候補集合を段階的に広げて復旧する。 +* 復旧処理の内部状態は一般ユーザに見せない。 +* 復旧できない場合も、ユーザが正解投稿を指定できる導線を用意する。 + +## 質問の種類 + +* 質問は少なくとも以下の種類を扱ふ。 + + * タグに関する質問 + * 投稿元に関する質問 + * タイトル語句に関する質問 + * オリジナル投稿日に関する質問 + * 投稿間類似・印象・分類軸に関する質問 +* 質問の出所として、少なくとも以下を扱ふ。 + + * デフォルト質問 + * ユーザ追加質問 + * 管理者調整質問 + * AI 生成質問 +* AI 生成質問の正式稼働は、現時点では別課題とする。 + +## 良い質問 + +* 良い質問は、投稿同士を自然に識別できる質問である。 +* 良い質問の例。 + + * 歌・音楽の印象が強い? + * 元ネタを知らないと分かりにくい? + * MAD というより素材集に近い? + * 特定投稿者らしさが強い? + * 二次創作・派生作品寄り? + * サムネイルで判別しやすい? + * 内輪文脈を知らないと分かりづらい? +* 人間が投稿を思ひ浮かべるときに自然に把握してゐる特徴を優先する。 + +## 悪い質問・優先度を下げる質問 + +* 二分探索として有効でも、人間が把握しづらい質問は優先しない。 +* 以下のような質問は最終手段とする。 + + * タイトルは ○○ 文字以上? + * タイトルに ASCII 文字が含まれる? + * その他、投稿を思ひ浮かべる人間が普通は意識しない機械的特徴 +* これらは完全削除ではなく、他に有効な質問がない場合の fallback として扱ふ。 +* 「かなり近いイメージ?」のように、何と比較してゐるか不明な質問は出さない。 + +## オリジナル投稿日の質問 + +* オリジナル投稿日に関する質問は、原則として年質問を中心にする。 +* 例。 + + * 2024 年に投稿された? +* 月や月日系の質問は控へる。 +* 理由は、通常のユーザが投稿の月日まで覚えてゐるとは限らないためである。 +* ただし、以下の月日は特別な意味を持つため、優先度を下げない。 + + * 12 月 3 日 + * 1 月 1 日 + * 12 月 31 日 + * 5 月 29 日 +* 特別日は自然文で表示する。 + + * 元日に投稿された? + * 大晦日に投稿された? + * 12月3日に投稿された? + * 5月29日に投稿された? + +## ユーザ追加質問 + +* ゲーム終了時に、ユーザは質問を追加できる。 +* 1 ゲームあたりの質問追加数には上限を設ける。 +* ユーザ追加質問は、正解投稿に対する回答例とセットで扱ふ。 +* ユーザ追加質問は、デフォルト質問よりも出やすくしてよい。 +* ただし、公表版では低品質質問・内輪質問・ふざけた質問の扱ひに注意する。 +* ユーザに表示された質問は、出所にかかはらずグカネータの発言として受け取られる。 +* そのため、公開導線では質問品質を制御する必要がある。 + +## 追加で質問に答える機能 + +* ゲーム終了後、ユーザに追加で質問へ答えてもらふ機能を持つ。 +* これは、既存の投稿間類似質問について、正解投稿に対する回答例を増やすための補助学習である。 +* 保存する情報は以下。 + + * 正解投稿 + * 質問 + * ユーザ回答 +* この機能は、本編回答の自動学習とは別である。 +* 追加質問への回答も、次回以降の質問選択・候補推定に影響する。 + +## 本編回答の自動学習 + +* 本編中にユーザが答えた質問回答は、ゲーム終了時に今後の挙動へ反映する。 +* ゲーム結果だけを保存し、回答履歴が次回以降に影響しない状態は要件違反である。 +* ゲーム保存時に、本編回答から学習例を作成または更新する。 +* 学習対象は、まず安全に以下とする。 + + * accepted な DB 上の質問 + * 正解投稿に対する回答 + * `unknown` 以外の回答 +* 同一 question / post / user の回答例が既にある場合は、重複作成せず更新する。 +* 動的生成されたタグ・投稿元・タイトル・投稿日質問は、初期実装では自動学習対象から外してよい。 +* 理由は、これらが事実データと衝突する可能性があるためである。 +* 学習した件数は API レスポンスまたは UI で確認できるようにする。 +* 学習対象がない場合に「覚えたよ」と表示するのは避ける。 +* 表示例。 + + * 3件の回答を学習しました + * 結果を記録しました + +## AI 質問 + +* AI 質問の正式稼働は、現時点では別課題とする。 +* AI はプレー中に毎回呼ぶものではない。 +* AI は最終判定者ではない。 +* AI は、質問分類・質問文の正規化・既存投稿への回答補完・詰まり対策などの補助に使ふ。 +* AI 実行は低コスト・キャッシュ・バッチ処理を基本とする。 +* AI 補完用 API は、直ちにプロンプトを投げるものではなく、補完対象リストを生成するためのものとする。 +* 実際の AI 処理は定時バッチで行ふ。 + +## 質問選択 + +* 質問選択は、単純な情報量最大化だけでは不十分である。 +* 以下を総合して選ぶ。 + + * 候補を分ける力 + * 質問の自然さ + * 人間の答へやすさ + * 冗長性の低さ + * 既に聞いた質問との重複回避 + * ユーザ追加質問の優先 + * 管理者調整質問の優先 + * 最近のゲームで同じ初手が続くことの回避 +* 上位 2 件付近で停滞し続ける挙動は避ける。 +* 必要に応じて候補分散を広げ、常に上位候補を狭める質問を探す。 +* 端末性能や画面幅によって質問ロジックを変へない。 + +## 背景・演出 + +* 背景はプレー体験の一部である。 +* スマホでも背景を表示する。 +* 端末幅によって背景を強制的に消さない。 +* 軽量モードは廃止する。 +* 残すのは背景表示設定のみとする。 +* 背景設定の例。 + + * オフ + * 控えめ + * オン +* 背景は TopNav より下に表示する。 +* 背景がナビゲーションを覆ってはいけない。 +* 背景はスクロールによって不自然に動かないようにする。 +* `winning_run` が崩れた場合、背景は滑らかに通常候補背景へ戻す。 + +## マスコット・文言 + +* マスコットは洗澡鹿(シーザオグカ)である。 +* 状態に応じて表情を変える。 +* 外したのに confident 顔になるのは不適切である。 +* 当たった場合のみ勝利台詞を出す。 +* 外した場合は失敗台詞を出す。 +* 勝利時の文言例。 + + * グカカカカwwww +* 失敗時の文言例。 + + * ぬわーん! 洗澡鹿(シーザオグカ)外しちゃったグカー!!!!! + +## 終了画面 + +* 終了画面には以下の導線を用意する。 + + * もう一度 + * 修正 + * 質問を追加 +* ゲーム結果は終了時に保存されるべきであり、別途保存ボタンを強調する必要は薄い。 +* 不正解時には、正解投稿を指定・修正できる導線を用意する。 +* hard max 到達時は、推測継続ではなく正解指定に寄せる。 + +## #371 の範囲 + +* #371 では以下を扱ふ。 + + * winning_run 専用質問の廃止 + * winning_run 中も通常時と同じ質問生成器を使ふ + * winning_run が崩れたときの背景遷移を滑らかにする + * 本編回答の自動学習バグ修正 + * 人間的な質問の優先 + * タイトル文字数系質問の最終手段化 + * オリジナル投稿日質問の年中心化 + * 特別日の自然文表示 +* #371 では以下を扱はない。 + + * AI 質問生成の正式稼働 + * AI 補完バッチの正式稼働 + * 軽量モードの復活 + * winning_run 専用の別質問リスト再作成 + +## 未確定・要確認事項 + +* `winning_run` は 25 問未満でも推測してよいか。 +* ユーザ追加質問を、公表版でも即 accepted 扱ひにするか。 +* 本編自動学習の対象を `post_similarity` 以外にも広げるか。 +* 公表版で低品質・下ネタ・内輪質問をどの程度隔離するか。 +* AI は将来的に夜間補完だけに使ふのか、詰まり時の質問生成にも使ふのか。