Gemini 2.5 Pro Preview 03-25 で Structured output を使うのは今のところ避けておこう
※4/8時点での話です
ny
という文字列が追加されてしまい、構造化出力ができません。
temperatureをいじると稀にうまくいくこともありますが、structured outputを使いたい時点でtemperatureは下げると思うので、今のところ使うのは避けておいた方が無難だと思います。今まで動いていたコードが動かなくなる可能性があるので、素直にモデルを変えましょう。
Xでのつぶやきも見られました。
Google AI Studioでの検証
Gemini 2.5 Pro Preview 03-25
Structured outputを有効化します。
hello
と言います。
ny
が追加されます。structured outputが壊れています。
Gemini 2.0 Flash
うまくいきます。
コードを読む
Pythonスクリプトでも試しましたが、うまくいかないことを確認しました。
該当の、というわけではないですがリクエストの構造を見たかったのでライブラリのコードを確認。
通常、generate_content
を呼び出すと思います。
Pydanticで定義したresponse_schema
は、上記コードの_GenerateContentParameters_to_mldev
の中で取得しリクエストパラメーターに含むようにしています。
if getv(from_object, ['response_schema']) is not None:
setv(
to_object,
['responseSchema'],
_Schema_to_mldev(
api_client,
t.t_schema(api_client, getv(from_object, ['response_schema'])),
to_object,
),
)
ここでresponse_schema
を取り出して、リクエストに含めるようにしていますね。
少なくともライブラリのバグではなさそうです。
structured outputは下記でやってそうです。
本当にjson
文字列でだけできるような作りなので、ny
がついたりコードブロック形式になってしまったりするとどうしようもなさそうですね。
公式ドキュメントを読む
注: Pydantic バリデータはまだサポートされていません。pydantic.ValidationError が発生した場合、それは抑制され、.parsed は空または null になる可能性があります。
該当のソースコードは下記ですね。3156行目から。
# Pydantic schema.
try:
result_text = result._get_text(warn_property='parsed')
if result_text is not None:
result.parsed = response_schema.model_validate_json(result_text)
# may not be a valid json per stream response
except pydantic.ValidationError:
pass
except json.decoder.JSONDecodeError:
pass
出力にny
が含まれることが原因でmodel_validate_json
でValidationError
になってresult.parsed
にstructured outputが入ってこない感じですかね。
おわりに
推測でしかないですが、Gemini 2.5 Pro Previewの学習過程で、structured outputを行うときにny
の重要度が高くなってしまったのでしょう。
Gemini 2.0 Flashではほぼ確実にうまくいくので、Backend側のバグでもなさそうです。
素直にモデルのアップデートを待つのが良いでしょう。プレビュー版ですからね。
Gemini 2.5 Pro Preview 03-25をstructured outputで使用しようと考えている方は気を付けてください。
Discussion