Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Creating an English conversation app using the ...
Search
Asakura Shinsuke
June 19, 2026
Technology
1
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Creating an English conversation app using the Foundation Models framework
Asakura Shinsuke
June 19, 2026
More Decks by Asakura Shinsuke
See All by Asakura Shinsuke
Ore Keybord #1
asashin227
0
420
Build AI app with AI agent
asashin227
0
16
ReactNative入門
asashin227
0
63
アウトプットしようね
asashin227
0
32
SwiftUIでキラキラを作る
asashin227
0
83
ローカル拠点でのEMの役割
asashin227
0
280
XcodeCloud移行奮闘記
asashin227
0
130
現場主導の開発効率向上の仕組みづくり
asashin227
0
400
Xcode File templateで 開発をちょっと便利にしたはなし
asashin227
0
110
Other Decks in Technology
See All in Technology
中期計画、2回作ってみた ~業務委託と正社員、両方の視点から~
demaecan
1
740
NAB Show 2026 動画技術関連レポート / NAB Show 2026 Report
cyberagentdevelopers
PRO
0
190
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
120
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
190
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
960
AmazonRoute 53ではじめてのドメイン取得!HTTPS化までの道のりを整理してみた
usanchuu
3
140
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
攻撃者視点で考えるDetection Engineering
cryptopeg
3
1.7k
あなたの AI ワークスペースに、 専門コーダーを連れてくる - Amazon Quick Desktop 最新情報
kawaji_scratch
1
130
SONiC Scale-Up Working Group から探る Scale-UpやUltraEthernet機能の実装方法
ebiken
PRO
2
290
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
970
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
150
Featured
See All Featured
Music & Morning Musume
bryan
47
7.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
Into the Great Unknown - MozCon
thekraken
41
2.6k
Designing Experiences People Love
moore
143
24k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
It's Worth the Effort
3n
188
29k
GraphQLとの向き合い方2022年版
quramy
50
15k
Prompt Engineering for Job Search
mfonobong
0
340
Marketing to machines
jonoalderson
1
5.4k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Transcript
Foundation Models framework で 英会話アプリを作る話 〜 オンデバイスLLMで“無料・オフライン・プライベート”な英会話練習 〜 mobile.stmn #18
/ あさしん(@asashin227) mobile.stmn #18 / 2026-06-19
自己紹介 あさしん @asashin227 株式会社スタメン エンジニアリングマネージャ iOS開発 / Claude Code・AIエージェント /
自作キーボード 最近はオンデバイスAIで英会話アプリを試作中 今日は Apple の Foundation Models で英会話アプリを作った話を LT で mobile.stmn #18 / 2026-06-19 2
作ったもの:オンデバイス英会話アプリ 端末内のLLMと英語で会話して練習 会話 / ロールプレイ / ディベート の複数モード 会話を自動で添削:文法フィードバック・CEFRレベル推定 発音評価・ヒント・学習統計・カリキュラム
… 学習を一通り サーバーに会話を送らない(オンデバイス完結) SwiftUI製。AIは Foundation Models(オンデバイス)で動かしている mobile.stmn #18 / 2026-06-19 3
Foundation Models framework とは Apple が提供する オンデバイスLLM(iOS 26+ / Apple
Intelligence) LanguageModelSession で respond / ストリーミング / 構造化出力 / ツール 前提:iPhone 15 Pro 以降+Apple Intelligence 有効・実機必須 メリット 内容 無料 API課金なし(端末内で推論) オフライン 通信不要で動く プライバシー 会話が端末から出ない 英会話はターン数が膨大 → クラウドAPIだと課金がきつい。オンデバイスが効く mobile.stmn #18 / 2026-06-19 4
availability でデバイスを出し分け(実コード) SystemLanguageModel の可用性を判定して、AI機能の出し方を分岐。 switch SystemLanguageModel.default.availability { case .available: return
.foundationModels // オンデバイスAI が使える case .unavailable(let reason): switch reason { case .modelNotReady: // モデルDL 中 return .downloading case .appleIntelligenceNotEnabled, // AI 無効 .deviceNotEligible: // 非対応端末 return .cloudAPIOnly // → クラウドAPI へ退避 @unknown default: return .cloudAPIOnly } } 「実機必須/未対応端末」をここで吸収して画面・プロバイダを出し分け mobile.stmn #18 / 2026-06-19 5
設計①:system(instructions)と履歴を分離 会話のキャラ崩れ・指示誤応答を防ぐ正しい構造: LanguageModelSession(instructions:) に「モード別のシステム指示」を置く 履歴(Transcript)には実会話だけを入れる アンチパターン:指示文を“最後のユーザー発言”として履歴に混ぜる → 会話崩壊 「指示」と「会話」を混ぜない。generate (単発)と会話ターンも分ける
mobile.stmn #18 / 2026-06-19 6
最小コード:セッション生成 → 応答取得 import FoundationModels // ① セッション生成:system 指示は instructions
に(履歴とは分離) let session = LanguageModelSession( instructions: "You are a friendly English tutor. Reply in simple English." ) // ② ユーザー発話を渡し、モデルに考えさせて応答を受け取る let response = try await session.respond(to: userText) let reply = response.content // モデルの返答テキスト 逐次表示は session.streamResponse(to:) (累積スナップショットが返る) mobile.stmn #18 / 2026-06-19 7
@Generable とは?(guided generation) 「自由テキスト」ではなく “この型で答えて” とモデルに制約をかける仕組み。 構造体に @Generable → その型に沿った出力をモデルが生成
@Guide で各フィールドに説明・制約(値域・列挙など)を与える 受け取りは respond(to:, generating: 型.self).content → 型そのもので返る 利点 JSONパース不要(壊れたJSON・try? の失敗が原理的に起きない) 文字列プロンプトに「JSONで返して」と書かなくてよい 非対応モデルは LanguageModelError.unsupportedGenerationGuide を投げる(黙って劣化し ない) 出力の“形”をコードで保証=AI機能をただのSwiftの型として扱える mobile.stmn #18 / 2026-06-19 8
設計②:@Generable で型安全な構造化出力 構造体に @Generable を付けるだけで、型安全に直接受け取れる(JSONパース不要) @Generable struct GrammarFeedback { @Guide(description:
" 誤りがあれば true") var hasError: Bool var correction: String var explanation: String } // 呼び出し側:型を渡すと、その型で返ってくる let fb = try await session.respond( to: text, generating: GrammarFeedback.self ).content // → GrammarFeedback (誤り箇所・訂正・説明) 数秒かかるので 会話終了後に非同期実行 すればUX影響なし mobile.stmn #18 / 2026-06-19 9
一番ハマった:モデルが“非力” オンデバイスモデルは軽量 → 長く詰め込んだプロンプトほど精度が落ちる。 長い指示・大量の制約を一度に渡すと、指示を無視・的外れな回答に 試行錯誤の末の指針: プロンプトは短く・1タスク1指示に分割 否定の羅列をやめて肯定形で(NEVER… → こう振る舞う、と書く)
構造化出力は @Generable に任せ、指示文から外す 履歴は直近だけ(16件程度)に絞る 「賢いモデル前提の長プロンプト」をそのまま移植すると失敗 → 短く・絞るが正解 mobile.stmn #18 / 2026-06-19 10
対策の実コード:GenerationOptions 出力を短く・安定にして“非力”をカバー(アプリの実コード) 。 guard SystemLanguageModel.default.isAvailable else { throw … }
let options = GenerationOptions( temperature: 0.7, // 既定1.0 は高め → 会話は0.7 が落ち着く maximumResponseTokens: 200 // 長すぎる応答を抑える ) let response = try await session.respond(to: prompt, options: options) temperature / maximumResponseTokens で短く・安定に トークン計測 response.usage ・ model.contextSize も用意あり(本アプリは未使用・シン プル運用) 軽く絞るほどオンデバイスは安定する mobile.stmn #18 / 2026-06-19 11
その他のハマりどころ try? のサイレント失敗:AIが ```json 付きで返すと黙ってデフォルト値に落ちる → @Generable を使えばそもそもJSONパース自体が不要 temperature は既定1.0が高め
→ 会話は 0.7 が落ち着く テストでシミュレータが実モデルを実走し1呼び出し19秒 → Mockをクロージャ注入で0.1秒 に mobile.stmn #18 / 2026-06-19 12
拡張:同じAPIのまま Claude へ(ハイブリッド) Claude for Foundation Models で、同じ LanguageModelSession のままクラウドのClaude
に切替可能 使い分け:軽い会話=オンデバイス/重い処理・Web検索・大コンテキスト=Claude 429(レート制限)時はオンデバイスに退避、という分岐をアプリ側で自動化 ※ Claude for Foundation Models は iOS 27+(ベータ)が前提(要確認) プロバイダ切替UIは隠しつつインターフェースは温存 → 後から足せる設計に mobile.stmn #18 / 2026-06-19 13
コード:429 ならオンデバイスに退避 同じ LanguageModelSession API なので、モデルを差し替えるだけ。 // クラウド(Claude) 用セッション(本番は .proxied
で鍵を埋めない) let claude = LanguageModelSession( model: ClaudeLanguageModel(name: .sonnet4_6, auth: .proxied(headers: headers)) ) do { let reply = try await claude.respond(to: userText).content } catch LanguageModelError.rateLimited { // 429 → オンデバイスに退避(同じAPI ) let reply = try await onDevice.respond(to: userText).content } 重い処理はClaude/レート制限時はオンデバイス、を同じコードで mobile.stmn #18 / 2026-06-19 14
今後の展望:iOS 27 で広がる(WWDC 2026) オンデバイスAIの選択肢が純正で増える。今日の構成の“本命”が来る。 LanguageModel プロトコルが外部モデルに正式対応 → Claude/Gemini 等を同じAPIで(今
日のハイブリッドが本格化) PrivateCloudComputeLanguageModel (Apple純正サーバーモデル) APIキー不要・プロンプト非保存・32Kコンテキスト=オンデバイスで足りない時の純正 エスカレーション先 DynamicProfile :1セッションを状態で切替 → 会話/ロールプレイ/ディベートのモード切替 をきれいに システムツール(OCR / Spotlight=ローカルRAG)→ 教材・履歴を絡めた英会話へ ※ いずれも iOS 27(ベータ・2026 Fall 正式予定) 。要キャッチアップ mobile.stmn #18 / 2026-06-19 15
まとめ mobile.stmn #18 / 2026-06-19
まとめ Foundation Models=無料・オフライン・プライベートなオンデバイスLLM 英会話のような高ターンユースケースと相性が良い 効いた設計 system指示と会話履歴を分離(キャラ崩れ防止) @Generable で型安全な構造化出力(JSONパース不要) 同じAPIのまま Claudeへエスカレーションできる拡張余地
オンデバイスAI、英会話みたいな“喋り続ける”用途にハマります mobile.stmn #18 / 2026-06-19 17
ありがとうございました 質問・ツッコミ歓迎 / @asashin227 mobile.stmn #18 / 2026-06-19