response_formatによるJSONモードについて(OpenAI API)

皆さんこんにちは。

今更ながら、OpenAIのJSONモードを使い始めました。
その際公式ドキュメントを読みながらいろいろ試していたのですが、response_formatやらFunction Callingやらいろいろと出てきて困惑したので備忘録的に調べたことをまとめていきたいと思います。

JSONモードとは

と、見出しを付けたものの、OpenAI的には以下の3つに分類しています。

  • JSON mode
  • structed output
  • Function Calling

それぞれどういったものか説明していきます

JSON modeは名前の通りJSON形式で出力させる機能です。通常、Chat GPTにJSONを出力させようとすると、コードブロックで出力してしまいます。しかし、JSON modeを使うことで、ChatGPTの出力をそのままJSONにDecodeできるようになります。

Structed OutputはJSON modeと同様、JSON形式で出力させる機能ですが、JSONのKeyを明示的に指定することができます。後述しますが、JSONの各値の型も指定できることもあり、Open AIとしても、基本的にはJSON modeではなく、Structed Outputを使うことを推奨しています。

Function CallingはJSONとして出力された値をもとに、後段にある関数を実行することを想定されている機能です。
ちなみに、公式ドキュメント内でも、関数呼び出し等に使う場合はFunction Callingを、出力された値をユーザーに渡す場合はStructed Output(JSON mode)を使うことを推奨しています。

JSONモード、Structed Outputの使い方

JSON モードの場合は単純で

from openai import OpenAI
openai = OpenAI()
res = openai.beta.chat.completions.parse(
    model="gpt-4o-mini",
    messages={"role": "user", "content": "hogehogefuga"},
    response_format={'type': 'json_object'}
)

とするだけです。が、プロンプト内にJSONという単語が含まれていないとエラーになるのでご注意ください。

では、Structed Outputの場合はどうなるかというと、以下のようになります。

from openai import OpenAI
openai = OpenAI()
res = openai.beta.chat.completions.parse(
    model="gpt-4o-mini",
    messages={"role": "user", "content": "hogehogefuga"},
    response_format={
        'type': 'json_schema',
        'json_schema': {
            'name': 'test',
            'schema': {
                'type': 'object',
                'properties': {
                    'key1': {'type': 'string'},
                    'key2': {'type': ['int', 'null']},
                }
            'required': ['key', 'key2']
            }
        }
)

なお、requiredには実際にrequiredなkeyかどうかにかかわらず、すべてのkeyを入れる必要がある点にご注意ください。
ちなみになくても動作はします(2024/11/1時点)

以上、OpenAI APIでのJSON形式での出力に関する話でした。