Microsoft developer platformのJSON Schema対応とは?PR #566の変更点と移行確認ポイント

Microsoft developer platformでスキーマ登録まわりを使っている場合、今回まず確認すべき結論は 「従来のPython .py スキーマではなく、JSON Schema .json を前提に運用する必要がある」 という点です。特にSchema Vault、スキーマ登録API、デプロイスクリプト、既存スキーマ資産を管理しているチームは、アップロード形式・Content-Type・既存レコードの移行確認を早めに行うべきです。PR #566はGitHub上で2026年5月6日にdevブランチへマージされ、JSON Schema対応とPythonスキーマ廃止を含む変更として整理されています。(GitHub)

目次

Microsoft developer platformで何が変わったのか

今回の「Microsoft developer platform documentation update: feat: Support JSON Schema uploads and update related deployment scripts」は、Microsoftのcontent-processing-solution-acceleratorにおけるスキーマ管理方式の変更です。

これまでの流れでは、スキーマをPythonのPydanticクラスとして.pyファイルで扱う経路がありました。今回の更新では、スキーマを実行可能なコードではなく、宣言的なJSON Schemaドキュメントとして登録・管理する方向に切り替わっています。PRの説明では、Pythonコードをアップロード・実行する必要をなくし、スキーマ作成と登録を簡素化しつつ、リモートコード実行リスクを下げる目的が示されています。(GitHub)

実務上の見方としては、「ドキュメント更新」だけではなく、API、ワーカー、サンプル、テスト、デプロイスクリプトまで影響する変更です。単に拡張子を.pyから.jsonに変えるだけでは不十分で、登録手順や既存SchemaSetとの紐付けまで確認する必要があります。

変更点の要点

確認項目変更前の考え方変更後の考え方実務で見るべきポイント
スキーマ形式Python .pyのPydanticクラスを使う経路があったJSON Schema .jsonが前提既存の.pyファイルを棚卸しする
アップロードPythonスキーマを登録できる場合があった.jsonのみ受け付けるAPI・スクリプト・CIの送信ファイルを確認
Content-Type形式ごとに分岐していたJSON Schemaはapplication/jsonmultipart送信時のMIMEタイプを確認
実行時処理アップロードされたPythonコードを扱う経路があったJSONを読み取り、メモリ上でPydanticモデル化コード実行前提のカスタム処理は見直し
既存レコードPython形式のSchemaが残っている可能性JSONとして再登録が必要になる可能性Cosmos DBのSchemaメタデータを確認

PR内では、APIが.pyアップロードをHTTP 415で拒否し、ワーカー側もPython形式のスキーマ処理を拒否するため、既存のCosmos DBレコードはJSON Schemaとして再登録する必要がある旨が示されています。(GitHub)

影響を受ける人

既存のPythonスキーマを使っている開発者

最も影響が大きいのは、過去に.py形式でPydanticスキーマを作成し、Schema Vaultへ登録していたチームです。

たとえば、請求書、保険請求、修理見積、本人確認書類などの文書タイプごとにPythonクラスを作り、フィールド定義や説明文を管理していた場合、そのままでは新しいJSON Schema前提の運用に合わない可能性があります。

確認すべきことは次の3つです。

確認対象見るべき内容対応の目安
スキーマファイル.pyが残っていないか.jsonへ置き換える
登録済みSchemaFileNameやFormatが旧形式でないかJSON Schemaとして再登録する
SchemaSet古いSchema IDを参照していないか新しいSchema IDをSchemaSetへ追加する

特に注意したいのは、ファイルだけをJSON化しても、既存のSchemaSetが古いSchema IDを参照したままだと処理時に期待どおり動かない点です。移行作業では「スキーマ変換」「再登録」「SchemaSetへの追加」「実処理テスト」までを1セットで確認してください。

デプロイ自動化を管理している担当者

今回の更新では、BashとPowerShellのデプロイスクリプトもJSON Schema前提に更新されています。post_deployment.shでは.json以外の拡張子をスキップし、アップロード時のContent-Typeをapplication/jsonにしています。(GitHub)

PowerShell版のpost_deployment.ps1でも同様に、.jsonのみを受け付け、レガシーな.py形式はRCE対策の一環として除外されています。(GitHub)

そのため、azd up後の自動登録、CI/CD内の後処理、独自の初期化スクリプトを組んでいる場合は、次の観点で見直してください。

チェック項目失敗しやすい例修正方針
manifestのファイル名invoice_schema.pyを参照しているinvoice_schema.jsonに変更
multipartのContent-Typetext/x-pythonのまま送っているapplication/jsonに変更
スクリプトの拡張子判定.pyも許可している.jsonのみ許可
デプロイ後登録API起動前に登録処理が走るAPI readinessチェック後に実行
重複登録毎回同じSchemaを新規登録する既存ClassName確認を入れる

JSON Schema登録で守るべき主なルール

更新後のドキュメントでは、Schema Vaultが受け付けるのはJSON Schemaドキュメントであり、Draft 2020-12、ルートの"type": "object"、"properties"ブロックが必要とされています。アップロードできるサイズは最大1MBです。(GitHub)

最低限、次のような構造にしておくと移行時の確認がしやすくなります。

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "InvoiceSchema",
  "description": "請求書から請求番号、請求日、支払期日、金額、取引先情報を抽出するためのスキーマ",
  "type": "object",
  "properties": {
    "invoice_number": {
      "type": ["string", "null"],
      "description": "請求書番号。例: INV-2026-001"
    },
    "invoice_date": {
      "type": ["string", "null"],
      "description": "請求日。YYYY-MM-DD形式で返す"
    },
    "total_amount": {
      "type": ["number", "null"],
      "description": "税込または合計として記載された請求金額"
    }
  }
}

ここで重要なのは、descriptionを単なる説明ではなく、AI抽出の指示として書くことです。公式ドキュメントでも、フィールド説明がLLMの抽出品質に直接影響するため、明確で具体的な説明と例を含めることが推奨されています。(GitHub)

ClassNameの扱いに注意する

JSON Schema移行で見落としやすいのがClassNameです。

新しい登録処理では、JSON Schema内にtitleがある場合、そのtitleがSchema Vault上のClassNameとして使われます。titleがない場合は、リクエスト本文のClassNameまたはファイル名がフォールバックとして使われます。(GitHub)

つまり、次のようなズレが起きる可能性があります。

{
  "title": "InvoiceSchemaV2",
  "type": "object",
  "properties": {}
}

一方で登録リクエスト側が次のようになっている場合です。

{
  "ClassName": "InvoiceSchema",
  "Description": "Invoice extraction schema"
}

この場合、titleが優先されるため、登録後のClassNameはInvoiceSchemaV2になる可能性があります。移行後に既存の自動処理がClassNameで検索・照合している場合は、意図しない重複登録やSchemaSetへの追加漏れにつながります。

ClassNameを安定させる判断基準

状況推奨対応
既存処理がClassNameを参照しているJSON Schemaのtitleを既存ClassNameに合わせる
新バージョンとして分けたいInvoiceSchemaV2のように明示的に変える
ファイル名ベースで管理したいtitleを省略するのではなく、運用ルールを決めておく
複数チームで編集するmanifest、JSON Schema、登録結果のClassNameをレビュー対象にする

.pyから.jsonへ移行する手順

移行作業は、次の順番で進めると手戻りを減らせます。

手順作業確認ポイント
1既存スキーマを棚卸しする.pyファイル、Blob Storage、Cosmos DBのSchema情報を確認
2JSON Schemaを作成するtype: object、properties、descriptionを入れる
3manifestを更新するschema_info.jsonのFileを.jsonにする
4Schema Vaultへ登録するPOST /schemavault/でapplication/jsonとして送る
5SchemaSetへ追加する新しいSchema IDを既存または新規SchemaSetに紐付ける
6実データで処理するMapステップ、抽出結果、バリデーション結果を確認
7旧Schema参照を外す古い.py参照や不要なSchema IDを整理する

公式ドキュメントでは、スキーマ登録後にSchemaSetを作成し、登録済みSchemaをSchemaSetへ追加する流れが示されています。Claim作成時にはSchemaSetが割り当てられ、実行時にはSchemaメタデータをCosmos DBから参照し、JSON SchemaをBlob Storageから読み込む構成です。(GitHub)

API登録時の確認ポイント

Schema Vault APIはPOST /schemavault/で新規登録、PUT /schemavault/で更新を行います。どちらもmultipart/form-dataで、JSONパートとファイルパートを送る形です。新しいルールでは、.jsonのみ受け付け、ファイルサイズは最大1MB、JSON Schemaとして不正な場合はエラーになります。(GitHub)

登録時の考え方は次のとおりです。

POST /schemavault/
Content-Type: multipart/form-data

data: { "ClassName": "InvoiceSchema", "Description": "Invoice extraction" }
file: invoice.json (application/json)

API側では、アップロードファイルの拡張子が.jsonでない場合はHTTP 415、サイズ超過時はHTTP 413、JSON Schemaとして不正な場合はHTTP 400が返る設計になっています。(GitHub)

エラーが出たときの切り分け

エラーの傾向あり得る原因確認する場所
HTTP 415.pyや別拡張子を送っているファイル名、スクリプトの拡張子判定
HTTP 413スキーマが1MBを超えている$defsの肥大化、不要な説明文
HTTP 400JSON Schemaとして不正type、properties、JSON構文
登録後にClassNameが違うtitleが優先されているJSON Schemaのtitle
実行時に旧スキーマエラーSchemaSetが古いSchema IDを参照SchemaSet内のSchema一覧

実行時の処理はどう変わるか

ワーカー側では、Blob StorageからJSON Schemaをダウンロードし、json.loadsで読み取り、Pydanticのcreate_modelを使ってメモリ上にモデルを作る処理が追加されています。アップロードされたコードをexec、compile、importlibなどで実行しないことが明記されています。(GitHub)

これはセキュリティ上の大きな意味があります。従来のように「スキーマ定義のために実行可能コードを受け入れる」設計では、登録権限を持つユーザーや侵害された経路から危険なコードが混入するリスクがあります。JSON Schema化により、スキーマは「実行するもの」ではなく「解釈するデータ」になります。

一方で、Python側のカスタムバリデーションに頼っていた場合は注意が必要です。ドキュメントでは、JSON Schemaは純粋なデータであり、Pydanticのfield_validatorのような命令的なカスタム検証は持てないため、必要な場合は抽出後の下流処理で実装する考え方が示されています。(GitHub)

移行時に失敗しやすいポイント

フィールド説明が抽象的すぎる

JSON Schemaのdescriptionは、単なる補足説明ではなく抽出品質に関わる重要な情報です。

悪い例:

"date": {
  "type": ["string", "null"],
  "description": "日付"
}

改善例:

"date_of_loss": {
  "type": ["string", "null"],
  "description": "事故発生日。書類上のDate of Loss、Loss Date、事故日などに該当する日付。YYYY-MM-DD形式で返す"
}

AIに抽出してほしい項目は、同義語、表記ゆれ、返却形式、見つからない場合の扱いまで書くと安定しやすくなります。

必須項目を増やしすぎる

JSON Schemaではrequiredを指定できますが、文書処理ではすべての書類に同じ項目が存在するとは限りません。現場では、必須扱いを強くしすぎると、抽出後の検証で失敗しやすくなります。

入力文書に存在しない可能性がある項目は、次のようにnullを許容する設計が現実的です。

"purchase_order_number": {
  "type": ["string", "null"],
  "description": "発注書番号。記載がない場合はnull"
}

$refの使い方が広すぎる

バリデーション側では、サポートされる$refがローカル参照の#/$defs/...または#/definitions/...に限定されています。外部URLや別ファイルへの参照を前提にしたJSON Schemaは、そのままでは使えない可能性があります。(GitHub)

複雑なスキーマを作る場合も、まずは同一ファイル内の$defsでまとめるのが安全です。

{
  "$defs": {
    "Address": {
      "type": "object",
      "properties": {
        "postal_code": {
          "type": ["string", "null"],
          "description": "郵便番号"
        }
      }
    }
  }
}

既存環境で今日確認すべきチェックリスト

今回のMicrosoft developer platformのJSON Schema対応は、開発者だけでなく、運用・デプロイ担当にも影響します。以下を順番に確認してください。

優先度チェック内容完了条件
高.pyスキーマが残っていないかリポジトリ、Blob Storage、manifestから.py参照を排除
高schema_info.jsonが.jsonを参照しているか登録対象ファイルがすべてJSON Schema
高登録APIがapplication/jsonで送信しているかmultipartのfileパートが正しいContent-Type
高SchemaSetが新しいSchema IDを参照しているかClaim作成後に対象文書タイプを選べる
中JSON SchemaのtitleとClassNameが一致しているか登録後のClassNameが想定どおり
中descriptionが抽出指示として十分か例、形式、null条件が書かれている
中$refがローカル参照のみか#/$defs/...または#/definitions/...を使用
低旧スクリプトやREADMEが残っていないかチーム内ドキュメントもJSON Schema前提に更新

どう対応すべきか

今回の変更は、JSON Schemaを新たに「サポートした」だけではなく、最終的にはPython .pyスキーマを使う旧経路を外す方向の変更として見るべきです。特にSchema Vaultへスキーマを登録している環境では、既存スキーマの形式、SchemaSetの参照、デプロイ後の自動登録処理を確認しないと、移行後に文書処理のMapステップで失敗する可能性があります。

まずはリポジトリ内のschema_info.jsonとスキーマファイルを確認し、.py参照が残っていればJSON Schemaへ置き換えてください。次に、POST /schemavault/で登録し直し、新しいSchema IDをSchemaSetに追加します。最後に、実際のPDFや画像を使って抽出結果を確認し、descriptionの不足やClassNameのズレを調整するのが安全です。

この更新を単なる形式変更として扱うと、移行漏れが起きやすくなります。実務では「セキュリティ改善」「スキーマ作成の標準化」「デプロイ自動化の修正」を同時に進める変更として捉えると、影響範囲を見誤りにくくなります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次