エンジニアリングとお金の話

都内で働くエンジニアの日記です。

response_formatとfunction_callingのjson出力の違いについて

【SPONSORED LINK】

先日OpenAI DevDayで発表があったresponse_formatを早速使用してみました。

response_formatはプロンプトにjson形式を指定することで出力がJSON形式に固定されるモードになります。使い方は簡単で以下条件を満たせばOKです。

  • モデルをgpt-4-1106-previewかgpt-3.5-turbo-1106にする
  • systemプロンプトにjson形式で出力することを記載する
  • パタメータにresponse_format={ "type": "json_object" }を追加する

今まではjson形式で出力を行う時はfunction_callingを使用していたのですが、それに比べると非常に簡単にjson形式で出力を行うことが可能となりました。これ幸いと今までfunction_callingで記載していた処理を書き換えたのですが以下の問題が発生しました。

出力する型が固定されない

function_callingでjsonを出力して時は下記の通り型をboolean型で指定していたので出力結果もboolean型で返却されていたのですが、response_formatで指定した時はboolean型だったり、文字型だったりと混在している感じでした。

function_callingの指定

functions =[
    {
        "name":"dummy_func",
        "description":"true or falseを受け取る",
        "parameters":{
            "type":"object",
            "properties":{
                "flg":{
                    "type":"boolean"
                }
            }
        },
        "required": ["flg"],
    }
]

function_callingの出力

{ "flg": true }

response_formatの指定(プロンプト)

出力形式はJSONでkey名は"flg"、値は"true"又は"false"として下さい。

response_formatの出力

{ "flg": false }
{ "flg": "false" }

モデルをgpt-3.5-turbo-1106にするとfunction_callingが空を返すようになった

response_formatだと出力が安定しなかったのでモデルをgpt-3.5-turbo-1106でfunction_callingでjsonを返却するように処理を実施すると、稀に空が返却されるようになりました。

function_callingの出力

{"flg":true}
{}

まとめ

response_formatは便利だけど、出力結果の型が重要なもの(boolean型や数値型など)についてはfunction_callingを使用した方が良いのではと思いました。プロンプトの指定でここらへんが制御出来るか試してみようと思います。