Foundation Models フレームワークが気になっていたので、一度Liquid Glass を離れて3本目に見たのでメモ。オンデバイスモデルならではの制約を実際に使いながら把握していきたい。
前回まで、Liquid Glass の抽象的な思想をしっかり理解する意気で、几帳面にもビデオを頭から見てメモを構築したが、無駄に時間がかかるので今回は先にAIにまとめてもらって、そこに自分の理解を加筆していった。
1. フレームワークの概要
- Foundation Modelsフレームワークは、Apple Intelligenceを支えるオンデバイス大規模言語モデル(LLM)へのアクセスを提供
- macOS、iOS、iPadOS、visionOSで利用可能
- スライドに示された用途例:コンテンツ生成/生成的対話/アプリ内ユーザーガイド/生成的クイズ/パーソナライズ/分類/要約/セマンティック検索/洗練・精緻化/質問応答/カスタマイズ学習/タグ生成/エンティティ抽出/トピック検出
- オンデバイスで動作するため、プライバシーが保護され、オフラインでも使用可能
2. モデルの特徴
- Xcode Playgrounds 上の数行のコードで実演
- 30億パラメータを持つ大規模言語モデル
- 2ビット量子化
- 要約、抽出、分類などのタスクに最適化
- デバイススケールのモデルであり、サーバースケールのLLMとは異なる用途に設計
- 世界クラスの知識や高度な推論には向いていない
- タスクを小さなピースに分解することが求められる
3. Guided Generation
- LLMは自然言語による非構造的なアウトプットをするが、アプリのビューへのマッピングには不向き
- JSONやCSVへの吐き出しをプロンプトで指示できるが、確率論的なモデルにおいて正確性を保証できない
- そこで構造化された出力を保証する機能
@Generableと@Guideマクロを使用- Swiftの型システムを活用して自然言語プロンプトを補強
@Generable: モデルに生成して欲しい型を定義@Guide: プロパティに対して自然言語による説明を付与し、生成する値を制御する- プリミティブ型、配列、Generable型、再帰的な構造もサポート
4. Snapshot Streaming: ストリーミング機能
- デルタではなくスナップショットを使用
- 典型的なストリーミングアウトプットはデルタが用いられる
- 生成した結果を組み立てる責務はデベロッパー側にある:構造的になると難しい
- スナップショット:モデルの生成したデルタを部分的な生成結果として表現
@Generatedマクロを展開するとPartiallyGenerated- すべてのプロパティが Optional
- SwiftUIとの統合が容易
streamResponse(to:options:)- stream responses aync sequences
- ↑ snapshot を逐次的に受ける
- Best practices
- SwiftUI によるアニメーション/トランジションを考慮する:レイテンシを隠すために
- view identity を考慮する:特に配列において
- プロパティの順序が重要
- アニメーション/モデルのアウトプット どちらに対しても大切
- summary を表すプロパティは最後に定義するのが良い
- 参照:Code-along: Bring on-device AI to your app using the Foundation Models framework
5. ツール呼び出し機能
- 外部情報源との統合
- モデルがアプリ内のコード(Tool)を実行可能
- e.g.
struct GetWhatherTool: Tool namedescriptioncall(arguments:) async -> ToolOutput- 外部情報源とのやり取りを実装(e.g. ジオコードから住所、位置情報から天気)
- ツールの説明をもとに、モデルがツールを自律的に呼び出し、最終レスポンスに組み込む
- e.g.
- よりダイナミックな定義が可能
- 動的生成スキーマ
- 実行時の引数/動作の定義
6. ステートフルセッション
- セッションベースの設計
- instruction: モデルがどう応答するべきかを定義:e.g. 口調や言葉数
- カスタム指示の提供が可能
- インストラクションとプロンプトと指示の違いについての説明
- instructions should come from you
- propmts may come from you / users
- 前者が優先され、prompt injection 攻撃を予防する
- multi-turn interactions
- モデルとのインタラクションはコンテキストに保持され、1セッション内での 過去のやりとりを参照、理解できる
session.transcriptで過去のやり取りを出力可能
- 組み込みのユースケース (built-in use cases)
- e.g.
SystemLanguageModel(useCase: .contentTagging) - Content taggin adapter の説明
- e.g.
- エラーハンドリング
- ガードレール違反
- 未対応の言語
- コンテクストウィンドウの超過