Open4

openai

nicopinnicopin
nicopinnicopin

OpenAIのスキーマ定義における制限について

OpenAIの構造化出力は、JSON Schemaに基づいていますが、スキーマ定義や検証にはいくつかの制限が存在します。特に、PydanticのようなPythonフレームワークと連携している場合、以下のような点で問題が生じる可能性があります。

主な制限

  1. 任意のバリデーションができない
    OpenAIのスキーマでは、基本的な型や制約(minimummaximumrequiredなど)のバリデーションは可能ですが、複雑なフィールド間の依存関係や任意のロジックに基づくバリデーションはできません。Pydanticが提供するようなカスタムバリデーションロジックをスキーマに含めることは難しいです。

  2. サポートされる型の制限
    OpenAIがサポートしている型は、stringnumberarraybooleanobjectなどの基本的なものに限られています。PydanticのUUIDconstrained typesのようなカスタム型は、JSON Schemaではサポートされていないため、それらを利用する場合は手動でマッピングを行う必要があります。

  3. 数値フィールドの制約
    数値フィールドに対するminimummaximumといった制約は、Pydanticでは簡単に設定できますが、OpenAIのスキーマバリデーションではこのような制約が適用されない場合があります。これがエラーの原因になることがあり、特定のプロパティに数値の下限や上限を設けたい場合には注意が必要です。

  4. Enum(列挙型)の扱い
    PydanticのEnumLiteralはJSON Schemaのenumにマッピングされますが、OpenAIのスキーマでの使用範囲は限定的です。値のバリデーションや扱いにおいて、期待通りに動作しないケースも考えられます。

  5. 動的スキーマの生成が難しい
    OpenAIでは、スキーマの定義は主に静的なものであり、動的にスキーマを生成するようなケースには向いていません。ユーザーの入力に基づいてスキーマを変更する必要がある場合には、外部ロジックで処理する必要があります。

  6. 高度なバリデーションの欠如
    Pydanticが提供する@validator@root_validatorのような複雑なバリデーションは、OpenAIのJSON Schemaには含まれません。そのため、これらのバリデーションを行う場合は、スキーマ定義の外部で処理する必要があります。

nicopinnicopin

'message': "Invalid schema for response_format 'BlocksDTO': In context=('properties', 'placeholder'), 'default' is not permitted."

defaultも許可されてない模様

nicopinnicopin

union

openai.BadRequestError: Error code: 400 - {'error': {'message': "Invalid schema: Objects provided via 'anyOf' must not share identical first keys. Consider adding a discriminator key or rearranging the properties to ensure the first key is unique.", 'type': 'invalid_request_error', 'param': None, 'code': None}}
暗黙的にoneOfにさせたいときはオブジェクトの最初のプロパティをユニークキーとしろってことか

明示的なdiscriminated union

Error code: 400 - {'error': {'message': "Invalid schema for response_format 'BlocksDTO': In context=('properties', 'data'), 'oneOf' is not permitted.", 'type': 'invalid_request_error', 'param': 'response_format', 'code': None}}
not supported yet
https://community.openai.com/t/oneof-allof-usage-has-problems-with-strict-mode/966047