前回の「Meet the Foundation Models framework」に続いて、Foundation Models framework を深ぼるセッションビデオのメモ。今回もAIに要約してもらったものをベースに理解したことを書き足していった。
Tool は Inputに対してOutput が一定決まっている(連絡先やカレンダー)ユースケースに対応しており、一方でたとえばカスタムデータからインサイトを得るような、ファインチューニング的な方法は現時点での Foundation Models framework ではまだ実現できなさそうだった。あくまで、オンデバイスLLMに外部リソースへの一問一答的な参照手段を与えるという理解。desciriptionを記述することでモデルが勝手に選択して使うという意味では、MCPに近いかも?将来的に、自身が保有するデータをこのツール定義としてアプリ外に公開し、アプリ間でAI同士やりとりできるようになると面白いかも、と妄想が広がった。
Sessions (Prompting / Transcript / Sampling)
session.respond(to: userInput)
- instruction promptをトークン (small substrings) に分解
- LLMがトークンシーケンスを受け取り、response を生成
- Foundation Models framework が一連の処理を担うので使い手は気にしなくて良いが、トークンは free ではない:計算コストとレイテンシが生じる
- ステートフルなセッションとその状態管理
- セッション(
LanguageModelSession
)は状態を持ち (statefull)、やりとりの履歴(transcript)を保持する session.transcript
: デバッグやUIへの表示に有用- ただし、context limit あり:入力・出力のトークン数が多いと遅延やエラー(
.exceededContextWindowSize
)が発生する- 履歴のない新しいセッションを開始
- 既存のセッションから transcript を要約し引き継げる
- 例1. 最初(instruction)と最後のやりとりのみ引き継ぐ
- 例2. transcipt 全体を要約して引き継ぐ (外部ライブラリ or Foundation Models 自体を用いて)
- セッション(
- サンプリングと出力の多様性
- 同じプロンプトに対して異なるアウトプットが生じる
- モデルの出力 = トークンは、確からしさの分布に基づき確率的に選択される(sampling)
- デフォルトは randam sampling
- ゲームなどの用途に対して、再現性を求めたい場合:
GenerationOptions
でサンプリング方法や多様性 temperatureを調整可能 (数値大きい方がアウトプットが多様) - 決定論的な出力(
.greedy
)も選択できるが、モデルのバージョンによって結果が変わる場合がある
- 言語サポート
- 入力言語が未対応の場合は .
unsupportedLanguageOrLocale
エラーが発生 - モデルが対応している言語かどうかを事前にAPIで確認可能
- 入力言語が未対応の場合は .
Generable
@Generable
マクロを使うことで、Swiftの型に沿った構造化データを安全に生成できる- constrained decoding により、特定のスキーマに沿った正しい出力のみが生成される
- ハルシネーションが発生しても、最終的にスキーマ定義されたトークンのみを採用することで誤りを防ぐ
- enumやassociated value、配列、数値型など多様な型に対応
@Guide
マクロでプロパティごとに値の範囲や説明を指定可能@Guide(.range(1...10))
for Int@Guide(.count(3))
for Array@Guide(desciption: "A full name")
- プロパティの生成順序はソースコードの宣言順に従うため、依存関係やUI表示順に注意
- 文字列に
@Guide(.pattern(...))
を指定して 、正規表現(regex)による文字列制約も可能- Regex builder syntax
- constrained decoding により、特定のスキーマに沿った正しい出力のみが生成される
Dynamic Schemas
- 実行時に構造が決まるデータにも対応可能(
DynamicGenerationSchema
)- Dynamic schemas はPropertyのリストを持ち、Propertyごとがnameとpropertyの型を定義するschemaを持つ
- Dynamic schemas は配列を持つことが可能
- 他の dynamic schemas をスキーマ名を通じて参照することが可能
- ユーザー入力などで動的にスキーマを構築し、モデルに渡すことができる
- 検証済みスキーマに変換してから推論を行うため、動的でありながら同時に型安全性が保たれる
Tool Calling
Tool
プロトコルを実装することで、モデルがアプリ内の任意の関数やAPIを呼び出せるTool.name
は短く、しかし省略は用いず英語としてreadableで分かりやすくするのが推奨。動詞を使うべき e.g."findContact"
Tool.description
も同様に長すぎず (1文推奨)、実装の説明を含めるべきでない- この文字列がそのままプロンプトに用いられるため、トークンが長くなりレイテンシが増大する
- インプット
Argument
を定義- モデルがツールを呼び出す際に
Argument
を生成する - 入力引数も
Generable
で型安全に生成されるため、想定外の値が渡される心配がない
- モデルがツールを呼び出す際に
- ツールはインスタンスで、そのライフサイクルをコントロール可能
- セッションの初期化時に渡し、セッション中は同じインスタンスが使われる
- ツールは状態を持つこともでき、複数回・並列で呼び出される場合もある
- 例:連絡先やカレンダーの情報を使って、よりパーソナルな体験を実現
まとめ
- Foundation Models frameworkは、オンデバイスで安全かつ柔軟にLLMを活用できる強力なツール
- セッション管理、構造化出力、動的スキーマ、ツール呼び出しなど、実践的な機能が豊富
- プライバシーを守りつつ、アプリに高度なAI体験を組み込むことが可能
「WWDC25:Deep dive into the Foundation Models framework」への1件のフィードバック