Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Foundation Models触ってみた - iPhone Dev Sapporo — W...

Foundation Models触ってみた - iPhone Dev Sapporo — WWDC25 Recap

Avatar for Shuhei Shitamori

Shuhei Shitamori

June 27, 2025
Tweet

More Decks by Shuhei Shitamori

Other Decks in Programming

Transcript

  1. 自己紹介 カナダのデジタルID スタートアップで働くiOS エンジニア 個人でVison Pro を購入、仕事に活かせないか模索中 経歴 北海道大学院 HCI

    研: iPad 向けの透明なキーボードの提案 ヤフー株式会社( 現LY): 地図アプリ開発, R&D カナダへ移住してデジタルID スタートアップへ転職 帰国しフリーランスとして活動中 2
  2. アジェンダ 1. Foundation Models フレームワーク概要 2. 主要機能と特徴 3. Guided Generation

    (構造化生成) 4. Tool Calling (ツール呼び出し) 5. 実装例の紹介 6. まとめ 3
  3. Foundation Models Framework とは アプリから利用できるオンデバイス大規模言語モデル 完全にプライベート - 第三者サーバーへの送信なし 無料 -

    API コストなし オフライン動作 - ネット接続不要 import FoundationModels let session = LanguageModelSession(model: .default) let response = try await session.respond(to: "Swift でファイルを読み込む方法を教えて") print(response.content) // "Swift でファイルを読み込むには、FileManager を使用します。" 5
  4. 最低限の利用に必要なクラスは2 つのみ SystemLanguageModel 30 億パラメータの2 ビット量子化モデル (ChatGPT3.5 は3550 億) 現在提供されているモデルはgeneral

    とcontentTagging の2 つ LanguageModelSession モデルとの対話セッションを管理 プロンプトの送信、応答の受信 6
  5. 基本的な使用方法 import FoundationModels // フレームワークのインポート let model = SystemLanguageModel.default //

    指示を与えてセッションを作成 let session = LanguageModelSession( model: model, instructions: Instructions(" あなたは親切なSwift プログラミングの先生です。質問には1 行以内に簡潔に答えてください。") ) // プロンプトを送信して応答を受け取る let response = try await session.respond(to: "Swift でファイルを読み込む方法を教えて") print(response.content) // `FileManager` を使用してファイルを読み込むことができます。 // 過去の会話を再利用して質問に答えられる let response2 = try await session.respond(to: " もういっかい教えて。") print(response2.content) // `FileManager` を使用してファイルを読み込む方法です: ... 複数行のコード例が返される 誤動作を抑えるためInstructions はユーザーには触らせない 7
  6. Foundation Models を拡張する機能 パラメータが少ないからか出力の質が低く知識も乏しい 以下の機能を活用して出力を改善する必要がある Guided Generation (構造化生成) @Generable @Guide

    マクロで出力結果形式の定義・安定化 Tool Calling (ツール呼び出し) WebAPI やローカルデータにアクセスする方法を定義できる 知識の拡張やアクションを実行可能に 8
  7. Guided Generation (構造化生成) @Generable マクロでレスポンス形式を定義 @Guide マクロで出力のガイドラインを設定 @Generable struct Recipe

    { @Guide(description: " レシピの名前を入力してください") let name: String @Guide(description: " 各手順を簡潔に説明して", .range(1...5)) let instructions: [String] @Guide(description: " 調理時間は分単位で指定して") let cookingTime: Int } // 構造化データとして直接取得 let recipe = try await session.respond(to: " パスタのレシピを作成して", generating: Recipe.self) print(recipe.name) // " ペペロンチーノ" print(recipe.instructions) // ["1. ニンニクを炒める", "2. パスタを茹でる", ...] print(recipe.cookingTime) // 20 9
  8. Tool Calling (ツール呼び出し) API 等にアクセスできるカスタムツール定義してモデルの機能を拡張 struct WeatherTool: Tool { static

    let name = "getWeather" static let description = " 指定した都市の天気情報を取得" @Generable struct Arguments { @Guide(description: " 天気を調べる都市名") var city: String } func call(arguments: Arguments) async throws -> ToolOutput { // WeatherKit 等を使用して実際の天気データを取得 let weather = await getWeatherData(for: arguments.city) return ToolOutput(weather) } 10
  9. Tool Calling を利用したセッション let session = LanguageModelSession( model: .default, tools:

    [WeatherTool()], instructions: Instructions(""" あなたは天気予報のアシスタントです。 ユーザーの質問に対して、必要に応じて天気ツールを使用してください。 """) ) // モデルが自動的にツールを呼び出して応答を生成 let response = try await session.respond( to: " 東京の今日の天気はどうですか?" ) 11
  10. Apple のデモ-2    Coffe Shop Game NPC との会話を自動生成 (Guided Generation,

    Free) 連絡先内の知人がNPC として登場 (Tool Calling + Private) カレンダーイベントに基づく会話 (Tool Calling + Private) 14
  11. LINE トーク履歴を元に相性診断アプリ の実装 Instructions let instructions = Instructions(""" あなたは恋愛関係や友人関係の相性分析の専門家です。 LINE

    チャット履歴を分析して、二人の相性を客観的かつ建設的に評価してください。 分析観点:コミュニケーションの頻度とバランス、感情的な調和とサポート、 会話の深さと多様性、レスポンス傾向と相互理解、共通点と補完性 """) 19
  12. LINE トーク履歴を元に相性診断アプリ の実装 Guided Generation @Generable struct AnalyzeResult { @Guide(description:

    " 相性スコア(0-100 点)") let compatibilityScore: Int @Guide(description: " 相性分析のサマリー(4 行程度)") let compatibilitySummary: String @Guide(description: "person1 の感情を漢字1 文字で3 つ表現", .count(3)) let feelingsToPerson2: [KanjiFeeling] } 20
  13. 漢字の感情を表現する構造体 @Generable struct KanjiFeeling { @Guide(description: " 感情を表す漢字, 絶対に1 文字分の漢字を指定すること")

    let kanji: String @Guide(description: " 感情の度合いを0-100 の整数で表現", .range(0...100)) let score: Int @Guide(description: " 漢字の感情に適したRGB 色値") let color: RGB } 21
  14. Tool Calling struct ContactSearchTool: Tool { static let name =

    "searchContact" static let description = " 指定された名前の連絡先情報を検索" @Generable struct Arguments { @Guide(description: " 検索する人の名前") var name: String } func call(arguments: Arguments) async throws -> ToolOutput { // 連絡先から年齢、職業、誕生日等の情報を取得 let contact = searchContactInfo(name: arguments.name) return ToolOutput(contact) } } 22
  15. 触ってみて プライベート情報から価値を作れるおもしろい機能 ただし、質の高い応答を得るためには工夫が必要 要考慮のエラーケースが多い デバイス・OS がFoundation Models 非対応 → Fallback

    UI 必要 生成中に生成を依頼してエラー → 生成中状態の適切な管理 利用ガイドラインに違反 → ユーザーへ適切なフィードバック コンテキストサイズを超えた入力 → Session の再作成の自前実装 オフラインのふりをしたプライベート情報収集アプリ出てきそう... 23
  16. まとめ Foundation Models の価値 プライバシー第一 - オンデバイス処理 完全無料 - API

    料金なし 高性能 - 低遅延、オフライン動作 柔軟性 - Guided Generation + Tool Calling 24