GPT-3でいい感じのJSONを生成するテクニック
GPT-3は自然言語の質問からそれに沿った回答をしてくれますが、わりと自由な形式での回答が返ってきます。たとえば「Windowsでtest.txtを作成するコマンドとその解説」というプロンプトを入力してみると以下の答えが返ってきました。
コマンド:echo > test.txt
解説:echoコマンドを使用して、test.txtという名前の新しいテキストファイルを作成します。このコマンドは、新しいテキストファイルを作成し、そのファイルに何も書き込まないことを意味します。
もし自然言語からコマンドを実行するプログラムを作りたいときにGPT-3がこの回答をしてきても、出力の形式が定まってないためプログラムで読み取って解説を表示したりコマンドを実行したりできません(GPT-3を使ったアプリにチャットボットが多いのはその影響もあるでしょう)。
この問題はプロンプトにJSON Schemaを含めることで解決できます。
JSON Schemaとは?
JSON Schemaは、JSON形式のデータの構造や値の範囲を定義するためのフォーマットです。JSON Schemaを使用することで、JSONが定義に従った記述をしているか検証することができます。
プロンプトと回答の例
コマンドを作成してもらいます。
JSON Schemaに従ってJSON形式で出力してください。
環境はWindowsです。PowerShellで実行できるコマンドを作成してください。
# JSON Schema
```JSON
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "コマンドと説明",
"description": "AIに出力させたいJSONデータです",
"properties": {
"description": {
"description": "一連のコマンドの解説",
"type": "string"
},
"risk": {
"description": "コマンドの危険度",
"enum": [
"低",
"中",
"高"
]
},
"commands": {
"description": "コマンド",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"description",
"risk",
"commands"
]
}
```
# 入力
test.txtを作成
# 出力
# 入力
でコマンドの処理を指定し、# 出力
のあとにコマンドの情報を格納したJSONを出力させるプロンプトの例です。コマンドはcommands
配列に格納させ、コマンドの危険度を示すrisk
を"低", "中", "高"の中から選ばせるようにしました。
上記のプロンプトをGPT-3に入力すると以下のような回答が返ってきます。
```JSON
{
"description": "test.txtを作成するコマンド",
"risk": "低",
"commands": [
"New-Item -Path . -Name test.txt -ItemType File"
]
}
```
commands
が複数でも正しい出力できるか確認するために、入力を「text(数字).txtを三つ作成」にしてみると以下のようになります。
```JSON
{
"description": "text(数字).txtを三つ作成するコマンド",
"risk": "低",
"commands": [
"New-Item -Path . -Name text1.txt -ItemType File",
"New-Item -Path . -Name text2.txt -ItemType File",
"New-Item -Path . -Name text3.txt -ItemType File"
]
}
```
前後にある```を削除しないといけないのが少し手間ですが、JSON Schemaで指定したルールに従ったJSONが作成できました。このJSONをプログラムに読み込んだあとプロンプトで使用したJSON Schemaで検証をすれば出力結果の妥当性も確認できます。
終わりに
このテクニックはGPT-3のモデルの中ではtext-davinci-003
でしか使ません。またJSON Schemaの記述が必要な分多くののトークンを消費することに注意してください。
Discussion