前回の「Deep dive into the Foundation Models framework」に引き続き、Foundation Models framework のセッションメモ(今回もAI要約+筆者加筆修正)。前半はだいたい前出の内容と被っていた。UIに組み込む際の体験向上、パフォーマンスの検証や改善のtipsについて。
Foundation Models のデモアプリが結果を逐次表示する際、やたらぬるぬると表示更新される様子が気になっていて、実装難易度高そうだと思っていたが、ストリームで吐き出されるデータ表現が自動的に identifiable であるため、実装者はただアニメーションを指定すれば良いという、にわかに信じがたい魔法のような話だった。
Introduction
- Foundation Models frameworkを使い、SwiftUIアプリにオンデバイスAI機能を追加する方法を実演
- 旅行プラン作成アプリを例に、ランドマーク選択→旅程自動生成→外部情報取得→ストリーミング表示→パフォーマンス最適化までを一通り解説
Prompt engineering
- XcodeのPlayground機能を活用し、プロンプトの試行錯誤を効率化
@Generable
annotation,@Guide
macro- Instructions (プロンプトの上位形式 – the higher level form of prompting) により、モデルの役割や期待する出力例を明示し、精度を高める
- 生成結果は
Observable
オブジェクトとしてUIにバインドし、リアルタイムに反映- 初期化タイミングによっては、不要なタ再生成が行われパフォーマンスに影響するため、
Task
modfier 内で初期化し、表示時1度だけの生成を保証するべき
- 初期化タイミングによっては、不要なタ再生成が行われパフォーマンスに影響するため、
Tool calling
Tool
プロトコルを実装することで、モデルがアプリ内の任意の関数やAPI(例:MapKit)を呼び出せる- ツールには名前・説明・
call
メソッド(引数はGenerable
型)を定義 - モデルは必要に応じてツールを自律的に呼び出し、外部データ(例:ランドマーク周辺の観光地情報)を取得
- ツールの有無、ある目的に対して使って欲しい tool の明示、呼び出し頻度はプロンプトや instruction で調整可能
- Apple Intelligenceの利用可否 = Foundation models の利用可否や、モデルの準備状況も考慮し、UIで適切に案内・制御
SystemLanguageModel
のmodel.availability
で判別- Xcode の build scheme から、モデルの無効化が可能 (Simulated Foundation Models Availability)
Streaming output
- 旅程生成の出力をストリーミングで受け取り、部分的にUIへ即時反映
session.streamResponse(...)
APIPartiallyGenerated
型(全プロパティが optional な構造体)を活用し、生成途中のデータも段階的に表示
- SwiftUIのForEachやアニメーション、トランジションを組み合わせて、スムーズな体験を実現
PartiallyGeneratable
構造体は自動的に identifiable、IDの自前管理は不要
- ストリーミングにより、ユーザーは生成完了を待たずに内容を確認できる
Profiling
- Foundation Models Instrument を使い、アプリのパフォーマンスを可視化・最適化
- モデルのロードや推論、ツール呼び出しの各工程の所要時間を計測
- 初回リクエスト時の遅延対策として「プリウォーム(
session.prewarm()
)」を推奨- モデルがリクエストをもらう前に、モデルをロードしておく
- 例: ユーザーがプロンプトのタイピング開始時
- 今回はランドマークタップ時(Generate ボタンタップ前)
- 生成スキーマをプロンプトに含めるかどうかを状況に応じて最適化し、トークン数やレイテンシを削減
- モデルがリクエスト生成前にレスポンスフォーマットを完全に理解していれば
includeSchemaInPrompt
をfalse
に指定する- 有効ないくつかのケースを紹介
- モデルがリクエスト生成前にレスポンスフォーマットを完全に理解していれば
- 実機での計測を推奨し、シミュレータとの違いに注意
- Simulator on M4 Mac > iPhone の場合あり