博客 • AI / JSON Schema
iPhone 18 AI 功能背後的數據結構:Apple Intelligence、App Actions 與 JSON Schema 如何連接?
iPhone 18 上的 AI 動作能接到 App,靠的不是一段產品介紹,而是一份和 Intent 參數對齊的 JSON Schema。系統模型給出候選字段,@Parameter 聲明 App 能接受什麼。Schema 在兩者中間:對不上的對象進不了動作。
產品敘事見 iPhone 18 爲什麼不只是硬件。一條指令怎麼從短語走到 API,見 App Actions 的數據路徑。本篇只寫字段:類型怎麼映射、哪些值必須拒絕。
- Intent 參數是 App 側的類型合同
- JSON Schema 是你用來卡住模型輸出的同一份字段表
- AppEnum 對 enum,AppEntity 只收 id,不收展示名
- additionalProperties 爲 false,多出來的鍵直接失敗
先記住這一點:Schema 不是把語音再描述一遍。它只回答這個對象能不能交給這個動作。下面按「誰聲明字段 → 類型對照 → 一份 Schema → 四種拒絕」拆開。
三邊怎麼接上
App 能接受的值寫在 Intent 參數上。說明見 爲 App Intent 添加參數。模型可以提議一個 JSON 對象,但不能改這張字段表。
- 1系統側給出候選
設備上的模型或快捷指令填出一個對象:動作名、數量、履約方式、商品 id。這只是候選,不是已經執行的調用。
- 2App 側聲明類型
每個參數是字符串、整數、固定枚舉,還是必須解析的實體。可選參數不放進 required。
- 3Schema 決定放不放行
候選對象先過你的 Schema。通過才寫入 Intent。失敗就停在校驗,不調用動作,也不打 API。
類型怎麼對上
| App Intent | JSON Schema | 寫進去的是什麼 |
|---|---|---|
| 字符串、整數 | string / integer | 數量和備註按原類型,不要一律寫成字符串 |
AppEnum | enum | 只允許編譯期那些值,例如 pickup 和 delivery。展示文案不是枚舉值。 |
AppEntity | string + minLength | 只收非空 id。名稱留給界面,不進校驗主鍵。 |
| 可選參數 | 不放進 required | 。缺了仍合法。必填缺了就失敗。 |
字段表以外的鍵用 additionalProperties: false 拒絕。模型多寫一個 note 或 user,也不能混進動作。
一份能貼進校驗器的 Schema
下面這份對齊一個下單動作:意圖名固定,參數裏有商品 id、數量和履約方式。它是你的契約,不是 Apple 的線上格式。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"additionalProperties": false,
"required": ["intent", "parameters"],
"properties": {
"intent": { "const": "StartOrder" },
"parameters": {
"type": "object",
"additionalProperties": false,
"required": ["item_id", "quantity", "fulfillment"],
"properties": {
"item_id": { "type": "string", "minLength": 1 },
"quantity": { "type": "integer", "minimum": 1 },
"fulfillment": { "enum": ["pickup", "delivery"] }
}
}
}
}
{
"intent": "StartOrder",
"parameters": {
"item_id": "sku_42",
"quantity": 1,
"fulfillment": "pickup"
}
}
把履約方式寫成自然語言,或把 item_id 留空,這條就不能過。通過之後才交給上一篇說的執行路徑。
四種應該拒絕的形狀
| 候選裏多出來的東西 | 爲什麼失敗 |
|---|---|
| 多了 note 或 raw_text | 被 additionalProperties |
| fulfillment 寫成說明文字 | 不在 enum |
| item_id 是空字符串 | 過不了 minLength |
| quantity 是 0 或小數 | 低於 minimum |
爲什麼模型輸出先要 Schema,見 AI 爲什麼需要 JSON Schema。本篇把那張表接到 App 動作的參數上。
和另外兩篇怎麼分工
| iPhone 18 產品敘事 | 一條指令的路徑 | 本篇 | |
|---|---|---|---|
| 回答 | 功能爲什麼不只是硬件 | 短語怎麼走到 API | 哪些字段能進這個動作 |
| 不要在這裏找 | 又一篇發佈稿 | 再走一遍語音到服務器的五步 | 用展示名代替實體 id |
在 JSONNote 裏對上這張表
- 1貼上 Schema
把上面的 Schema 貼進 JSON Schema。確認 intent 是 const,fulfillment 是 enum。
- 2用一條候選去撞
用 JSON 校驗 貼一條候選。空 id、額外字段、錯誤枚舉都應該失敗。
- 3改字段後再比
用 JSON Diff 看
required裏有沒有少掉 item_id。少一個必填,比改一句文案更危險。
常見問題
JSON Schema 是 Apple 的請求格式嗎?
不是。Apple 用 App Intent 的參數類型描述動作。Schema 是你放在模型輸出和 perform() 之間的校驗。對不上就不要調用。
爲什麼實體字段不能是商品名?
名稱會變、會重複。AppEntity 的主鍵是穩定 id。Schema 用非空字符串卡住 id,名稱只給人看。
可選參數要不要寫進 Schema?
要寫進 properties,但不要放進 required。這樣缺了仍合法,出現了則必須符合類型。
校驗通過就可以執行動作嗎?
還不行。Schema 只證明形狀。實體 id 仍要查詢解析成功。形狀對、對象不存在,一樣不能下單。
和「AI 爲什麼需要 JSON Schema」是同一篇嗎?
不是。那篇講模型輸出爲什麼要有形狀。本篇講這個形狀怎樣對齊 App 動作的參數,多一個鍵或錯一個枚舉就要拒絕。
總結
Apple Intelligence 和 App 動作之間,靠的是同一組字段:動作名、類型、枚舉和實體 id。JSON Schema 把這組字段寫成可以失敗的檢查。
直接結論:參數類型先對齊 Schema;多出來的鍵拒絕;實體只收 id;校驗失敗就不進入動作。
下一步:先把動作參數的 Schema 跑通,再接到 Intent。