プレリリース版です。正式公開までは、公開済みのファイルも含めて内容が変わることがあります。
Skip to content

出典: https://datamodels.jp/guide/ai-extraction · 文章は CC BY 4.0

AI でデータを取り出す ​

エンティティのモデルの多くは、ページのダウンロードの行に AI 用の構造化出力があります。AI モデルの構造化出力が受け付ける JSON Schema で、説明は英語です。メールや PDF などの文書と合わせて AI モデルへ送ると、モデルの属性の形で答えが返ります。このページでは、短いお知らせの文から指定緊急避難場所(EvacuationSite)を取り出します。OpenAI の API と Claude の API の両方の例を示します。

文書と AI 用のスキーマメールや PDF と EvacuationSite.ai.json① API に送るAI モデルスキーマの形で答える② 答えの JSONsite.json属性だけ。id と type は無い③ id と type を足して検査NGSI-LD のエンティティkey-values の形

1. スキーマと文書 ​

bash
curl -sSfO https://datamodels.jp/adapters/ai/disaster/EvacuationSite.ai.json

ファイルの中身は { name, description, strict, schema } です。id と type は入っていません。この 2 つはアプリケーションで決めます。文書は notice.txt に入れておきます。たとえば次の文です。

text
都立一橋高校(東京都千代田区東神田1-12-13)を、地震、高潮、内水氾濫の指定緊急避難場所に指定しました。区の番号は 13101-0012 です。指定避難所も兼ねます。

どちらの API も、PDF のファイルをそのまま受け取れます。方法はそれぞれのドキュメントにあります。

2. モデルに尋ねる ​

リクエストは jq で組み立て、スキーマと文書を本文に入れます。モデル名は一例です。構造化出力やツールに対応したモデルなら、どれでも使えます。

bash
jq -n --slurpfile s EvacuationSite.ai.json --rawfile text notice.txt '{
  model: "gpt-6-astra",
  messages: [
    {role: "system", content: "Extract the evacuation site from the text."},
    {role: "user", content: $text}
  ],
  response_format: {type: "json_schema", json_schema: $s[0]}
}' > request.json
curl -sS https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" --data @request.json \
  | jq '.choices[0].message.content | fromjson' > site.json
bash
jq -n --slurpfile s EvacuationSite.ai.json --rawfile text notice.txt '{
  model: "claude-opus-5-5",
  max_tokens: 16000,
  system: "Extract the evacuation site from the text with the tool.",
  tools: [{name: $s[0].name, description: $s[0].description,
    input_schema: $s[0].schema}],
  messages: [{role: "user", content: $text}]
}' > request.json
curl -sS https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" --data @request.json \
  | jq -e 'first(.content[] | select(.type == "tool_use") | .input)' > site.json
  • OpenAI API:ファイルをそのまま response_format の json_schema にします。strict: true です。答えにはすべての属性が入り、文書に書いていない属性は null になります。
  • Claude API:schema をツールの input_schema にします。答えはツールへの入力として返ります。例のモデルは tool_choice でツールの使用を強制できないので、system でツールを使うよう指示しています。答えにツールの呼び出しが無いときは jq -e がエラーで止まるので、リクエストを送り直してください。Claude の strict モード(ツールの "strict": true)は、null になりうるプロパティを 1 回のリクエストで 16 個までしか受け付けません。EvacuationSite はそれより多いので、この例では strict を外しています。この場合、答えはたいていスキーマに従いますが、手順 3 で確かめてください。小さなモデルや、要らない属性を外したスキーマなら、"strict": true を付けられます。
  • 1 つの文書から複数の避難場所を取り出すときは、スキーマを配列に入れます。形は {"type": "object", "properties": {"sites": {"type": "array", "items": …}}} です。ファイルと同じく、required と additionalProperties: false も付けます。

構造化出力を使う前に、各社の説明を読んでください(OpenAI、Claude)。

3. 答えを検査してエンティティにする ​

答えには属性だけが入っています。空の属性を除き、AI が id や type を入れていたら消して、自分の id と type を足します。

bash
jq 'walk(if type == "object" then with_entries(select(.value != null)) else . end)
  | del(.id, .type)
  | {id: "urn:ngsi-ld:EvacuationSite:0012", type: "EvacuationSite"} + .' \
  site.json > entity.json

次に、JSON を検証すると同じ方法で、entity.json をモデルの JSON Schema で検査します。strict モードでも、答えの形が保証されるだけです。AI 用のスキーマは、一部の決まり(最小値や、複数の属性にまたがる決まり)を説明に書くだけにしています。strict を外したときは、形も保証されません。JSON Schema はこれらをすべて確かめます。ただし、内容が正しいかまでは確かめられません。AI モデルがコードや数を読み違えることもあるので、保存する前に文書と見比べてください。

これで entity.json は key-values の形のエンティティです。NGSI-LD ブローカーに送るには、@context 付きの normalized の形にします(NGSI-LD ブローカーに送る)。

自分のモデル ​

自分のサイトのモデルでも、datamodels export --to ai で同じファイルを作れます。決まった形を持たない属性があるモデルには、AI 用のファイルはありません(他のツールに書き出す)。