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

Foundation Modelsでボクセルモデルは作れるのか?

Avatar for TAAT TAAT
September 24, 2025

Foundation Modelsでボクセルモデルは作れるのか?

visionOS Engineer Meetup: vol.12 オンラインLT会での発表資料です
https://visionos-engineer.connpass.com/event/368679/

Avatar for TAAT

TAAT

September 24, 2025
Tweet

More Decks by TAAT

Other Decks in Technology

Transcript

  1. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. ???でボクセルモデルを作る 6. 今後 展望 7. まとめ
  2. タイトル 宣伝 Space Time Attack 個人開発で作ったハンドトラッキ ングを使った空間ゲーム どこキャン Apple Vision

    Pro Hackathonで作った バーチャルキャンプアプリ Spatial Monster Magic VisionDevCamp Tokyoで 作ったモンスターバトルゲーム
  3. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. ???でボクセルモデルを作る 6. 今後 展望 7. まとめ
  4. タイトル Foundation Models 、WWDC 2025で発表されたApple Intelligenceで 使用されている と同じ大規模言語モデル (LLM)を、サードパーティ開発者が手 軽にアプリ内に組み込めるフレームワーク

    最も大きな特徴 「オンデバイス」で推論を行う 点で、処理が端末内で完結するた め、オフラインでも動作するだけでなく、プライバシーも保護され、 従量課金もない! Foundation Modelsと ?
  5. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. ???でボクセルモデルを作る 6. 今後 展望 7. まとめ
  6. タイトル モデル 利用可能性をチェック モデルを使う前に、モデルが利用可能かどうかをチェック して、利用不可 場合 理由をもとに表示を切り替えたり、アクションを求める struct GenerativeView: View

    { private var model = SystemLanguageModel.default var body: some View { switch model.availability { case .available: // Show your intelligence UI. case .unavailable(.deviceNotEligible): // Show an alternative UI. case .unavailable(.appleIntelligenceNotEnabled): // Ask the person to turn on Apple Intelligence. case .unavailable(.modelNotReady): // The model isn't ready because it's downloading or because of other system reasons. case .unavailable(let other): // The model is unavailable for an unknown reason. } } }
  7. タイトル 最小実装 もっともシンプルな使い方 たった3行! import FoundationModels // セッションを作成 (オプションも指定できる) let

    session = LanguageModelSession() // プロンプトを用意 let prompt = "おいしいパスタ レシピを3ステップで教えて" // 推論を行う let response = try await session.respond(to: prompt)
  8. タイトル Instructions 指定 LanguageModelSession 初期化でinstructionsを渡すことができ、モデル 役割を指定できる • instruction: モデル 役割や振る舞い

    定義 • prompt: そ 役割に基づく具体的な指示 import FoundationModels // セッションを作成 let session = LanguageModelSession(instructions: "あなた プロ 料理人です。美味しいレシピを考えて教えてください。日本語で会話 してください。") // プロンプトを用意 let prompt = "本格的なカルボナーラ レシピを教えてください" // 推論を行う let response = try await session.respond(to: prompt)
  9. タイトル 生成オプション GenerationOptionsでプロンプトからレスポンスを生成する際 オプションを指 定できる • sampling: 生成処理でど ようにトークンを選択するか(もっともらしい /

    ランダム) • temperature: レスポンス 創造性(高いと創造的になる) • maximumResponseToken: レスポンス 最大トークン数 let session = LanguageModelSession() let prompt = "コーヒーについて 物語を書いてください" // 温度をカスタマイズして創造性を高める let options = GenerationOptions(temperature: 1.0) let response = try await session.respond( to: prompt, options: options )
  10. タイトル @Generable struct Recipe { @Guide(description: "レシピ タイトル") let title:

    String @Guide(description: "レシピ 材料") let ingredients: [String] @Guide(description: "レシピ 手順") let steps: [String] @Guide(description: "調理時間分") let cookingTime: Int } ガイド付き生成 デフォルトで モデル 文字列 レスポンスを返すが、@Generableや@Gudieを使 え 、ガイド付きでユーザー定義 データ構造を生成でき 、レスポンス構造 正確 性を保証できる let session = LanguageModelSession() let prompt = "ペペロンチーノ レシピを教えて" // レスポンスをRecipe型として受け取れる let recipe: Recipe = try await session.respond(to: prompt, generating: Recipe.self) print("タイトル: \(recipe.title)") print("調理時間: \(recipe.cookingTime)分") プリミティブ型やそ 配列しか @Generableが使えない
  11. タイトル ツール呼び出し ツール呼び出しと 、モデルが自律的に定義されたカスタム関数を実行できる機 能。モデルが追加情報にアクセスしたり、アクションを実行 したりして、より精度 高いレスポンスを返せる。 struct GetWeatherTool: Tool

    { let name = "getWeather" let description = "Retrieve the latest weather information for a city" @Generable struct Arguments { @Guide(description: "The city to fetch the weather for") var city: String } func call(arguments: Arguments) async throws -> ToolOutput { // Fetch the weather for the given city } } let session = LanguageModelSession( tools: [GetWeatherTool()], instructions: "Help the user with weather forecasts." ) let response = try await session.respond( to: "What is the temperature in Cupertino?" )
  12. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. ???でボクセルモデルを作る 6. 今後 展望 7. まとめ
  13. タイトル まず 作ってみる func generateVoxelModel() async -> VoxelModel? { let

    instructions = """ あなた プロ 3Dモデラーです。 サイズ0.1x0.1x0.1 ボクセルを3D空間内に配置して、指示された条件で複数 ボクセルを組み合わせてボクセルモデルを作ってください """ let session = LanguageModelSession(instructions: instructions) let prompt = """ 以下 条件で「赤い球体」 VoxelModelを作ってください - ボクセルモデル サイズ 1.0x1.0x1.0 - 使えるvoxel 数 制限なし - それぞれ voxelが重ならないように3D空間内に配置すること - Voxel カラー RGBで任意 値を指定できる """ let response = try? await session.respond(to: prompt, generating: VoxelModel.self) return response?.content } まず 以下 ようなinstructions, promptでボクセルモデルを作らせてみる
  14. タイトル @Generable(description: "3D model with voxels") struct VoxelModel: Codable {

    @Guide(description: "Array of voxels") var voxels: [Voxel] } @Generable(description: "Voxel composing the 3D model") struct Voxel: Codable { @Guide(description: "Position of voxel in 3D space") var position: VoxelPosition @Guide(description: "Color of voxel") var color: CubeColor } ボクセルモデル データ定義 @Generable, @Guideを使ってデータモデルも定義 ※SIMD3<Float>, UIColor @Generableにできない で自前で定義 @Generable(description: "Position of voxel in 3D space") struct VoxelPosition: Codable { var x: Float, y: Float, z: Float } @Generable(description: "Color of cube") struct CubeColor: Codable { @Guide(description: "Red component (0-255)") var red: Double @Guide(description: "Green component (0-255)") var green: Double @Guide(description: "Blue component (0-255)") var blue: Double }
  15. タイトル ツールでOpenAI APIを呼び出す Foundation Models単体で厳しいなら、ツール呼び出しでできるも に任せれ 良い で ? ツールでOpenAI

    APIを呼び出してみると、先程より球体っぽくなったが、密度を上 げようとボクセル数を増やすと、コンテキスト上限に引っかかった そうだ!ツール呼び出しでで きるも を呼べ いい Context length of 4096 was exceeded during singleExtend.
  16. タイトル struct VoxelModelTool: FoundationModels.Tool { let name = "VoxelModelTool" let

    description = "Generates a VoxelModel based on input parameters." let generator = VoxelModelGenerator() @Generable struct Arguments { @Guide(description: "The name of voxel model to be generated") var modelName: String @Guide(description: "The size of each voxel") var voxelSize: Float @Guide(description: "The size of voxel model") var modelSize: Float } func call(arguments: Arguments) async throws -> VoxelModel? { let prompt = generator.prompt(modelName: arguments.modelName, voxelSize: arguments.voxelSize, modelSize: arguments.modelSize) return await generateVoxelModel(prompt: prompt) } … }
  17. タイトル struct VoxelModelTool: FoundationModels.Tool { … private func createPrompt(modelName: String,

    voxelSize: Float, modelSize: Float) -> String { """ あなた プロ 3Dモデラーです。 複数 ボクセル(サイズ: \(voxelSize)x\(voxelSize)x\(voxelSize))を3D空間内に配置して、\(modelName) ボクセルモデル(サイズ: \(modelSize)x\(modelSize)x\(modelSize))を作ってください 表面 ボクセル みを、以下 フォーマット JSON文字列で出力してください {"voxels":[{"position":{"x":1.0,"y":2.0,"z":3.0}, "color":{"red":255,"green":0,"blue":0}}, ...]} """ } private func generateVoxelModel(prompt: String) async -> VoxelModel? { // デフォルト 60秒でタイムアウトになりやすかった で 10分に設定 let configuration = OpenAI.Configuration(token: yourOpenAIAPIKey, timeoutInterval: 600) let openAI = OpenAI(configuration: configuration) guard let message = ChatQuery.ChatCompletionMessageParam(role: .user, content: prompt) else { return nil } let query = ChatQuery(messages: [message], model: .gpt5) guard let result = try? await openAI.chats(query: query), let jsonStr = result.choices.first?.message.content, let jsonData = jsonStr.data(using: .utf8) else { return nil } return try? JSONDecoder().decode(VoxelModel.self, from: jsonData) } }
  18. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. OpenAI APIでボクセルモデルを作る 6. 今後 展望 7. まとめ
  19. タイトル OpenAI APIで プロンプト """ あなた プロ 3Dモデラーです。 りんご ボクセルイラストを作って、そ

    イラストを元に高精度で立体的なボクセルモデルを作ってください モデル - ボクセルサイズ: 0.1x0.1x0.1 - それぞれ ボクセルを隙間なく空間内に配置 - モデル全体 サイズ 制限なし 回答 - 表面ボクセル み - JSON文字列 み - フォーマット: {"voxels":[{"position":{"x":0.1,"y":0,"z":0}, "color":{"red":255,"green":0,"blue":0}}, ...]} """
  20. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. OpenAI APIでボクセルモデルを作る 6. 今後 展望 7. まとめ
  21. タイトル カスタムアダプターによる性能向上 今回 結果的にOpenAI APIを使ったが、や りFoundation Models 強み オンデバイスで使える ことで、もっとうまくボクセルモデルを生成できない

    か? ツール呼び出し以外にもカスタムアダプターという機能があり、アダプターを適用 すれ 特定 ユースケースで 他 LLMを上回る性能があるらしい ※Apple Foundation Models Framework Benchmarks and Custom Adapters Training with Datawizzを参照 let adapter = try SystemLanguageModel.Adapter(fileURL: localURL) let adaptedModel = SystemLanguageModel(adapter: adapter) let session = LanguageModelSession(model: adaptedModel)
  22. タイトル カスタムアダプターによる性能向上 カスタムアダプター 詳細なトレーニング方法や使い方 、公式ドキュメント や Unleashing Foundation Modelsという発表を参照 ボクセルモデル生成用

    学習データを用意して、カスタムアダプターを学習させ て適用すれ 、Foundation Modelsでもボクセルモデル生成 精度が上がる ず! Let’s try!
  23. タイトル 目次 1. 自己紹介 2. Foundation Modelsと ? 3. Foundation

    Models 使い方 4. Foundation Modelsでボクセルモデルを作る 5. OpenAI APIでボクセルモデルを作る 6. 今後 展望 7. まとめ
  24. タイトル まとめ • Foundation Models Apple Intelligence LLMをオンデバイスで使え る強力なフレームワーク •

    Foundation Models みで ボクセルモデルを作る 難しく、ツール呼び 出しを活用すれ 、少し 精度向上が見られたが、コンテキスト上限 問題 があった • OpenAI APIを使って、イラストをガイドにすれ 、簡易的なボクセルモデル を生成できた • Foundation Models 強み オンデバイスで使えることで、 カスタムアダプターによる性能向上を試したい
  25. タイトル 参考 • Meet the Foundation Models framework • Deep

    dive into the Foundation Models framework • Foundation Models Framework 概要 • 【WWDC25】 セッションメモ 「Meet the Foundation Models framework」 でApple オンデ バイスLLMについて学ぶ • うさぎでもわかる Apple Foundation Models Framework入門 - WWDC 2025で発表された オンデバイス AI 革命 • Unleashing Foundation Models • Apple Foundation Models Framework Benchmarks and Custom Adapters Training with Datawizz