🙅‍♂️

Gemini 2.5 Pro Preview 03-25 で Structured output を使うのは今のところ避けておこう

に公開

※4/8時点での話です

nyという文字列が追加されてしまい、構造化出力ができません。
temperatureをいじると稀にうまくいくこともありますが、structured outputを使いたい時点でtemperatureは下げると思うので、今のところ使うのは避けておいた方が無難だと思います。今まで動いていたコードが動かなくなる可能性があるので、素直にモデルを変えましょう。

Xでのつぶやきも見られました。

https://x.com/SimplrSh/status/1909446878615208401

Google AI Studioでの検証

Gemini 2.5 Pro Preview 03-25

Structured outputを有効化します。

helloと言います。

nyが追加されます。structured outputが壊れています。

Gemini 2.0 Flash

うまくいきます。

コードを読む

Pythonスクリプトでも試しましたが、うまくいかないことを確認しました。
該当の、というわけではないですがリクエストの構造を見たかったのでライブラリのコードを確認。

https://github.com/googleapis/python-genai/blob/71863e00c187c4eb9a379780f0a871235768a555/google/genai/models.py#L6388

https://github.com/googleapis/python-genai/blob/71863e00c187c4eb9a379780f0a871235768a555/google/genai/models.py#L3886

通常、generate_contentを呼び出すと思います。
Pydanticで定義したresponse_schemaは、上記コードの_GenerateContentParameters_to_mldevの中で取得しリクエストパラメーターに含むようにしています。

https://github.com/googleapis/python-genai/blob/71863e00c187c4eb9a379780f0a871235768a555/google/genai/models.py#L581

https://github.com/googleapis/python-genai/blob/71863e00c187c4eb9a379780f0a871235768a555/google/genai/models.py#L416

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は下記でやってそうです。

https://github.com/googleapis/python-genai/blob/main/google/genai/types.py#L3137

本当にjson文字列でだけできるような作りなので、nyがついたりコードブロック形式になってしまったりするとどうしようもなさそうですね。

公式ドキュメントを読む

https://ai.google.dev/gemini-api/docs/structured-output?hl=ja&lang=python#supply-schema-in-config

注: Pydantic バリデータはまだサポートされていません。pydantic.ValidationError が発生した場合、それは抑制され、.parsed は空または null になる可能性があります。

該当のソースコードは下記ですね。3156行目から。

https://github.com/googleapis/python-genai/blob/main/google/genai/types.py#L3137

      # 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_jsonValidationErrorになって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