開発実践ガイド

ローカルLLMの構造化出力を安全に検証する方法

ローカルLLMの構造化出力を安全に検証する方法
目次

公式サイトで次に進む

この記事で明示的に扱うソフトだけを表示します。配布・手順は各公式ページで確認してください。

local-gen.jpがファイルを配布するものではなく、互換性を保証するものでもありません。

構造化出力は、LLMの返答をJSON Schemaへ合わせたいときに便利だ。ただし、JSONとして正しいことと、値の内容が正しいことは別に確認する必要がある。

LM StudioとOllamaのように複数のローカルAPIを使う場合も、提供元ごとの仕様だけに頼らず、アプリ側で共通の検証手順を持つと扱いやすい。

1. 利用するAPIが構造化出力へ対応しているか確認する

LM StudioはOpenAI互換のChat CompletionsでJSON Schemaを指定する構造化出力を公式に案内している。Ollamaにも構造化出力の公式機能がある。

ただし「OpenAI互換だから全部同じ」とは考えない。エンドポイント、送信項目、対応するスキーマ、失敗時の動作は、利用するソフトとバージョンごとに確認する。

最初に次を残しておく。

提供元 / バージョン:
モデル / リビジョン:
エンドポイント:
JSON Schema:
最大トークン数:
生の応答:

2. スキーマは小さく始める

最初から深く入れ子になったオブジェクトや多数の任意項目を入れない。まず2〜3項目の小さなスキーマで成功と失敗を確認する。

たとえば必要なのがタイトルと優先度だけなら、その2項目から始める。

{
  "type": "object",
  "properties": {
    "title": {"type": "string"},
    "priority": {"type": "integer"}
  },
  "required": ["title", "priority"]
}

3. 形式の検証と内容の検証を分ける

返答がスキーマへ一致していても、priority: 999のようにアプリ上は無効な値かもしれない。

最低でも次の2段階に分ける。

JSON Schemaで形式を検証

アプリ固有の条件で内容を検証

スキーマでは型、必須項目、列挙値などを確認する。その後に、値の範囲、IDが存在するか、権限、許可された状態遷移などを確認する。

4. 失敗例も保存する

構造化出力は途中で打ち切られたり、必須項目が欠けたりすることがある。成功例だけを残すと、モデルやAPIを変更したときの違いを追いにくい。

少なくとも次を失敗例として試せる。

  • トークン上限で途中終了
  • 必須項目の欠落
  • 許可していない列挙値
  • 数値が許容範囲外
  • 空文字
  • モデルやAPIの変更

再試行するなら、なぜやり直したのかと回数上限を記録する。無限に再試行しない。

5. ツール実行の前には別の検証が必要

構造化された出力をツールの引数へ使う場合、スキーマへ一致しただけでシェル、ファイル操作、HTTP APIへ渡さない。

たとえばパスが文字列として正しくても、その場所へアクセスする権限があるとは限らない。ツール側で許可範囲と操作内容を別に確認する。

Ollama単独でJSON Schemaを使う場合はOllamaの構造化出力を確認できる。ツール実行まで進む場合はローカルLLMのツール呼び出しに実行前検証を入れる方法へ進むと、「JSONを出せた」と「安全に実行できる」を分けて確認できる。

まとめ

  • 構造化出力へ対応していても、各フィールドの内容が正しいとは限らない
  • JSON Schemaへの一致と、アプリ固有の値の妥当性を別々に検証する
  • 途中終了や必須項目の欠落など、失敗例も保存して再試行条件を決める
  • 利用するAPIを替えても、最後はアプリ側の検証を通してから使う
同じテーマから

この記事で扱ったデータ

モデル・GPU・実行ソフトの確認済みデータを、記事とは別に確かめられます。

サイト内検索