0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[SwiftUI] 初心者が Foundation Model フレームワークを学んで AIアプリをリリースするまで - その2

Last updated at Posted at 2025-09-24

初心者同然の個人開発者が、WWDC25で発表されていたiOS26対応のFoundation Modelフレームワークについて勉強しながらAIApp開発にむけて勉強し記録として書いています。暖かく見守ってくださいw

間違いがあれば勉強になりますので是非ともコメントいただければ幸いです。

前回までの内容↓

引き続き 公式ドキュメントを元に Foundation Model について勉強をすすめていきたいと思います。

APIによるAIの返答制御

AIに質問をなげるとその都度、違う答えが返ってくることがある。
AIは返答を作成する時一つずつトークンを作成する。各トークンの出現率で文章構成が変わるため返答に違いが出ると言う仕組み。

この出現率の値を指定することでトークンを指定し文章構成にある程度の一環性を持たせることができるというもの。

ゲームなどにおいてはさまざまな返答がゲーム性を高めることもあるが、反対にサンプルやデバック、テストなどにおいては再現性が求められる。

このトークンの選択をサンプリングというらしい。

Swiftでは、AIモデルは回答を生成する際に「サンプリング」という方法を使用して返答内容をコントロールすることで、デモ・プレゼンテーションように予測可能で一貫した出力させたり、反対に安定した品質や高い創造性と多様性の返答させてユーザー体験を大幅に向上させるなどの調整ができる。

そこで用いるのが GenerationOptions API

-公式ドキュメント参照-

GenerationOptions APIのコード例:

// Deterministic output
let response = try await session.respond(
  to: prompt,
  options: GenerationOptions(sampling: .greedy)
)
                
// Low-variance output
let response = try await session.respond(
  to: prompt,
  options: GenerationOptions(temperature: 0.5)
)
                
// High-variance output
let response = try await session.respond(
  to: prompt,
  options: GenerationOptions(temperature: 2.0)
)

まずは一貫性を持たせるコード:

GenerationOptions(sampling: .greedy)

.greedyは特にデモやテストなどの一貫性の返答を持たせるときに有効。
この設定をしておくことで同じプロンプトには同じ返答を返すことができる。

セッションの状態も同じ必要がある。
デバイスモデル・バージョンが同一であることが条件で、OSアップデートでモデルが更新されると、greedyでも結果が変わる可能性があるため考慮は必要。

次に確率の幅を持たせてトークンの選択肢を調整するコード:

GenerationOptions(temperature: 0.5)

0.5~0.8と値が低いほど常に最も確率の高いトークンを選択し安定かつ自然な範囲でのバリエーションに対して、0.8~1.2または2.0と値が大きくなるにつれて低確率のトークンも選択されるがゆえ創造性を最大化できるが反面、過度な多様性により話が噛み合わず自然なコミュニケーションにならない可能性もある。

パフォーマンス考慮をする必要があり、temperatureが高いほど計算コストが増加する場合がある。

ここまでの公式のドキュメントを参考に自分なりにファイルのまとめるとこんな感じ↓

import FoundationModels

// GenerationOptions APIによるAIの返答制御
@available(iOS 26.0, *)
struct SamplingControlDemo {
     // 用途別のサンプリング設定
    enum ResponseType {
        case consistent // 一貫した結果
        case balanced   // バランス型
        case creative   // 創造的
        
        var options: GenerationOptions {
            switch self {
            case .consistent:
                // デモ・プレゼンテーション用,テスト・デバッグ時や一貫性が重要な機能をテストする場合
                return GenerationOptions(sampling: .greedy)
            case .balanced:
                /*
                 temperature (値が小さいほど低変動出力、高ければ高変動出力)
                一般的なアプリ機能に近く、バランスの取れた創造性が必要品質を重視する場合
                 *特徴(確率の高いトークンを優先的に選択、適度なバリエーション安定した品質)
                 */
                return GenerationOptions(temperature: 0.7)
            case .creative:
                /*
                創作・ブレインストーミング用、ユニークなコンテンツ生成多様性を重視する機能
                *特徴(低確率のトークンも選択される。高い創造性と多様性予期しない結果の可能性もあり)
                */
                return GenerationOptions(temperature: 1.5)
            }
        }
    }
    
    static func generateContent(
    prompt: String,
    type: ResponseType
    ) async throws -> String {
        
        let session = LanguageModelSession(instructions: """
            あなたは創造的なアシスタントです。
            """)
        
        let response = try await session.respond(
            to: prompt,
            options: type.options
        )
        
        return response.content
    }
}

今回はここまで。
書き方・解釈に間違いがあれば勉強になりますのでぜひコメントお願いします!

引き続きAIApp開発に向けて勉強した内容をまとめつつ記録していきます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?