Ollama の JSON スキーマで省略可のフィールドが出てこない:required と nullable で直す
JSON スキーマで省略可フィールドを required にする理由と影響
JSON スキーマ制約付き生成において、`required` でないフィールドが出力から丸ごと消える現象が発生している。このため、捏造検出や数値抽出など、安全性や正確性が重要な項目が「空」または「null」として検知されず、システムが正常に動作しているかのように見えてしまうリスクがある。
本稿では、省略可フィールドを `required` かつ `nullable` に設定することで、モデルが意図的に値を生成しない場合と、読み取れなかった場合を区別できる実証例を示す。これにより、安全チェック項目の検知漏れを防ぎ、システムの状態を正しく把握することが可能になる。
起きたこと
Ollama 0.33.3 環境下で、qwen3.5:9b、qwen3.5:35b-a3b、gemma3:12b の各モデルに対し、pydantic 2.12 の `model_json_schema()` で生成されたスキーマを用いた生成テストを実施した。
初期設定では、審査モデルの出力スキーマにおいて `fixes`、`cliche_spans`、`fabrication_spans` の 3 つのフィールドを省略可としていた。その結果、`fabrication_spans` フィールドが常に空となり、捏造検出率が 0% のまま放置されていたことが確認された。これは、モデルが「捏造がない」と判断したのではなく、スキーマ上の制約により該項目を出力しなかった可能性が高い。
その後、これら 3 項目を `required` に変更したところ、審査モデルは指摘を返すようになった。この変更により、省略可フィールドを残す正当な理由は存在しないことが示された。
同様の現象は数値抽出処理でも観測された。読み取れない場合に明示的に `null` を出力させる必要があるが、デフォルト値を設定すると、「読み取れなかった」のか「モデルが考えなかった」のかの区別がつかなくなる。そのため、全項目を `required` かつ `nullable` に設定することで、欠落と非存在を明確に区別できる状態になった。
なぜそうなるか
JSON スキーマ制約付き生成では、モデルはスキーマ定義に従って出力を生成するよう指示される。しかし、`required` でないフィールドについては、モデルがその項目を出力する必要がないと判断した場合、あるいは内部ロジックで値の生成を省略した場合、そのフィールド自体が JSON 構造から完全に削除されることがある。
これは、スキーマ上で「省略可」と定義されている場合、モデル側で「値が存在しない」ことを表現する手段としてフィールドの欠落を選ぶ傾向があるためと考えられる。特に `default` 値を設定している場合、モデルはデフォルト値を埋めるか、あるいは何も出力しないかのどちらかを選択することになるが、後者の場合、システム側では「値がない(null)」のか「項目がない(キーが存在しない)」のかの区別がつかなくなる。
安全性に関わる項目や、数値抽出の結果など、欠落と非存在を厳密に区別する必要があるケースでは、この挙動が重大な盲点となる。`required` にすることで、モデルに対して「必ずこのキーを出力せよ」という強い制約を与えることができる。同時に `nullable` を設定することで、値が存在しない場合でも `null` として明示的に出力させることが可能になる。
確認手順 / チェックリスト
1. **スキーマ定義の確認** 使用する JSON スキーマにおいて、安全性や数値抽出に関わるフィールドが `required` に含まれているか確認する。特に `fixes`、`cliche_spans`、`fabrication_spans` などの項目が省略可になっていないか確認する。
2. **出力結果の検証** 生成された JSON 出力において、該当フィールドが存在するか、あるいは `null` として出力されているかを確認する。`required` に設定していない場合、キー自体が存在しないケースがないかチェックする。
3. **デフォルト値の有無確認** スキーマ定義に `default` 値が設定されていないか確認する。`default` 値がある場合、「読み取れなかった」のか「考えなかった」のかの区別がつかない可能性があるため、明示的な `null` 出力が必要であれば `default` を外し、`required` かつ `nullable` に設定する。
4. **モデルごとの挙動確認** Ollama 0.33.3 環境下で、qwen3.5:9b、qwen3.5:35b-a3b、gemma3:12b の各モデルに対して、変更後のスキーマで生成テストを行い、すべてのケースで該当フィールドが出力されるか確認する。
適用範囲の限界
本現象および対応策は、JSON スキーマ制約付き生成を行う環境に限定される。特に pydantic 2.12 の `model_json_schema()` で生成されたスキーマと、Ollama 0.33.3 を使用した qwen3.5:9b、qwen3.5:35b-a3b、gemma3:12b の組み合わせで実証されている。他の LLM ランタイムやバージョン、あるいは異なるモデルアーキテクチャでは挙動が異なる可能性がある。
また、本対応は「省略可フィールドが丸ごと消える」現象に起因する問題に対して有効である。スキーマ定義自体の欠陥や、モデルの能力不足による出力エラーなど、他の要因で発生する問題には適用できない。さらに、`required` かつ `nullable` に設定することで、モデルが意図的に値を生成しない場合でも `null` を返すようになるが、これが常に望ましい挙動とは限らない。ビジネスロジックによっては、特定の条件下でフィールドを省略することが意図されている場合があるため、各プロジェクトの要件に合わせて判断が必要である。