openai
OpenAIのスキーマ定義における制限について
OpenAIの構造化出力は、JSON Schemaに基づいていますが、スキーマ定義や検証にはいくつかの制限が存在します。特に、PydanticのようなPythonフレームワークと連携している場合、以下のような点で問題が生じる可能性があります。
主な制限
-
任意のバリデーションができない
OpenAIのスキーマでは、基本的な型や制約(minimum
、maximum
、required
など)のバリデーションは可能ですが、複雑なフィールド間の依存関係や任意のロジックに基づくバリデーションはできません。Pydanticが提供するようなカスタムバリデーションロジックをスキーマに含めることは難しいです。 -
サポートされる型の制限
OpenAIがサポートしている型は、string
、number
、array
、boolean
、object
などの基本的なものに限られています。PydanticのUUID
やconstrained types
のようなカスタム型は、JSON Schemaではサポートされていないため、それらを利用する場合は手動でマッピングを行う必要があります。 -
数値フィールドの制約
数値フィールドに対するminimum
やmaximum
といった制約は、Pydanticでは簡単に設定できますが、OpenAIのスキーマバリデーションではこのような制約が適用されない場合があります。これがエラーの原因になることがあり、特定のプロパティに数値の下限や上限を設けたい場合には注意が必要です。 -
Enum(列挙型)の扱い
PydanticのEnum
やLiteral
はJSON Schemaのenum
にマッピングされますが、OpenAIのスキーマでの使用範囲は限定的です。値のバリデーションや扱いにおいて、期待通りに動作しないケースも考えられます。 -
動的スキーマの生成が難しい
OpenAIでは、スキーマの定義は主に静的なものであり、動的にスキーマを生成するようなケースには向いていません。ユーザーの入力に基づいてスキーマを変更する必要がある場合には、外部ロジックで処理する必要があります。 -
高度なバリデーションの欠如
Pydanticが提供する@validator
や@root_validator
のような複雑なバリデーションは、OpenAIのJSON Schemaには含まれません。そのため、これらのバリデーションを行う場合は、スキーマ定義の外部で処理する必要があります。
'message': "Invalid schema for response_format 'BlocksDTO': In context=('properties', 'placeholder'), 'default' is not permitted."
default
も許可されてない模様
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