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

Foundation Models と Private Cloud Compute を出荷アプ...

Foundation Models と Private Cloud Compute を出荷アプリで使う ― 薬剤師向け SOAP ノートアプリ SoapVox の実例

薬剤師向けの SOAP ノート作成支援アプリ「SoapVox」の開発を通して得た知見をもとに、Apple の Foundation Models(端末内モデル)と Private Cloud Compute(PCC)を、実際に出荷しているアプリでどう使っているかをまとめました。

SoapVox は、薬剤師の独り言を録音し、端末内で文字起こししてから、SOAP 形式の下書きを作るアプリです。この資料では、下書きを作る部分のコードと、その判断の根拠にした実測値を紹介します。

・端末内モデルの呼び出し方(greedy で出力を固定する/出力の上限を入力の残りから計算する)
・PCC はモデルを差し替えるだけで使えること。使う前に実行時に確かめる 3 点(availability / supportsLocale / contextSize)
・reasoningLevel の指定と、.deep にしても網羅率は 88.4% → 89.5% にとどまった実測
・「端末内のみ」の設定をいちばん先に判定する利用条件と、生成に失敗したときに端末内へ戻す設計
・@Generable で項目ごとに事実を抜き出す方式をやめ、文章を 1 回で書かせてアプリ側で S/O/A/P に分ける方式へ変えた理由(A 欄が空になった件数は 16/16 → 0/16)
・長い入力を 2,000 字ずつ割ると、事実が 83〜96% 残ったこと
・付録:ガードレールの誤検知を、設定を変えた再試行で回避する方法

最後に、ダウンロード数の伸び悩みも正直にお見せしています。ヒントをいただけたらうれしいです。

Avatar for Takafumi Mizuguchi

Takafumi Mizuguchi

October 25, 2026

More Decks by Takafumi Mizuguchi

Other Decks in Programming

Transcript

  1. Soa pV ox の 実 装か ら Foundation Models と

    PCC の使い方 薬剤師の独り言を SOAP ノートにする、iOS アプリの実例 2026年10月24日 DevSap勉強会 水口貴史
  2. 自己紹介 水口貴史 (X: @Guttyo) 北海道大学病院薬剤部 薬剤師 製剤室(抗がん剤の調製) iOSアプリ HAC KATHON

    2026.04 Built with Opus 4.7 Cerebral Valley × Anthropic 主催 期間 4月21〜26日(6日間) ルール 期間中に書いたコードだけで ゼロから作る 道具 Claude Opus 4.7 + Claude Code お題 Build for what you know (知っていることで作る) 調剤電卓(2011年) CTCAE v4 JCOG(2014年)、v5 (2025年) Yorukusu (夜薬)(ハッカソン用) SoapVox(2026年)← 今日の主役 薬剤師歴17年・iOS開発は2010年から
  3. Yorukusu(和名:夜薬神) 深夜の発熱に「呼ぶ・行く・待つ」を返すiPhoneアプリ 124万件 小児救急電話相談(#8000)の年間相談件数。 夜中の「どうしよう」は日本だけで年百万回以上(2023年度) CALL GO WAIT 救急・相談窓口へ電話 薬剤師のいる薬局へ

    様子見+悪化サインを提示 1 薬剤師が書いた Skill 判断ルールを SKILL.md(Markdown)で公開。誰でも中身を監査できる 2 推論は Opus 4.7 だけ 軽いモデルに落とさず、思考量で速さを調整。赤旗の見落としを避ける 3 診断はしない 「Yorukusu does not diagnose」を全画面に明記。健康情報は端末内に保存 Demo youtu.be/FdMz9ZeP1Dg · Code github.com/Guttyo/yorukusu(MIT) ※架空の家族・薬局のデモデータ
  4. F ound ation Models と PCC の 使 い方 アジェンダ

    01 はじめに 02 呼び出し方 03 使う条件と工夫 04 おまけ 05 まとめと、お願い SoapVox と、使う 2 つのモデル(端末内 ・ PCC) 端末内 ・ PCC ・ 推論の深さ(例 1〜3) PCC を使う条件 ・ プロンプト ・ 長い入力(例 4〜6) Apple の公式ドキュメントを .md で読む 持ち帰ること ・ 実績 ・ ハッカソンの紹介
  5. SoapVox 服薬指導後の振り返りを、 SOAP 薬歴の下書きに iPhone・iPad / iOS 27 以降 /

    基本機能は無料 App Store でダウンロード apps.apple.com/jp/app/soapvox/id6761394388 apps.apple.com/jp/app/soapvox/id6761394388
  6. Soa pV ox と は 録音から SOAP の下書きまで、1 台で 1

    2 3 ・ 今日の主役 4 録音 文字起こし SOAP の下書き 薬剤師が確認 薬剤師の 独り言 SpeechAnalyzer 端末内で処理 Foundation Models または PCC 下書きは 必ず人が見る SOAP = S 主観・O 客観・A 評価・P 計画 に分けて書く、記録の形式 患者データは、既定では端末の外に出しません。 PCC を使うのは、利用者がオンにしたときだけです。 Foundation Models と PCC ・ SoapVox
  7. 基 本 ・ 後 か ら読 む 人 へ PCC(Private

    Cloud Compute)とは Apple のサーバで Apple のモデルを動かし、端末の中と同じ考え方でプライバシーを守る仕組み。 何をするものか 使える端末(利用者側) 開発者の資格 ・Apple シリコンのサーバで動く、Apple Intelligence のモデル ・Apple Intelligence 対応端末で、iOS 27 / iPadOS 27 / macOS 27 ・App Store Small Business Program に 登録している ・処理が終わればデータは残さない。ログ にも残さない ・iPhone 15 Pro・15 Pro Max、iPhone 16 以降 ・配信中のどのアプリも、初回ダウンロー ドが 200 万回未満 ・Apple の社員も中身を見られない ・iPad mini(A17 Pro)、M1 以降の iPad と Mac ・PCC のエンタイトルメント(申請制)が アカウントに付いている ・日本語に対応。中国本土で購入した端末 などは使えない ・満たせば、クラウド API の費用はかから ない ・ネット接続が要る。1 日あたりの上限が あり、iCloud+ で増やせる ・外れたら通知が来て、6 か月以内に別の 手段へ移る ・アプリからは Foundation Models で、 モデルを差し替えて呼ぶ(iOS 27 から) 端末内 PCC コンテキスト 4K ※ 32K オフライン 使える 使えない 利用上限 なし 1 日ごと 推論 なし 3 段階 ・TestFlight・Ad Hoc で試せる(ダウン ロード数に数えない) ※ Apple の公式記事の値。iPhone Air・17 Pro・17 Pro Max は上位の端末内モデル(AFM 3 Core Advanced)で動く(Apple 社員の回答)。8K という報告もあるが Apple の文書では 未確認。値は contextSize で実行時に読む。 出典(2026-10-25 確認): developer.apple.com/jp/private-cloud-compute ・ security.apple.com/blog/private-cloud-compute ・ Foundation Models「Adding server-side intelligence with Private Cloud Compute」・ support.apple.com/ja-jp/121115 ・ developer.apple.com/forums/thread/843063
  8. デ モ ・ 録 音 する サ ン プ ル

    薬剤師の独り言(約 200 字) 心不全で入院中の80代女性。 持参薬のアムロジピン5ミリが、残薬が3日分しかないと分かりました。 本人は、飲み忘れはないと話しています。 むくみは軽くなっていて、体重は昨日より0.5キロ減の48.2キロ。 血圧は118の64です。 利尿薬の効果が出ていて、心不全は改善傾向と評価しました。 ご本人は、退院を楽しみにされています。 退院後の薬の管理が心配なので、家族と飲み方を確認して、一包化を主治医に相談します。 ▪ 数値 ▪ 否定 (保存前の検査が確認するところ) 架空の内容です。実在の患者さんの情報は含みません。
  9. デ モ ・ 文 字 起こ し 実機の文字起こし(両方にこの文を渡した)※発表中実演 心不全で入院中の 80代女性、実際役のアムロジピン

    5ミリが罪薬が 3日しかないとわかりました。本人は 飲みれ忘れはないと言ってるんですけど、言ってます。でむくみは軽くなっていて、体重は昨日より 0.5キ ロ減って 48.2キロでした。 血圧は 118-64です。利尿剤の効果が出ていて、心不全は改善傾向と評価されて います。本人は楽し退院を楽しみにされています。退院後の薬の管理が心配なので、家族と飲み方を確認し てお薬の一方化を主治医に相談したいと思います。 ▪ 聞き違い(正しくは 持参薬・残薬・飲み忘れ・一包化) 先に端末内処理で生成し、同じ文字起こしを貼り付けて PCC でも生成しました。 架空の内容です。実在の患者さんの情報は含みません。
  10. デモ ・ 結果 同じ文字起こしを、端末内と PCC で 端末内処理 Foundation Models 高精度モード

    PCC △ 残薬 3 日が「3日しか服用 できない」に変わった △ 同じ計画を S と P に 3 回 書いた 〇 数値 5 つが O に並んだ 〇 「罪薬」を「残薬」と書き、 「実際役」は書かなかった △ 「一方化」を「一元化」と △ P に、入力に無い「用法用 量や副作用の説明を確認」が 出た 書いた(正しくは一包化) △ 「むくみ」「退院を楽しみ に」が抜けた △ 「実際役」「一方化」をそ 〇 A に「残薬が少ない・退院 後の服薬管理が課題」まで出 た のまま書いた 〇 計画は P に分かれた 〇 数値と「飲み忘れはない」 は残った 数値と否定は、どちらにも残った。差が出たのは、意味と置き場所と、入力に無い言葉。 入力は同じ文字起こし(端末内 16:13 → 同じ文を貼り付けて PCC 16:15)。それぞれ 1 回の結果です。 〇 「飲み忘れはない」「退院 を楽しみに」が S に入った
  11. 使 う モデ ル モデルは 2 つ。呼び方は同じ 比較 端末内(Foundation Models)

    PCC(Private Cloud Compute) 処理する場所 端末の中 Apple のサーバ 入出力の枠 約 4K トークン 約 32K トークン 呼び出し LanguageModelSession LanguageModelSession 入出力の枠 = 一度に扱える量(コンテキスト)。トークンは、文字数とは別の単位です。 呼び出しは同じで、違いは、渡すモデルだけです。 Foundation Models と PCC ・ SoapVox
  12. 例 1 ・ 端 末 内の 呼 び 出 し

    端末内モデルは、数行で呼べる let session = LanguageModelSession() let response = try await session.respond( to: prompt, options: GenerationOptions( samplingMode: .greedy, maximumResponseTokens: reserved ) ) 実コードを簡略化 ・ SOAPGenerationService より 出力を固定する greedy:同じ入力は 同じ出力。測定が揺れない 出力の上限を決める reserved:入力の残りから 計算。4K を溢れさせない
  13. 例 2 ・ PCC の 呼 び出 し PCC は、モデルを差し替えるだけ

    // 端末内 使う前に、実行時に 3 つ確認 let session = LanguageModelSession() availability // PCC(iOS 27 実機) いま使える状態か let session = LanguageModelSession( model: PrivateCloudComputeLanguageModel() supportsLocale ) 日本語に対応しているか contextSize 約 32K。直書きしない その後の respond は、端末内と同じです。 実コードを簡略化 ・ PCCAvailabilityService より
  14. 例 3 ・ PCC だ け の指 定 推論の深さを、3 段階で指定できる

    let response = try await session.respond( to: prompt, contextOptions: ContextOptions( reasoningLevel: .moderate ) ) .light 待ち時間が短い .moderate まず、ここから評価する .deep 複雑な課題向け。遅い SoapVox の実測では、.deep でも網羅率は 88.4% → 89.5%。 A 欄が空の件数は 5 件のまま。公開されているアプリでは、指定なしです。(Appleにお任せ) コードは Apple 公式を簡略化 ・ 実測は旧経路の抽出段 ・ Mac ・ 1 回(.moderate は未測)
  15. 例 4 ・ 使 う 条件 「端末内のみ」の設定を、いちばん先に判定する guard !onDeviceOnlyLocked else

    { return false } 「端末内のみ」を選んだら使わない guard userEnabled else { return false } 利用者がオンにしていなければ使わない guard availability == .available else { return false } 端末が使える状態でなければ使わない guard !isQuotaLimitReached else { return false } 1 日の上限に達していたら使わない return true すべて通れば PCC で生成する false はエラーではなく、「端末内で処理する」という意味です。 生成に失敗したときも、端末内へ自動で落とします。 HighAccuracyModeResolver.shouldUsePCC より(引数名のまま)
  16. PCC失敗は4種類。A〜Cは端末内へ、Dは打ち切り A|ガードレール B|拒否 C|PCC側の障害 D|レート制限 入力の内容で弾かれる モデルが生成を断る クォータ・通信・サービス 背面で生成が止まる エラー

    エラー エラー quotaLimitReached / networkFailure / serviceUnavailable エラー guardrailViolation refusal ログ Safety guardrail was triggered. ログ Model refused to generate content 対応 対応 端末内へ落とす 実測 16件中7件。同じ入力 で毎回再現。理由は未解明 端末内へ落とす 対応 端末内へ落とす 実測 未知の入力24件中3件 。AとBの内訳は未切り分け 実測 ログでの発生は未確認 rateLimited 対応 端末内へ落とさず打ち 切り。一覧に出して前景で再 試行 実測 2026-09-23 実機。PCC もオンデバイスも同じ予算で 弾かれた 出典: Docs/dev-logs/2026-09-16-ios26-to-27-foundation-models.md(追記6)/ SoapVox/Application/SOAPGenerationService.swift:2192/ Docs/T/T188
  17. 例 5 ・ プ ロ ンプ ト SOAP を丸ごと書かせ、4 つに分けるのはアプリで

    旧:項目ごとに抜き出させる 新:SOAP を丸ごと書かせる 1 AI が事実を 1 件ずつ抜き出す(@Generable) 1 依頼文で SOAP 形式を指定して、1 回だけ頼む 2 1 件ずつ「薬剤師の判断」などの印を付ける 2 AI が見出し付きの文章を書いて返す 3 アプリが印を見て S / O / A / P に振り分ける 3 アプリが見出しの位置で 4 つに切る × iOS 27 は「薬剤師の判断」の印をほぼ付けない → A に入る事実が 1 件も届かない A 欄が空の件数 16 / 16 依頼文(抜粋) 「…SOAP形式(S(主観的情報)、O(客観的情報)、 A(評価)、P(計画))で出力してください。」 A 欄が空の件数 0 / 16 保存前の検査を全部通った記録も、3 件 → 10 件(端末内)/ 15 件(PCC)に増えた 検査:原文にない薬剤名・数値・否定が混ざっていないか。引っかかっても捨てず、要確認で残す iPhone 16 Pro ・ iOS 27.0 ・ 固定の 16 件で測定(2026-09-17)
  18. 例 6 ・ 長 い 入力 長い入力は、2,000 字ずつ割って渡す 入力に含めた事実のうち、下書きに残った割合 96%

    92% 83% 75% 一括で書かせると 42% 36% 長いほど事実が落ちる。 特に否定 2,000 字ずつ分割すると 83〜96% が残る 4,469 字 8,958 字 一括 分割(2,000 字ずつ) 事実は 12 / 24 / 36 個を仕込んだ。架空の口述 ・ PCC ・ Mac で測定 13,450 字
  19. おまけ ・ 調べ方 Apple の公式ドキュメントは、末尾に .md で Markdown // ふつうの

    URL(HTML のページ) developer.apple.com/documentation/foundationmodels/languagemodelsession // 末尾に .md を付ける(Markdown が返る) developer.apple.com/documentation/foundationmodels/languagemodelsession.md Markdown で返る AI に読ませやすい 一次情報で確認 見出し・コード・ AI に URL を渡して、 モデルや API の仕様を リンクがそのまま そのまま読ませる 公式で確かめる LanguageModelSession のページで確認(2026-10-24)
  20. 需 要 の根 拠 薬歴の音声入力は、他社も本格展開している 株式会社カケハシ ・ クラウド型電子薬歴「Musubi」 SoapVox 「AIアシスタントー音声薬歴生成機能ー」

    病院薬剤師版 2026/5/11 ・ 標準機能として、全ユーザーへ展開 服薬指導の音声を、生成 AI が薬歴の下書きに書き起こす 録音は 2 モード:患者さんとの対話 / 薬剤師の一人語り 追加費用なし(要申込 ・ ブラウザ版のみ) 出典:株式会社カケハシのニュースリリース(2026-05-11) kakehashi.life/news-post/20260511 無料で使える 病院薬剤師向けの、単体のアプリ 端末内で処理。既定では端末の外に 出さない
  21. こ こ から は 、 お 願 いで す 26

    週間のダウンロードは、61 ユニット ユニット数(App Store Connect) 61 26 週間(4/20〜10/18) 週平均 2 山は 1 回だけ。あとは、ほぼ横ばい。 App Store Connect のトレンド(実際の画面)
  22. こ こ から は 、 お 願 いで す 「薬歴」で検索すると、広告の次の

    1 位 でも、その言葉で検索する人は、 ほぼいない。 評価 5.0(1 件) ・ バージョン 1.2.1 ・ 仕事効率化 App Store の実際の画面
  23. 最 後 に ・ ハ ッ カソ ン の 紹

    介 Built with Claude: Japan 2026 主催 Cerebral Valley ・ Anthropic QR ハ コ ー ッ ド カ ソンのページへの 期間 11/2(月) 12:00 〜 11/10(火) 14:00(日本時間) 形式 完全オンライン ・ 日本在住の方が対象 ・ 選考あり 規模 250 名 ・ チームは最大 2 名(全員が応募・選考) 特典 全員に Max 5x プラン + API クレジット $500 賞 入賞者に API クレジット 総額 $50,000(約 800 万円) 締切 10/26 23:59(日本時間) cerebralvalley.ai/e/built-with-claude-japan2026 詳細・応募はこちら
  24. 付 録 ・ PCCの ガ ード レ ー ル 言い換えで直らないときは、設定を変えて再試行

    let model = SystemLanguageModel( useCase: .general, guardrails: .permissiveContentTransformations ) 1. 通常の設定で拒否 16 件中 1〜2 件が誤検知 固定の 1 件で言い回し 4 通りを試し、すべて拒否 2. 緩和モードで再試行 3. 下書きを生成 変換用途向けの設定 完走 15/16 → 16/16 端末内で処理する String 生成のみ ・ 実機は未確認 試した 4 通り:現行 / 話し手を中立に / ドメイン語を避ける / 英語の指示文 PCC 経路を含む Mac での測定 ・ 言い換えの試験は PCC で 1 件のみ ・ @Generable には効かない