ChatGPT APIで一つゲームを作ってみたいと思ったので、4択問題を生成してそのままクイズゲームを遊べるゲームを作ってみました。こちらで公開中なのでぜひ遊んでみてください。

使用したプロンプト

プロンプトは下記を使用しています。

あなたは今から、私のコメントするテーマにそったクイズを3問作成してください。
答えには正しい情報を使用してください。
ただし、問題分はJsonで作成して、Json以外の文字と数字は書かないでください。
5問のJsonすべてをまとめて[]で囲ってください。
正解ならis_correctをtrueに、不正解ならfalseにしてください。
問題が作れなかった場合はそのテーマに関連する別のテーマで作成してください。
{
"question": "問題文",
"choices": [
{
"choice": "選択肢1",
"is_correct": false
},
{
"choice": "選択肢2",
"is_correct": false
},
{
"choice": "選択肢3",
"is_correct": false
},
{
"choice": "選択肢4",
"is_correct": true
}
],
"commentary": "問題についての解説"
}

生成されるJsonのサンプルはこちら。テーマを「小学校の理科」にした場合。

[
{
"question": "動物の中で哺乳類に該当するものは何?",
"choices": [
{"choice": "カエル", "is_correct": false},
{"choice": "トビウオ", "is_correct": false},
{"choice": "トカゲ", "is_correct": false},
{"choice": "クマ", "is_correct": true}
],
"commentary":"カエル、トビウオ、トカゲは爬虫類に、クマは哺乳類に該当します。"
},
{
"question": "物体の重さを測定することのできる道具は何?",
"choices": [
{"choice": "温度計", "is_correct": false},
{"choice": "はかり", "is_correct": true},
{"choice": "メジャー", "is_correct": false},
{"choice": "水平器", "is_correct": false}
],
"commentary":"物体の重さを測定することのできる道具ははかりです。"
},
{
"question": "次のうち、果物ではないものはどれ?",
"choices": [
{"choice": "リンゴ", "is_correct": false},
{"choice": "キウイ", "is_correct": false},
{"choice": "人参", "is_correct": true},
{"choice": "バナナ", "is_correct": false}
],
"commentary":"リンゴ、キウイ、バナナは果物ですが、人参は果物ではありません。"
}
]

開発中に問題になった点

余計な文字が入ってJsonとして読み込めない

最初に指定していたプロンプトは下記でしたが、これでは欲しい回答は得られませんでした。

あなたは今から、私のコメントするテーマにそったクイズを3問作成してください。
答えには正しい情報を使用してください。
ただし、問題分はJsonで作成して、Json以外の文字は書かないでください。
正解ならis_correctをtrueに、不正解ならfalseにしてください。
{
"question": "問題文",
"choices": [
{
"choice": "選択肢1",
"is_correct": false
},
{
"choice": "選択肢2",
"is_correct": false
},
{
"choice": "選択肢3",
"is_correct": false
},
{
"choice": "選択肢4",
"is_correct": true
}
],
"commentary": "問題についての解説"
}

下記のように「1.」などの問題の番号が振られてしまいます。問題分の配列でJsonが欲しいので、これでは正しく読み込めません。

1.

```
{
  "question": "たこ焼きの起源は?",
  "choices": [
    { "choice": "大阪", "is_correct": true },
    { "choice": "京都", "is_correct": false },
    { "choice": "東京", "is_correct": false },
    { "choice": "福岡", "is_correct": false }
  ],
  "commentary":"たこ焼きの起源は、大阪にあります。昭和初期頃に発明されました。"
}
```

2.

```
{
  "question": "たこ焼きに使われる活かされた生地とは?",
  "choices": [
    { "choice": "うどん生地", "is_correct": false },
    { "choice": "お好み焼き生地", "is_correct": false },
    { "choice": "たい焼き生地", "is_correct": false },
    { "choice": "お好み焼きにも使われる天かす入りの生地", "is_correct": true }
  ],
  "commentary":"たこ焼きの生地には、お好み焼きにも使われる天かす入りの生地が使われます。"
}
```

3.

```
{
  "question": "たこ焼きに使われるタコはどこから入手される?",
  "choices": [
    { "choice": "近海で獲れるタコ", "is_correct": false },
    { "choice": "冷凍されたタコ", "is_correct": true },
    { "choice": "生のタコ", "is_correct": false },
    { "choice": "養殖されたタコ", "is_correct": false }
  ],
  "commentary":"たこ焼きに使われるタコは、一般的には冷凍されたものを使用します。"
}
```

解決方法

解決方法としては「5問のJsonすべてをまとめて[]で囲ってください。 」が有効でした。自分が試した限りでは以降Json以外の文字は入っていないです。
解決する前に「問題分はJsonで作成して、Json以外の文字と数字は書かないでください。 」というプロンプトの追加も試していましたが、特に結果は変わりませんでした。連続した回答を出力する際は番号を振るように設定されているのかもしれません。[]で囲うことによって、連続されたものではなく1つの回答としてGPTが判断してくれたのかと推測しています。
また、解決方法として問題数分のJsonをプロンプトの中に指示するという方法もあると思いますが、プロンプトを多くした分だけコストも上がるので、それは避けました。