WWDC26:Explore advanced App Intents features for Siri and Apple Intelligence

Siri のレスポンスを App Intents によってカスタマイズする方法。Spotlight のセマンティックインデックスによって、ざっくりした指示でもアプリコンテンツに対してインタラクションできるのは良さそう。

Explore advanced App Intents features for Siri and Apple Intelligence


0:00 – Introduction

  • Siri および Apple Intelligence との連携を洗練させるための高度なテクニックを解説
  • 扱うテーマ:Siri 会話のカスタマイズ、コンテンツ検出の改善、システム連携の活用

1:59 – Customize how Siri responds

  • Siri が返すレスポンスを、App Intents によって制御、カスタマイズし洗練させる
  • 空の結果を返すことで Siri に「見つからなかった」と応答させられる
  • ProvidesDialog プロトコルで応答文をカスタマイズ
    • IntentDialog(full:supporting:) で詳細な応答文(フル文字列)と短い応答文(サポート文字列)を使い分け
    • AirPods など音声読み上げではこのフル文字列が読み上げられる
  • $label.requestValue(...) でインテント実行途中に追加情報をユーザーに要求可能(e.g. 既に実行中のアラームラベルが存在していた場合、別の命名をするか尋ねる)

4:20 – Visual responses

  • DisplayRepresentationtitlesubtitleimage を設定すると応答画面や Spotlight に反映される
  • ShowsSnippetView プロトコルで SwiftUI 製のカスタムスニペットビューを返すことが可能
    • アプリ独自のデザインで Siri の結果カードを表現できる

6:22 – Interaction donations

  • Siri がインテントを呼び出す前に追加の質問を挟むことが可能(e.g. メッセージ送信先を指定した時、コンタクトの類似した名前のうち誰が対象かを尋ねる)
  • IntentDonationManager.shared.donate(intent:result:) でユーザーの UI 操作をシステムにドネート
    • Apple Intelligence がユーザーの好みを学習し、継続中のアクティビティを追跡できるようになる
    • 過剰にドネートされるとシステムはそれらを無視することがある
  • システムインタラクション(Shortcuts 経由など)は自動的にドネートされる

9:46 – Confirmations and entity ownership

  • 副作用を持つインテントは Siri が自動的に確認を求める(e.g. 共用イベントの削除行為など)
  • OwnershipProvidingEntity プロトコルで所有権の状態を Siri に伝える
    • ownership プロパティで .unknown(自分のみ)や .shared(他のユーザーも関係)を返す、これに従って Siri がユーザーに確認を促すか判断する
    • 所有権情報を最新に保つことで Siri の確認フローが適切に動作する

11:59 – Semantic index with IndexedEntity

  • IndexedEntity に準拠し indexAppEntities で Spotlight へのインデックスを実装
    • CSSearcableIndex.indexAppEntities(_:) でセマンティックインデックスが入力
    • 意味ベースの検索でコンテンツが見つかるようになる
  • インデックスを最新に保つ仕組みと再インデックスのサポートが重要
    • ユーザーがコンテンツを追加したらインデックスを作成
    • 主要なプロパティが更新されたら再インデックス
    • コンテンツを削除したら、インデックスからもエントリを削除
  • IndexedEntityQuery を採用することで、再インデックスをサポートできる
    • ただし Core Spotlight レベルの API で再インデックスに対応していれば不要

13:32 – Structured search with IntentValueQuery

  • 大規模・サーバーサイド・頻繁に変化するコンテンツには IntentValueQuery を使用
    • e.g. アルバムはインデックスするが、含まれる曲はインデックスしない
    • values(for:) で構造化された検索入力を複数のエンティティ型にマッピング
  • AudioSearch のような入力型で検索クライテリアを受け取り、結果を返す

15:27 – In-app search

  • system.searchInApp スキーマを採用した AppIntent を実装すると、Siri 検索をアプリ UI で再実行可能
    • ドメイン採用やインデックス化の有無に関わらず利用できる汎用的なアプローチ
    • perform() 内でナビゲーション状態を書き換えてアプリの検索画面を開く

16:22 – Onscreen awareness

  • 表示中のコンテンツをエンティティに接続する 4 つのアプローチ
    • NSUserActivity :ビュー全体に単一のプライマリエンティティを関連付け
      • View Annotation API .appEntityIdentifier モディファイア:複数エンティティが存在するビュー内の特定要素に付与
    • コレクションアノテーション:リストの選択状態をエンティティ ID にマッピング
      • .appEntityIndentifier(forSelectionType:) で選択IDを返し、画面外の選択肢に対してもアノテーションすることが可能
    • カスタムキャンバスアノテーション:独自描画領域内のエンティティを登録
  • これにより Siri が「このイベント」「あの曲」などの参照を解決できる

20:51 – Leverage existing integrations

  • ユーザー通知 UNMutableNotificationContent、Now Playing、Alarm Kit の設定にエンティティを添付可能
    • content.appEntityIdentifiersEntityIdentifier の配列を設定
    • Now Playing では最も具体的なものから順に複数の EntityIdentifier を指定
    • Alarm Kit の AlarmConfigurationappEntityIdentifier パラメータとして渡す

WWDC26:Discover new capabilities in the App Intents framework

App Intents に関する2026年のアップデートについて。実装未経験で未知の領域なのだが、アプリコンテンツをシステムが既知のデータ型として与えることが可能になったことでアプリ内の連携がより密になったり、システムによるアプリコンテンツの提案をよりユーザーのコンテクストベースで行えるようになったり、さらに Siri がデバイスまたいで会話継続できるようになったりで、よりアプリのコンテンツがアプリの箱から飛び出して生活に偏在できるようになった感がある。

Discover new capabilities in the App Intents framework


0:00 – Introduction

  • App Intents フレームワークの 2026 年アップデート概要
  • Siri、Shortcuts、Spotlight、Widgets、Apple Intelligence にわたる制御・柔軟性・開発体験の向上

2:40 – Share entities across apps with ValueRepresentation

  • ValueRepresentation でアプリのエンティティをシステムが理解できる構造化型に変換して共有
    • エンティティ自体が Transferable に準拠していれば、エンティティの情報を ValueRepresentation でシステムの理解する構造体に変換して transferRepresentation として返すだけ
    • 例:ランドマークを GeoToolbox.PlaceDescriptor として書き出し、Maps でナビゲーション可能にする
  • エンティティにすでに対応プロパティがある場合はキーパスで簡潔に記述可能
    • ValueRepresentation(exporting: \.placeDescriptor)

3:45 – Register relevant entities with RelevantEntities

  • システムに自アプリのコンテンツを登録する方法
    • 1. Spotlight にインデックスする:Siriで検索取得させたい場合
    • 2. インタラクションドネーション(IntentDonationManager API):Siriとシステムにユーザーの使い方を学習させたい場合(繰り返しアクション)
      • → システムがパターンを学習し将来提案するようになる
    • 3. 未知のコンテンツの場合は? Spotlight にインデクスされていないし、インタラクションもまだドネートされていない → ReleavantEntities でシステムにヒントを与える
  • RelevantEntities API で「いつ、なぜ」のコンテキスト付きでエンティティを提案
    • 例:ワークアウト開始時に再生中プレイリストを提案
  • updateEntities(_:for:) でコンテキスト付きエンティティを登録
  • コンテキスト・エンティティ・全体の 3 段階での削除 API が用意されている

7:05 – Handle entities efficiently with EntityCollection

  • 大規模なエンティティセットを効率的に扱うための EntityCollection
  • パラメータ型を [PhotoEntity] から EntityCollection に変更するだけ
    • perform() 内では photos.identifiers を使うことでフル解決を回避
    • 1000 枚の写真のタグ付けがほぼ瞬時に完了するほどのパフォーマンス改善

8:55 – Use entities across devices with SyncableEntity

  • OS 27 から Siri デバイスを跨いで会話を継続でき、エンティティも共有可能に
    • エンティティにはIDが採番されシステムはこれを鍵に特定するが、ローカル生成されたものかもしれない(ローカルID) → デバイス共通のIDが必要(安定ID) → SyncableEntity プロトコル
  • エンティティの ID がデバイスをまたいで安定している場合はプロトコル準拠を宣言するだけ
  • ローカル ID と安定 ID が異なる場合は SyncableEntityIdentifier でペアリング
    • サーバー UUID や Cloud Kit レコード ID などが安定 ID の典型例

11:01 – Richer parameter types

  • DurationPersonNameComponents のネイティブサポートが追加
    • Siri、Shortcuts、Widgets でピッカー UI とローカライズが自動的に機能

12:38 – Union value parameters

  • @UnionValue 列挙型により 1 つのパラメータが複数の型を受け付けられるようになる
    • 例:ランドマークコレクションまたはフォトアルバムのどちらかを受け取るパラメータ
  • 各ケースの表示名を caseDisplayRepresentations で定義すると自動的にピッカーが生成される

13:26 – Extend execution with LongRunningIntent

  • LongRunningIntent で 30 秒の実行制限を超える処理が可能になる(e.g. アプリを開かずにウィジェット経由で大きな画像をアップロード)
  • performBackgroundTask ブロック内で progress を更新すると Live Activity として進捗を表示
  • CancellableIntent を組み合わせるとキャンセル処理(クリーンアップ)も実装可能
  • バックグラウンドでの GPU アクセスもサポート

15:27 – Target the right process with ExecutionTargets

  • allowedExecutionTargets でインテントの実行先プロセスを明示的に指定可能
    • .main:書き込み操作など、メインアプリが必要な場合
    • .appIntentsExtension:スタンドアロンのダウンロードなど、エクステンションで完結する場合
    • .widgetKitExtension:表示専用の読み取り操作
    • 複数指定でシステムに選択を委ねることも可能

松葉製作所 HHKB専用亀甲名栗木製パームレスト&キーボードルーフを衝動買い

前回に続いて衝動買い。

昨日の記事にも記したが、HHKBをタッチ&トライした高田馬場のコワーキングスペース CASE Shinjuku では、30周年記念モデルだけでなく、HHKBパームレスト界の頂点に君臨する松葉製作所のパームレストも試用していた。このときのフィーリングが忘れられず、HHKB 30周年キーボードと組み合わせて是非使いたくなってしまった。

HHKB亀甲名栗木製パームレスト&キーボードルーフ | 松葉製作所

ということで、昨日衝動買いし、今日の昼に届いた。(ちなみに2026/07現在、松葉製作所さんの販売ページでは「ご注文をいただいてから7週間から9週間でお届け」と記載されているが、PFUのオンラインショップで購入したら当日発送だった。ありがたい。)

あらためて、抜群の安定感に舌を巻く。亀甲名栗という手法によって表面が処理されており、これによってパームレストにおいた手の甲がべたつかないし、何より手触り感が素晴らしい。そして想定外だったが木の香りが豊かなこと。外箱を開けた瞬間から香ってきたのだが、今使っていても微かに感じられる。手元で木を感じられて癒される。

あと実は一番の驚きだったのが、付属のゴム足の優秀さ。一般的なオフィスデスクの天板に対して、固定を通り越して固着していて、ちょっとやそっとではずれ動く気配がない。HHKBのゴム足を超えている。ちなみに、ゴム足は自分で貼る必要があるのだが、貼る前に底部を清潔にするためのアルコールティッシュ(健康診断の採血の時のような)まで付いているのは、親切すぎて感動した、、

CASE Shinjuku さんの紹介によると、付属のみつろうクリームで手入れをするとかなり味が生まれるそうなので、これを楽しみに月一でメンテナンスしたい。

HHKB 30周年記念モデルを衝動買い

先日Xを眺めていたところ、CASE Shinjuku という高田馬場にあるコワーキングスペースのとある投稿が目に留まった。

いちHHKBファンとして、PFUがHHKBの30周年を記念したモデルを発売したことも、それが伝統的なキー押下圧45gから30gにリニューアルしたものであることも当然知っていた。が、学生時代から使っているHHKB Professional 2 Type-S モデルが壊れないうちは他に乗り換えるつもりはまったくなかったので、こうしたニュースは気にも留めていなかった。(25周年モデルの雪もそうだが、どうせしばらくすれば通常ラインナップに並ぶだろうし、、)

が、30周年の各モデルが売り切れていくなかで、買わないにしてもこの30gという押下圧は、試せるうちに試しておかないと本当に幻になってからでは遅いと思い直し、週末 CASE Shinjuku に足を運んでみたのだった。

CASE Shinjuku は筆者の活動圏内にあり、先日もHHKBのユーザーミートアップ会場になっていたりしたことで認知したのだが、てっきり最近誕生したスペースかと思いきやインスタアカウントを遡ってみると、少なくとも10年は歴史がありそうだった。しかもHHKBの扱い自体も長い。

上の写真のとおり、HHKBの各シリーズやキーキャップが展示されていて、利用料金を払えば持ち込みのノートブックに繋いで試用することができる。しかも、写真には写っていないが、あの松葉製作所様の亀甲名栗パームレストも完備。これ4万円近くもするので試さずノールックで買うのは相当勇気がいるもので、何度も迷いつつ購入に至っていない一品だったので、二度嬉しい。

こんな感じで試用してみたのだが、、正直1打2打と触れただけで頭に電撃が走ったような衝撃を受けた。押下圧30gってこんなにも軽いのかと。さらにその静音性。この静音性は恐らく押下圧の差ではなくHYBRIDモデルになって改良された点だと思うが、長らくProfessional 2 Type-S を使い続けた身としては、ダブルでショックだった。と同時に、Pro 2 の静音モデルである Type-S とはいえども今となっては結構気になる打鍵音や、ちょっとしたストローク重さが、実は長年の愛着によって許せていただけで、ちゃんとストレスだったことに気がついてしまった。そうなるといてもたってもいられずにその場で注文。今日まで購入する気はまったくなかったので、まさに衝動買いだった。

これが土曜日の出来事で、翌営業日の月曜日に配送され今日の昼に自宅に届いたので、早速半日仕事で使ってみた。実は、HHKBは白一択と考えていて(もう1台、ほとんど使っていない Pro 2 無刻印モデルを所有)、注文時もまっさきに白US配列をカートに入れようとしたのだが既に売り切れており、今回初めて墨を選んでみた。

使用感はファーストインプレッションどおり、ほぼ文句なし。打鍵感は謳い文句通りの「フェザータッチ」。すいすいと入力できてしまう。

ただ、前評判で聞いていた通り、押下圧30gという軽さがミスタッチを誘発することは確かだった。ミスタッチといっても、タイピング最中の誤操作という類ではない。描くものが決まっていて筆が乗っている時にはあり得ないのだが、例えば考え事をしていたり画面に集中しているときなど、ふと気を抜いているとキーボードに置いた手が知らぬ間にキーを押下し続けていた、という現象はすでに何度も発生した(この記事を書いている間にも)。正直、これは慣れの問題だと思っている。

ここからは30周年というよりHYBRIDモデルへの感想になるが、まずゴム足の安定感。本体ががっちりとデスクに固定されるので手元の堅牢さが抜群。次に墨モデルのカラーリングも絶妙。筆者のデスクは白一色で、黒は浮くだろうという懸念から検討の視野に入れたことがなかったのだが、実際に配置してみるとそれは決して「黒」ではなく、じゃっかん青みがかったような、まさに硯の水で研いだ深い墨のよう。白い天板にも想定外に馴染んでくれたのだった。むしろ愛着の湧く風合い。


さて、こうなると13年近く使い続けた Pro 2 をどうしようか、ということだが、、学生時代から新卒を経て、いくつもの職場で(コロナ前も含めると物理的に)寄り添ってくれたいわば相棒をやすやすと引退させるわけにもいかない。とりあえずスタンドでも買ってしばらくは飾っておこうと思う。そして気が向いたらまた使ってあげたい。そのとき30gのキー荷重に慣れた手が、10年以上毎日を共にしたキーボードに何を感じるが楽しみだ。

WWDC26:Best practices for integrating visual intelligence in your app

Visual Intelligence による画像識別と、その結果のアプリへのハンドオフ実装について。

Best practices for integrating visual intelligence in your app


0:07 – Introduction

  • アジェンダ:コンテンツ定義・クエリ実装・クロスプラットフォーム対応・システムストア統合

2:02 – Defining your content

  • アプリコンテンツを AppEntity としてモデル化することで Visual Intelligence の検索結果に表示可能(AppEntity = アプリにおける名詞 e.g. アルバム)
  • AppEntity の設計ポイント
    • DisplayRepresentation:タイトル・サブタイトル・サムネイルを定義
    • 識別テキスト(displayRepresentation)は簡潔かつ過不足なく
    • 画像はサムネイルサイズで提供することで読み込みが早くなる

5:03 – Implementing a query

  • EntityQuery の実装:識別子から AppEntity を復元するロジック
  • IntentValueQuerySemanticContentDescriptor のピクセルバッファから結果を返す
    • input: SemanticContentDescriptor から input.pixelBuffer を取得
  • 画像の類似度検索:Vision フレームワークの GenerateImageFeaturePrintRequest でオンデバイスで実現
    • 事前に計算済みの特徴プリントと距離閾値を使って高速に絞り込み
    • queryPrint.distance(to: entry.featurePrint) で距離を算出し maxDistance 以下のものを返す
  • パフォーマンス考慮
    • 特徴プリントは事前計算してキャッシュ(カタログ構築時に 1 度だけ実行)
    • 検索時は距離計算のみで素早く応答

8:18 – Opening results

  • 選択されたコンテンツに直接遷移する OpenIntent の実装
    • OpenIntent プロトコルに準拠し target パラメータに AppEntity を指定
    • perform() は軽量に保つ(アプリがフォアグラウンドになる際に実行されるため)
    • Visual Intelligence 専用の OpenIntent は作らず既存のものを再利用する

10:03 – Mac and iPad adoption

  • 同じ AppEntity・クエリ・OpenIntent を iPadOS と macOS でそのまま流用可能
  • プラットフォーム差異への対応
    • iOS:カメラ入力
    • Mac:スクリーンショット入力、ピクセルバッファが大幅に大きくなる
      • 処理前にリサイズを検討すること

12:27 – Returning multiple result types

  • @UnionValue 型で単一クエリから複数エンティティ型を返す
    • アプリは IntentValueQuery をひとつしか持てないため、代わりに各エンティティを並べてで定義できる @UnionValue enum を使用
    • アルバムエンティティとコンサートエンティティの両方を同時に返す例
    • ピクセルマッチだけでなく関連コンテンツも派生させると有益(e.g. アルバムアートワークで特定した同アーティストから近くのコンサートを検索)

12:56 – Continuing search in your app

  • すぐに検索結果が見つからない場合 semanticContentSearch スキーマでアプリ内の完全検索へ誘導(「もっと見る」)
    • @AppIntent(schema: .visualIntelligence.semanticContentSearch) を付与
    • perform() 実装でアプリの検索ビューに移動
  • 入力されたコンテキストに基づき、事前に検索が絞り込まれた状態でアプリの検索ビューが開く
  • フィルター・カテゴリ・より深いコンテンツへのランディングを提供できる

14:27 – System store integrations

  • Visual Intelligence がシステムストアにデータを書き込み、アプリはそれを読み取る
    • カレンダー:EventKitEKEventStore)でイベントを読み取り
      • NotificationCenter.EKEventStoreChanged)でストア変更を観察して自動更新
    • 連絡先:CNContactStore
    • 医療デバイス計測値:HealthKitHKHealthStore
  • 実装パターン(カレンダーの例)
    • 1. eventStore.requestFullAccessToEvents() でアクセス許可を要求
    • 2. predicateForEvents(withStart:end:calendars:) で検索範囲を指定
    • 3. イベントタイトルとカタログのアーティスト名を照合して関連イベントを抽出
    • 4. EKEventStoreChanged の通知を受けて再フェッチ

17:16 – Next steps

  • 2 つの統合ポイントのまとめ
    • Image Search:IntentValueQuery + AppEntity + OpenIntent
    • System stores:Event Kit・Contacts・Health Kit の変更通知を観察
  • iOS・iPadOS・macOS 共通のコードで対応可能

WWDC26:Debug and profile agentic app experiences with Instruments

Foundation Models で開発したエージェンティックな挙動のデバッグ手法。ツリー構造でツール呼び出しの内部的なプロンプトを詳らかにできるのは相当助かりそう。あと、タイムプロファイラの読み方も勘所が理解しやすかった。

Debug and profile agentic app experiences with Instruments


1:57 – LLM app development mindset

  • LLM アプリ開発特有の 3 つの課題
    • 確率的な出力:非決定的なレスポンスにより標準的なユニットテストが機能しない
    • モデル間通信:複数のモデルにわたるデータフローの調整が必要
    • オブザーバビリティ:マルチモデルパイプラインのどこで問題が発生したかを特定する難しさ
  • ツール呼び出しを含むループ、ステップが増えるほどレイテンシが増しと障害要員が増える

3:59 – Inspect and diagnose an agentic experience

  • デモアプリ:craft companion(ジャーナリングアプリ)
    • インタラクティブなブレインストーミング機能を持つ
    • 2 組の Dynamic Instructions を使用
      • GenerateCraftIdeaTool アイデア生成用
      • SwitchToTutorialModeTool チュートリアル作成用
    • いずれも Private Cloud Compute のサーバーモデルを使用

5:02 – Recording a trace with Instruments

  • Instruments でのプロファイリング手順
    • Foundation Models テンプレートを選択してセッションを記録
  • セキュリティ上の注意点
    • プロンプトなど機密データがトレースファイルに含まれるため取り扱いに注意

6:04 – Navigating the Instruments UI

  • Foundation Models インストゥルメントのレイアウト
    • タイムラインのトラックとレーン
      • instructions レーン:Dynamic Instructions の活動、指示とツールのセットがアクティブだった時間を示す(アクティブだったツールセットの個数を調べられる)
      • model inference レーン:各バーの色毎に推論の所要時間を表示
        • 黄色:システムが入力プロンプトの処理に要した時間
        • オレンジ:応答の生成に要した時間
  • ツリービューの階層構造
    • セッション → リクエスト → 推論 → ツールコール
    • 各レベルでのプロンプト・レスポンス・メタデータを確認可能
    • DynamicInstructions の toolsets に SwitchToTutorialModeTool を追加し忘れていたことが判明

12:07 – Performance metrics

  • LLM 体験のパフォーマンス計測に使う 3 つの主要指標
    • Time-to-first-token(最初のトークンが返るまでの時間)
      • プロンプトを短くすることで短縮可能
    • Tokens-per-second(全体的な生成速度)
      • プロンプト間でベンチマークを取って比較、リグレッション検出に使用
    • Total latency(全体のレイテンシ、ユーザーが最も体感する数値)
      • ストリーミングを活用することで部分的な結果を表示し、体感的な待ち時間を削減

WWDC26:Meet Core AI

Core AI を使ってオンデバイスに学習モデルの作成と改善のサイクルを回したり、オンデマンドにユーザーデバイス上でモデルをコンパイルできるらしい。そもそも、PyTorch から勉強したいと思った。

Meet Core AI


0:33 – What is Core AI

  • Core AI は Apple Intelligence をオンデバイスで動かす推論フレームワークで、WWDC26 より開発者に公開
  • モデルデプロイのライフサイクル全体をカバー
    • モデルの最適化、コンバージョン、デバッグ、アプリへの統合の高速かつ反復的サイクルに対応
    • CPU・GPU・Neural Engineすべての Apple Silicon を活用
    • モダンな Swift API、Python ツールチェーン、専用デベロッパーツールを同梱
  • 主要コンポーネント
    • CoreAI Swift フレームワーク:アプリ側の推論実行
    • coreai-torch Python パッケージ:PyTorch モデルの変換
    • Core AI Debugger:数値デバッグ用スタンドアローンアプリ
  • 対応ニーズ例:話者分離モデル、カメラ映像をもとに質問へ回答、複雑なマルチステップタスク

4:57 – Model conversion

  1. モデル変換の手順
    1. PyTorchで行動予測モデルを試作
    2. ゲームを実行しトレーニングデータを蓄積
    3. PyTorchモデルをCore AIに変換(Core AI PyTorch extensions):以下
  2. coreai-torch を使って PyTorch モデルを Core AI フォーマットへ変換する手順
    1. torch.export.export() でモデルをエクスポート、動的シェイプ(seq_len など)を指定
    2. run_decompositions() で Core AI 互換の分解テーブルを適用
    3. TorchConverter().add_exported_program() で Core AI グラフへ変換
    4. save_asset("SnakeTransformer.aimodel").aimodel ファイルとして保存
  3. 変換後の数値検証
    1. PyTorch の出力と Core AI の出力を numpy で比較し、最大誤差が 0.01 未満であることを確認

6:16 – App integration

  • 生成したモデルをアプリに統合→実行
  • Xcode のモデルビューアーで .aimodel を検査可能
    • 入出力のテンソル形状、関数名、サイズなどを確認できる
  • CoreAI Swift フレームワークの主要型
    • AIModel.aimodel ファイルをロード
    • InferenceFunctionmodel.loadFunction(named:) で取得
    • NDArray:n 次元テンソルデータの入出力型
  • 推論の実行フロー
    • AIModel(contentsOf: modelURL) でモデルをロード
    • model.loadFunction(named: "main") で推論関数を取得
    • NDArray に入力データを書き込み
    • nextActionFunction.run(inputs:) で推論を実行し出力 NDArray を取り出す

10:48 – Profiling with Instruments

  • モデルのパフォーマンス改善
    • 例:時間経過と共に遅くなる問題の解決
  • Xcode に新設された Core AI インストゥルメントでモデルのレイテンシをプロファイル可能
  • Transformer モデルでシーケンス長が増えるにつれ、Key-Value の埋め込み再計算を実行する
    • → シーケンス長増大に応じて、推論時間が二次関数的に増大する問題
    • シーケンス各要素に計算済みの Key-Value キャッシュすることで解決

11:15 – Optimizing performance

  • KV キャッシュをステートフル入力として追加することで推論のスローダウンを解消
  • PyTorch 側の変更
    • register_buffer() でキーキャッシュ・バリューキャッシュをモジュールバッファとして登録
    • forward() でキャッシュの読み書きを実装
    • 再変換時に state_names=["keyCache", "valueCache"] を指定
  • Swift 側の変更
    • NDArray としてキャッシュバッファを確保し ModelPlayer の保存プロパティとして保持
    • InferenceFunction.MutableViews にキャッシュの MutableView を挿入して推論時に渡す
      • stateViews.insert(&keyCache, for: "keyCache") のように記述

14:13 – Additional features

  • coreai Python パッケージのリッチなオーサリング体験
    • 既存の変換・最適化 API に加え、モデルグラフの細粒度な操作が可能
  • Core AI Debugger
    • 変換済みモデルの数値デバッグ専用ツール
    • 中間テンソル出力の検査、PyTorch との差分確認
  • Xcode のデバッグゲージ
    • Xcode でアプリを実行中に Core AI の活動状況をリアルタイムにストリーミング監視

15:34 – Specialization

  • モデルの特化プロセス:Core AI がターゲットデバイス向けにモデルをコンパイルする処理
    • 初回ロード時に実行され、以後はキャッシュから即時ロード
    • かなり時間がかかる場合があるため、ユーザーフローの計画が必要
  • プログラム的なキャッシュ管理
    • AIModelCache.default でキャッシュの有無を確認
    • キャッシュがない場合にユーザーへ「AI 機能を準備中」と通知する UX パターン
    • AIModel.specialize(contentsOf:) で明示的にスペシャライゼーションを要求可能
  • SpecializationOptions でコンパイル動作をカスタマイズ
  • 特化で起こる2段階の変換
    • Compilation:コンピューティングを分割、計画し最適化
    • Excecutable generation:使用する計算ユニット向けのアーティファクト生成(デバイスとOSバージョンに紐付けられる)
  • Compliation ステップが大部分を占める → Core AI ツールチェインの事前コンパイル(Ahead-of-time, AOT compilation)で解決

聴講メモ:次なる可能性:WWDC26発の注目の最新アップデート @Apple Japan

Apple Japan 開催の WWDC Recap イベントに今年も行ってきた。去年も何度も足を運んだ Cafe Macs だが、今年はなんと撮影可能となっていた(と思ったのだが去年も撮影可能だったとも聞いた)。

セッションの内容は、大きくアプリの体験を向上する要素(Intelligent / Integrated / Adaptable / Tools)を軸に、今年発表された内容の詳細を紹介するものだった。Intelligent、つまり Siri AI や Foundation Models については個人的には注目しキャッチアップしていたので良い復習になった。Integrated が興味深く、特に App Intents についてはそろそろきちんと学びたいと思っていたところ、やはり Siri AI の登場で真価を発揮する機能だと再認識した。というか、App Intents がシステム提供のサービス基盤とアプリとを繋ぐエンドポイント的役割、という説明が非常にしっくりきた。

WWDC で実施され、オンラインでも配信されていた「Group Lab」という取り組みを物理的に再現くださって、たくさんの質疑応答に Apple Japan のプレゼンターらが答えるコーナーもとても内容が充実していて良かったし、中でも今年の発表内容を受けて各自アプリ提供者がマストで対応するべきことも整理されて良かった。Liquid Glass 対応や UIApplicationDelegate の利用廃止ばかり注目されているが、何気にプラットフォーム横断でアプリが使えることによる「リサイズ対応」も、対応マストながら完全に見落としポイントだった。

メモもしたが超雑多で聞き取れない箇所は不正確の可能性もある、あくまで備忘録として書き残しておく。


  • Intelligent
    • 3つの条件
      • 条件1: Anticipate(先読み)
      • 条件2: Accelerate(短縮)
      • 条件3: Unlock(可能性を解放)
    • Apple Intelligence / Foundation Models
    • マルチモーダルで画像分析もできるようになった(e.g. 画像のキャプション生成)
      • Foundasion Models vs Vision
    • Private Cloud Compute / 要Small Business Program
      • 問題を段階的に処理するリーズニングにも対応
    • カスタムモデル
      • LLM 提供者の Swift パッケージから導入可能
      • そのほかのローカルのモデルも使える
      • MLX:新しいモデルのトレーニング
    • モデルの活用
      • フェーズごとのモデルの使い分け
        • ブレインストーミングなどの創造性を要するのでサーバーサイド
        • 計画:深い推論を要するのでサーバーサイド
        • レビュー:速応性が必要なのでオンデバイス
      • コンテクストを共有し、ハンドオーバーする複雑性の解決:Dynamic Profies
    • モデルの評価
      • Evaluations framework
  • Integrated:システムとの統合
    • e.g. Widget, Control Center, Live Activities, Spotlight…
    • 声だけでアプリを操作できるSiri AI
    • App Intents framework
      • システムの様々なサービスに対する共通基盤(Siri, Spotlight, Shortcuts…)
        • WebサイトでいうところのAPI的な役割
      • 基礎となるデータを Entities として用意する(予定の内容、メールの内容、写真)
      • App Schema と Entities を組み立てることで、Siri が共通概念を理解できるようになる(e.g. 各データに対して、連絡先、会話といったようにマッピングして理解できるようにする)
      • アクションも定義(インテントの実行)
        • Entities = データ、Intents = アプリができる機能(動詞)
    • 画面上のコンテクスト理解(On-screen awareness)
      • エンティティごとにアノテーションをつけることでSiriが理解可能になる
        • “the third” → View ごとにアノテーションをつける
    • ひとつのタスクを複数のアプリをまたいで流れるような体験が実現可能
      • Maps でピン留めしたレストラン→Note でメモ
    • Siri に学習させるラーニング機能
      • e.g. Send a mesage → Which app do you mean?
      • アプリが Siri に対して利用傾向を donation する(IntentDonationManager)
    • どこから始める?Domainから(system, phone, mail, clock… ドメインごとに事前に用意されたスキーマがある)
    • system.search というスキーマで、アプリの中のサーチに直接アクセスすることができる
  • Adaptable
    • Liquid Glass
      • なじみやすさ(Familiality)
        • UI layer / Content layer
      • Brand Indentity
        • 色、タイプ、コンテンツ、、
        • iOSのデザイン言語を活かす
          • e.g. gentler streak, moon lit
        • ティントカラー
          • e.g. Slack: トップバーをコンテンツレイヤーに落とした(Color scrolls away)
        • Icon Composer
    • Platform
      • iPhone → iPad → iPhone mirroring on Mac
      • リサイズが可能に:Xcode 27 でビルドし直した時点でリサイズ可能なモードが有効に
    • まず Xcode 27 で再コンパイル
  • Tools
    • プロンプトテクニック
      • Be specific:具体的に
      • Give stylistic cuse:スタイルの手がかりを入れる(どんな感情やムードを呼び起こしたいのか、コーヒーショップの雰囲気、紙の質感)
      • 必ず複数のオプション・可能性をリクエストする
        • 「XXX種類のバリエーションで作成してください」
      • 「Swift Preview と固有の名前をつけてください」
    • エキスパートスキルが組み込まれているから活用して(ローカライズ、アクセシビリティ、、)
    • Figma, GitHub から提供されるプラグインを使って Xcode に指示

Q&A

  • Siriは一般ユーザーに使いこなせる?Siri AI は音声のみ?
    • 海外だと意外と気軽に使われている
    • Siri AIの呼び出し:Spotlight のサーチがなくなりテキストで話しかけ
    • テキストは日本語でもいける
  • 今年のアップデートで今後やらなければならないこと
    • UIKit, UIApplicationDelegate 使っていたら移行すること
    • LaunchScreen を追加すること
  • 自分のアプリが既存の App Intent Scheme に当てはまらない場合
    • ドメインがジャンルに当てはまらなくても OK
    • 写真を扱っていたら、写真のドメインに用意されている entity や intent を使ってOK(たとえばECで画像投稿とかは、photo 配下にあるので使ってOK、カレンダーでなくても calendar のエンティティ使っていい)
    • system.search は、アプリに検索機能があれば、XXXを探しての変数部分がアプリにそのまま転送されるので、なるべく入れると良い。Siri経由で検索ができるようになる
    • スキーマなしの intent 作って、AppShortcutProvider 使うことができ、従来は厳密にそのワードと一致する必要があったが、今回のSIriで少しだけ柔軟性が上がっている
  • Mac, iPad でも iPhone アプリが動くので崩れないよう対応必要?
    • デザインの対応が必要
    • リファレンス:Apple のアプリは Xcode 27 でビルドしているものが多いので、iPhone Mirroring で動かしてみると良い
      • 天気とか株価とか Lnadscape 対応している
  • アプリアイコンに企業ロゴを使用していて変更できないがどう対応するべき?
    • 屈折入れない判断もあり
  • リサイズの禁止はできる?
    • ないが、iPad 26 までで deprecated になった UIRequiredFullScreen が(iOS 27 のみで)役割が変わって復活、有効になる。縦横の比率を保ったまま拡大縮小ができる、という意味になるので、それを Info.plist に入れることで担保できる(Modernization UIなんとかというUIKitのセッションで説明されている)
  • iOS 26.2以降のメモリ不足によるクラッシュについて
    • Foundation Models のバージョンアップが26.4で行われた
  • 会話コンテクストは Siri AI のコンテクストに保持される?それとも独立?
    • 会話は Siri AI のセッションに残っている
    • 機能登録した〜は引っ掛けられる、技術的には Index entity にして、Core Spotlight にデータを送る(カレンダーを登録した段階で Spotlight に送ることで、変更日時も登録される)
  • リサイズは縦横の切り替えお必須?
    • 基本的には考える必要あるが、UIRequiredFullScreen を有効にすればOK
  • さまざまなサイズに対応しない場合の不都合
    • リサイズ可能な状態になるとレイアウトが崩れるのでまずい
  • On-device model の性能を Gemini 比較で
    • Apple Machine Learning Research というブログサイトを見て欲しい
    • 性能についての記載おある(2つモデルがあり、上位機種は上のモデルで動く。その詳細が書かれている)
      • 6/8 のIntroducing 3rd generation … 記事

WWDC26:Improve your prompts by hill-climbing with Evaluations

統計学的にモデル評価を行いながら、ヒルクライミングプロセスで性能改善する手法の紹介。カッパ係数、統計学の授業で触れた気がするがまったく覚えてなかった。

Improve your prompts by hill-climbing with Evaluations


0:00 – Introduction

  • ヒルクライミングの定義
    • 評価スコアをガイドに知能機能を反復改善するアプローチ
    • サイクル:開発 → 実行 → 分析
  • AI 機能の改善に科学的思考を持ち込む考え方

2:42 – BookTracker’s tagging problem

  • Book Tracker のタグジェネレーターが抱える問題
    • 重要なテーマを見逃す
    • 本の内容ではなく読者の感想やレビューからの引用をタグとして生成してしまう

5:27 – Analyzing the evaluation results

  • データセットにレビューを 2 件追加して評価を実行
  • Xcode の評価レポートで生成タグと期待タグを比較
  • レポートの活用
    • サンプルごとのスコアとジャッジの rationale を確認
    • 期待するタグを欠いていてもモデルは高いジャッジスコアを付けており、人間評価と乖離があることが判明

8:26 – Drift between judge and human

  • モデルジャッジの評価と人間の専門家評価の乖離:「ドリフト」
  • 複数サンプルに対しモデル・人間で評価、それぞれの平均値の乖離がドリフト
  • ドリフトが存在すると評価スコアを信頼できなくなるため、ジャッジを人間の判断に揃える必要がある
  • 評価の乖離を測定する方法:
    • 両者合致する評価の割合をパーセンテージで表記(accuracy)
      • 分布が偏るケースに不適合(e.g. データセットの品質が高く人間がすべてを高く評価しがちな場合、モデルの評価と乖離が生じない)
    • accuracy とは異なる評価方法が必要

9:37 – Measuring drift with Cohen’s kappa

  • カッパ係数(Cohen’s kappa)によるアライメント計測で一致度(alignment)を測定
    • 偶然の一致(coincidence)の確率を差し引いた上で正確度を正規化 alignment = (accuracy –  coincidence) / (1 – coincidence)
    • 単純な一致率よりも真のアライメントを反映
  • Evaluations の記述に必要な4つの要素:データセット、Evaluation の対象、Evaluation の定義、結果の集計

12:26 – Building a judge alignment evaluation

  • BookTagJudgmentCalibration:ジャッジと評者の評価を比較するための専用評価
    • 同じデータセットに対して人間の手動評価とモデルのジャッジの両方のスコアを収集
    • aggregateMetrics でカッパ係数を集計
  • ジャッジアライメントのテスト
    • カッパ係数に加えて、平均値と各 dimension ごとの標準偏差も取っておくと、ジャッジスコアの増減を把握するのに役立つ
    • 閾値の目安:0.6 以上が望ましい(統計学的に意義のある一致水準を表すため)
      • #expect(result.aggregateValue(.custom(label: "Relevance: Judge vs Expert")) > 0.6)

15:16 – Analyzing alignment failures

  • Evaluate を再実行するとテストに失敗:Assistant Editorでレポートを深掘りするとジャッジが過剰に特定的なタグや的外れなタグを高く評価していると判明
  • 原因:良いタグ/悪いタグを分別するためのアプリに関するコンテキストがプロンプトに不足している

17:16 – Comparative evaluation: control vs experimental

  • Xcode 27 の比較評価機能
    • 2 つの評価を対照実験として比較し、変更の効果を客観的に検証
    • Control group:ベースとなるプロンプト vs Experimental group:実験的に変更を加えたプロンプト

19:12 – Refining the scoring dimensions

  • ScoreDimension の説明文を精緻化
    • Relevance:読者の反応・メタコメンタリー・著者情報をタグにしてはいけないことを明示
    • Usefulness:標準的なジャンル・テーマタグが機能する一方で、造語・キャラクター名・過度に一般的な語は不適と明示
  • 説明の改善で両次元のスコアが向上

21:23 – Adding few-shot examples to the judge

  • ModelJudgePrompt でジャッジに文脈と worked examples を提供
    • アプリの目的(Shelf:個人書籍管理アプリのタグ生成)を説明
    • Worked examples でレーティングの基準を示す
      • 例 A(Pride and Prejudice):タグが適切
      • 例 E(Frankenstein):ジャンル矛盾あり
  • Few-shot examples でジャッジの評価を専門家の感覚に近づける

23:38 – Going beyond prompts: adding a tool

  • ヒルクライミングの対象はプロンプトだけではない
  • BookLookupTool の追加し機能の品質を段階的に高める試み
    • レビューから本のタイトルと著者を検索するツール
    • 登場人物名・舞台設定・引用フレーズなどの手がかりからサンプルブックを特定
  • タグ生成サービスにツールを渡すだけで追加文脈を提供
    • BookTaggingService.generateTags(for:tools:) でツールを注入
  • 評価スイートでツールなし vs ツールありを同時に比較

27:17 – Next steps

  • 科学者のように考える:仮説を立て、変数を制御し、結果を測定する
  • 投資する価値のあるプロセス
  • 変数の創造性を持つ(プロンプトだけでなくツール・モデル・指示の構造なども対象)
  • ドリフトに注意し続ける(ジャッジのアライメントを定期的に確認)

WWDC26:Create robust evaluations for agentic apps

非決定的出力を評価するためのデータセットを大量生成する方法。とにかく数打ちながら期待値を満たすデータをふるいにかけながら集めると言う泥臭い方法だが、Evaluation フレームワークの機能として提供されているのがありがたい。

中でも、データセットにとどまらずツール呼び出しの検証が含まれているのは興味深かった。Foundation Models を使って開発する中でも、特に tool calling には泣かされた。以下の記事のようにツール呼び出しがされているかをログベースで検証したりしていたが、バージョンがあがると期待通りに呼び出されなくなり、プロンプトをどう工夫してもこの問題はついに解決されなかった。

今年こそは検証に足る挙動が実現していると期待しつつ、こうした評価のしがいがある高度な実装に挑戦してみたい。

Create robust evaluations for agentic apps


0:00 – Introduction

  • Evaluations フレームワーク(Xcode 27 新機能)の高度な機能を紹介
    • 合成データでデータセットを拡張する
    • ツールコーリングを伴うエージェンティックなワークフローの堅牢な評価構築
  • Hill-climbing プロセスにおける、”Develop” と “Evaluate” ステップに着目

2:21 – The dataset problem in BookTracker

  • Book Tracker のタグ自動生成機能が抱えるデータセット問題
    • 実際のレビューは書籍・ジャンル・長さ・文体で無限に多様
    • 手作業で書いた 13 サンプルではすべてを捉えられない

3:46 – Generating synthetic data with makeSamples

  • makeSamples API でデータセットを合成拡張
    • プロンプト・データセット(ModelSample の配列)・targetCount(シード含む合計サイズ、e.g. 100)を渡す
    • 合成データの生成は反復的なプロセスの中で行われる(データが代表的か確証が得られるまで検証される)
    • 妥当なサンプル数はケースバイケース:量より網羅性

6:27 – Customizing generation with SampleGenerator

  • SampleGenerator で、prompt, dataset, targetCount を超えたより細かい設定
    • sessionProvider クロージャでモデルを選択(例:Private Cloud Compute)
    • sessionProvider は実行開始時1度実行され、バッチ間で再利用されるが、コンテキストウィンドウを使い切ると再度呼び出される
      • コンテクストは共有されないので、サンプル生成の期待を指示する sessionProvider へのカスタムインストラクションは、自己完結型にする(前のバッチの状態に依存させない)

8:38 – Sampling strategies

  • samplingStrategy でシードサンプルの提示方法を制御
    • .random(デフォルト):ランダムなサブセット。多様性重視のデータセットに適する
    • .slidingWindow:連続したシードを提示。順序に意味があるデータセットに適する

10:11 – Validating synthetic samples

  • validator クロージャで各サンプルを個別に検証
    • レビュー長 ≥ 100 文字
    • タグ数 3〜8 個
    • タグはすべて小文字
  • 有効なサンプルは samples、不合格は invalidSamples に分類

13:04 – Comparing evaluation results

  • Xcode 27 の Evaluations Report で 2 つの実行結果を比較
    • 13 サンプルと 100 サンプルの結果を比較
    • サンプルが増えたことで、品質スコアが低下し、小さなデータセットではよく見えていた機能の限界が露呈
      • プロンプトやインストラクションによって改善しうる
      • 評価を調整し、実際に何が評価されているかを理解できる
      • データセットがまだ代表的でないかもしれない(増やしたり、エッジケースを網羅)

15:09 – Tool calling and tool evaluations

  • ツール評価は「何が返ってきたか」ではなく「どうやって取得したか」を検証
    • 正しいツールを、正しい引数で、正しい順序で呼んでいるか
    • 想定外のツール呼び出しがないか
  • デモアプリのツール例
    • searchBooks・getBookDetails・findSimilarBooks

18:54 – Trajectory expectations

  • TrajectoryExpectation でセッションのトランスクリプト上のツール呼び出しの種類と順序を検証
  • 引数マッチャーの種類
    • .exact:厳密な値の一致
    • .naturalLanguage:意図ベースのファジーマッチング(基準を自然言語で記述)
    • .contains.hasPrefix.hasSuffix:部分文字列マッチング
    • .oneOf.pattern:列挙値・正規表現マッチング
    • .range:数値の範囲チェック
    • .keyOnly:キー名だけ確認(値は問わない)
  • 順序付き期待(ordered)と順不同期待(unordered)を組み合わせ可能
  • disallowed で呼び出してはいけないツールを指定

21:26 – Building a tool call evaluation

  • データセットをそれぞれに対するプロンプト、インストラクション、TrajectoryExpectation  をもって、ToolCallEvaluator でスコア付けをする
    • LanguageModelSession にツールを渡し、構造化されたトランスクリプトをキャプチャ
    • allPasspercentagePass の 2 つのメトリクスを自動計算

22:02 – Synthetic data for tool evaluations

  • ModelSampleTrajectoryExpectation はいずれも @Generable のため SampleGenerator を用いて合成生成が可能
  • 合成プロンプトの設計ポイント
    • 利用可能なツールの説明(名前・引数)
    • 順序要件(ordered vs unordered の使い分け)
    • 使用すべき引数マッチャーの説明
  • バリデーターで品質を担保
    • expectations が定義されているか
    • 少なくとも 1 つのツール期待が含まれているか
    • すべてのツール名が有効なセットに含まれているか