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