すべての記事

スマートフォンのローカル Agent 向けモデルをどう評価したか

全 96 件の二言語ケースと期待ルートを含め、構造化指標、固定デコード、iPhone 測定、再現証拠、結果の限界まで公開します。

オンデバイスAI評価手法Agent評価モバイル推論LLM
スマートフォンのローカル Agent 向けモデルをどう評価したか

このテストは、モデルの順位表を作るために始めたものではありません。

最初にあったのは、もっと具体的な問題でした。スマートフォン上のローカル Agent には、デフォルトで使うルーティングモデルが 1 つ必要です。そのモデルには会話だけでなく、短時間で要求を理解し、適切な機能を選び、実行パラメータを取り出し、情報が足りなければ質問して止まることが求められます。同時に、8K context を有効にしてもメモリや発熱が現実的な範囲に収まらなければなりません。

検証したかったのは、次の問いです。

二言語・構造化・オンデバイスという現在の Agent ワークフローで、現実的なリソース消費のまま、ルーティングと実行パラメータを最も安定して生成できるモデルはどれか。

これは重要な限定です。一般知能、文章力、数学、知識問題の順位を測っているわけではありません。製品開発上の選択に答えるテストです。

Agent の仕事を先に分解する

「明日の朝 7 時に起こして」という依頼を実行するまでに、Agent は少なくとも 2 段階の判断をします。

まず、現在利用できる機能から正しい Skill を選びます。アラーム、カレンダー、メール、メモリなどです。次に Skill 内の Action を選び、既知のパラメータと不足しているパラメータを整理し、実行するか、計画するか、確認質問を返すかを決めます。

Flow diagram Preparing diagram
View diagram source
flowchart LR
    A[ユーザーの依頼] --> B[候補 Skill の検索]
    B --> C[Stage 1: Skill 選択]
    C --> D[Stage 2: Action とパラメータ]
    D --> E{情報は十分か}
    E -->|十分| F[実行または計画]
    E -->|不足| G[構造化された確認]
    F --> H[Swift Runtime の検証]
    G --> H

もっともらしい文章を書かせ、雰囲気で採点することはしません。評価器は Skill、Action、Mode、既知 Slots、不足 Slots、目標を明示した構造を要求します。その後、Swift Runtime が候補範囲と現在の Schema に適合しているかを決定的なルールで確認します。

システム機能を扱う Agent にとって、「だいたい理解した」は実行保証になりません。Action の選択ミスと必須パラメータの欠落は別の失敗であり、両方を見えるようにする必要があります。

96 件の構成

モデル比較には v3-96-staged-skill-action データセットを使っています。

観点構成
言語中国語 48 件、英語 48 件
Skill12 種類
難易度core 48 件、challenge 48 件
プロトコル2 段階 Skill → Action/Slots/Mode
Context4K と 8K で全件実行

core はアラーム作成、予定確認、メール下書きなど、よくある表現を扱います。challenge では、似た Skill の混在、必須情報の不足、複数機能にまたがる計画、曖昧な言い方を加えています。

短い入力も意図的に残しました。スマートフォンへの指示は数語で終わることが珍しくありません。テスト問題のように整った文章でしか安定しないモデルは、実際の製品では使いにくいからです。

各ケースには期待する Skill、Action、Mode と構造上の制約があります。公開精度の分母は常に 96 件です。Parse に失敗したケースを精度計算から外すことはありません。

96 件のテストケースと期待結果

以下の期待結果は最終的な自然言語回答ではなく、モデルが Runtime に渡すルーティング契約です。各ケースで Skill、Action、Mode を個別に照合します。追加条件は、不足 Slots の空/非空、または計画必須を表します。

3 つの具体的な採点例

  • 情報が完全Set an alarm for 7 AM tomorrow.

builtin.alarm.manage → create_alarm、Mode は actmissing_slots は空であること。

  • 情報が不足Create an email draft for me.

builtin.mail.draft → create_draft、Mode は clarifymissing_slots は空でないこと。メール Schema は宛先、件名、本文を必須とします。

  • 複数ステップFirst inspect tomorrow's calendar, then create reminders for unresolved items.

builtin.task.plan_recover → orchestrate、Mode は actrequires_plan = true

現在の v3 には制限もあります。不足 Slots は空か非空かだけを採点し、すべての不足フィールド名を正しく列挙したかは個別採点していません。正確な Slot 名と値は次版の契約テストに追加します。

Core:48 件の基本ケース

# / Case ID言語テスト入力期待 Skill → ActionMode追加条件
1 · zh-alarm-create中国語明天早上七点设置一个起床闹钟builtin.alarm.managecreate_alarmact不足:空
2 · zh-alarm-list中国語查看我在 Vesta 里创建的所有闹钟builtin.alarm.managelist_alarmsretrieve
3 · en-alarm-create英語Set an alarm for 7 AM tomorrow.builtin.alarm.managecreate_alarmact不足:空
4 · en-alarm-list英語List all alarms currently managed by Vesta.builtin.alarm.managelist_alarmsretrieve
5 · zh-schedule-event中国語明天下午三点在 A 会议室安排项目评审,持续一小时builtin.schedule.managecreate_calendar_eventact不足:空
6 · zh-schedule-reminder中国語提醒我周五下午六点提交周报builtin.schedule.managecreate_reminderact不足:空
7 · en-schedule-event英語Create a calendar event for project review tomorrow at 3 PM for one hour.builtin.schedule.managecreate_calendar_eventact不足:空
8 · en-schedule-reminder英語Remind me Friday at 6 PM to submit the weekly report.builtin.schedule.managecreate_reminderact不足:空
9 · zh-brief-today中国語汇总我今天的日程和未完成提醒builtin.daily.briefingsummarize_scheduleretrieve
10 · zh-brief-conflict中国語看看本周安排里有没有冲突和逾期事项builtin.daily.briefingsummarize_scheduleretrieve
11 · en-brief-today英語Summarize today's calendar and unfinished reminders.builtin.daily.briefingsummarize_scheduleretrieve
12 · en-brief-overdue英語Show my schedule conflicts and overdue reminders this week.builtin.daily.briefingsummarize_scheduleretrieve
13 · zh-general-explain中国語解释一下什么是最终一致性builtin.general.answeransweranswer
14 · zh-general-howto中国語如何安全地删除一个文件?只需要解释步骤builtin.general.answeransweranswer
15 · en-general-explain英語Explain eventual consistency in simple terms.builtin.general.answeransweranswer
16 · en-general-howto英語How do I delete a file safely? Explain only.builtin.general.answeransweranswer
17 · zh-knowledge-cite中国語根据我的本地项目文档,发布日期是什么?请引用来源builtin.knowledge.answeranswer_from_knowledgeretrieve
18 · zh-knowledge-summary中国語总结我导入的合同里关于违约责任的内容builtin.knowledge.answeranswer_from_knowledgeretrieve
19 · en-knowledge-cite英語Search my local documents for the launch date and cite the source.builtin.knowledge.answeranswer_from_knowledgeretrieve
20 · en-knowledge-compare英語Compare the pricing terms in my two imported contracts.builtin.knowledge.answeranswer_from_knowledgeretrieve
21 · zh-connected-contact中国語查一下通讯录里 Alex 的电话号码builtin.connected.contextanswer_from_sourceretrieve
22 · zh-connected-web中国語总结这个网页的内容:https://example.com/reportbuiltin.connected.contextanswer_from_sourceretrieve
23 · en-connected-mail英語Look in my Gmail for the latest message from Alex.builtin.connected.contextanswer_from_sourceretrieve
24 · en-connected-location英語What city am I currently in?builtin.connected.contextanswer_from_sourceretrieve
25 · zh-document-import中国語选择并导入这份 PDF 到本地知识库builtin.document.ingestimport_documentact
26 · zh-document-ocr中国語识别我选择的图片文字并录入知识库builtin.document.ingestscan_documentact
27 · en-document-import英語Import the selected PDF into my local knowledge base.builtin.document.ingestimport_documentact
28 · en-document-ocr英語Run OCR on the selected image and add it to the knowledge base.builtin.document.ingestscan_documentact
29 · zh-memory-remember中国語记住我不喜欢订阅制软件builtin.memory.governancerememberact不足:空
30 · zh-memory-forget中国語忘记我之前保存的语言偏好builtin.memory.governanceforgetact
31 · en-memory-list英語Show the long-term preferences you remember about me.builtin.memory.governancelist_memoriesretrieve
32 · en-memory-remember英語Remember that I prefer one-time purchases.builtin.memory.governancerememberact不足:空
33 · zh-mail-complete中国語给 Alex 起草邮件,主题是周会,正文写明改到周五下午三点builtin.mail.draftcreate_draftact不足:空
34 · zh-mail-missing中国語帮我起草一封邮件builtin.mail.draftcreate_draftclarify不足:非空
35 · en-mail-complete英語Draft an email to Alex with subject Weekly Sync and say it moved to Friday at 3 PM.builtin.mail.draftcreate_draftact不足:空
36 · en-mail-missing英語Create an email draft for me.builtin.mail.draftcreate_draftclarify不足:非空
37 · zh-runtime-contract中国語检查 Vesta 当前的 Runtime 和安全执行契约builtin.runtime.inspectinspect_runtimeretrieve
38 · zh-runtime-mcp中国語列出本机 MCP Runtime 当前暴露的能力builtin.runtime.inspectinspect_runtimeretrieve
39 · en-runtime-contract英語Inspect Vesta's current runtime and safety contract.builtin.runtime.inspectinspect_runtimeretrieve
40 · en-runtime-mcp英語Show the capabilities exposed by the local MCP runtime.builtin.runtime.inspectinspect_runtimeretrieve
41 · zh-plan-sequence中国語先查看明天日程,然后为没有空闲时间的事项创建提醒builtin.task.plan_recoverorchestrateact計画必須
42 · zh-plan-breakdown中国語把准备发布会这件事拆成可验证的步骤并跟踪进度builtin.task.plan_recoverorchestrateact計画必須
43 · en-plan-sequence英語First inspect tomorrow's calendar, then create reminders for unresolved items.builtin.task.plan_recoverorchestrateact計画必須
44 · en-plan-breakdown英語Break down the product launch preparation into verifiable steps and track progress.builtin.task.plan_recoverorchestrateact計画必須
45 · zh-data-export中国語导出并加密备份我的全部 Vesta 本地数据builtin.data.portabilityexport_packageact
46 · zh-data-restore中国語从这个 vestaexport 数据包选择性恢复记忆和任务builtin.data.portabilityrestore_packageact
47 · en-data-export英語Export an encrypted backup of all my local Vesta data.builtin.data.portabilityexport_packageact
48 · en-data-inspect英語Inspect this Vesta backup package without restoring it.builtin.data.portabilityinspect_packageretrieve

Challenge:48 件の境界ケース

# / Case ID言語テスト入力期待 Skill → ActionMode追加条件
49 · challenge-zh-alarm-recurring中国語每个工作日早上八点半叫我起床builtin.alarm.managecreate_alarmact不足:空
50 · challenge-zh-alarm-query中国語我明早有设叫醒铃吗?builtin.alarm.managelist_alarmsretrieve
51 · challenge-en-alarm-recurring英語Wake me at 6:45 every weekday.builtin.alarm.managecreate_alarmact不足:空
52 · challenge-en-alarm-query英語Do I have a wake-up alarm tomorrow morning?builtin.alarm.managelist_alarmsretrieve
53 · challenge-zh-schedule-create中国語下周一上午十点留半小时和产品经理同步builtin.schedule.managecreate_calendar_eventact不足:空
54 · challenge-zh-schedule-delete中国語删除明天下午由 Vesta 创建的牙医提醒builtin.schedule.managedelete_reminderact
55 · challenge-en-schedule-create英語Put lunch with Sam on my calendar at noon Tuesday.builtin.schedule.managecreate_calendar_eventact不足:空
56 · challenge-en-schedule-delete英語Cancel the Vesta reminder to pay rent.builtin.schedule.managedelete_reminderact
57 · challenge-zh-brief-tomorrow中国語我明天有哪些会和待办,按时间排一下builtin.daily.briefingsummarize_scheduleretrieve
58 · challenge-zh-brief-load中国語这周哪几天的安排最满?builtin.daily.briefingsummarize_scheduleretrieve
59 · challenge-en-brief-morning英語Give me a morning briefing from my calendar and reminders.builtin.daily.briefingsummarize_scheduleretrieve
60 · challenge-en-brief-load英語Which days this week are overloaded?builtin.daily.briefingsummarize_scheduleretrieve
61 · challenge-zh-general-rewrite中国語把这句话改得更礼貌:你写错了builtin.general.answeransweranswer
62 · challenge-zh-general-calculate中国語计算 240 的 18% 是多少builtin.general.answeransweranswer
63 · challenge-en-general-rewrite英語Rewrite this more politely: You are wrong.builtin.general.answeransweranswer
64 · challenge-en-general-howto英語How can I set an alarm on iPhone? Explain the steps only.builtin.general.answeransweranswer
65 · challenge-zh-knowledge-policy中国語从已经收录的报销制度里找出打车标准builtin.knowledge.answeranswer_from_knowledgeretrieve
66 · challenge-zh-knowledge-compare中国語对比知识库中两份方案的风险章节builtin.knowledge.answeranswer_from_knowledgeretrieve
67 · challenge-en-knowledge-policy英語According to documents already in my library, what is the reimbursement limit?builtin.knowledge.answeranswer_from_knowledgeretrieve
68 · challenge-en-knowledge-summary英語Summarize the termination clause from the contract I previously imported.builtin.knowledge.answeranswer_from_knowledgeretrieve
69 · challenge-zh-connected-web中国語打开并概括这个链接:https://example.com/briefbuiltin.connected.contextanswer_from_sourceretrieve
70 · challenge-zh-connected-outlook中国語在 Outlook 里找 Alex 最新发来的邮件builtin.connected.contextanswer_from_sourceretrieve
71 · challenge-en-connected-contact英語Find Jordan's phone number in my contacts.builtin.connected.contextanswer_from_sourceretrieve
72 · challenge-en-connected-web英語Read and summarize https://example.com/brief.builtin.connected.contextanswer_from_sourceretrieve
73 · challenge-zh-document-scan中国語把我刚选的扫描件 OCR 后加入资料库builtin.document.ingestscan_documentact
74 · challenge-zh-document-word中国語导入这个 Word 文件并建立本地索引builtin.document.ingestimport_documentact
75 · challenge-en-document-photo英語Extract text from this selected photo and save it to my local library.builtin.document.ingestscan_documentact
76 · challenge-en-document-sheet英語Add the selected spreadsheet to my local documents.builtin.document.ingestimport_documentact
77 · challenge-zh-memory-remember中国語以后回答尽量简短,请记住这个偏好builtin.memory.governancerememberact不足:空
78 · challenge-zh-memory-list中国語列出你长期保存的关于我的偏好builtin.memory.governancelist_memoriesretrieve
79 · challenge-en-memory-forget英語Forget that I prefer dark mode.builtin.memory.governanceforgetact
80 · challenge-en-memory-update英語Change my saved language preference to Chinese.builtin.memory.governancerememberact
81 · challenge-zh-mail-complete中国語给财务起草邮件,说明发票将在周五补交builtin.mail.draftcreate_draftact不足:空
82 · challenge-zh-mail-missing中国語写封邮件通知项目延期builtin.mail.draftcreate_draftclarify不足:非空
83 · challenge-en-mail-complete英語Draft an email to finance saying the invoice will arrive Friday.builtin.mail.draftcreate_draftact不足:空
84 · challenge-en-mail-missing英語Write an email announcing the delay.builtin.mail.draftcreate_draftclarify不足:非空
85 · challenge-zh-runtime-sources中国語检查 Vesta 当前授权了哪些数据源builtin.runtime.inspectinspect_runtimeretrieve
86 · challenge-zh-runtime-tools中国語查看本地执行器现在注册了哪些工具builtin.runtime.inspectinspect_runtimeretrieve
87 · challenge-en-runtime-tools英語Which tools are currently registered in the local runtime?builtin.runtime.inspectinspect_runtimeretrieve
88 · challenge-en-runtime-write英語Check whether this runtime is allowed to execute write operations.builtin.runtime.inspectinspect_runtimeretrieve
89 · challenge-zh-task-sequence中国語先找出今天逾期的事项,再逐项建立新的提醒builtin.task.plan_recoverorchestrateact計画必須
90 · challenge-zh-task-resume中国語继续上次中断的发布准备任务并从失败步骤恢复builtin.task.plan_recoverrecoveract計画必須
91 · challenge-en-task-sequence英語Review today's overdue items first, then create a reminder for each one.builtin.task.plan_recoverorchestrateact計画必須
92 · challenge-en-task-resume英語Resume the interrupted launch task from its failed step.builtin.task.plan_recoverrecoveract計画必須
93 · challenge-zh-data-inspect中国語只检查这个备份包里有什么,不要恢复builtin.data.portabilityinspect_packageretrieve
94 · challenge-zh-data-export中国語把知识库和长期偏好导出成加密数据包builtin.data.portabilityexport_packageact
95 · challenge-en-data-restore英語Restore only memories from this Vesta export package.builtin.data.portabilityrestore_packageact
96 · challenge-en-data-inspect英語Verify this backup archive without importing anything.builtin.data.portabilityinspect_packageretrieve

何を採点するか

弱点を別の長所で隠せる単一の総合点は使いません。

指標確認すること
Parse2 段階の出力が完全な契約として解析できたか
Skill正しい機能を選んだか
ActionSkill 内の正しい操作を選んだか
Mode実行、計画、確認のどれを選ぶべきか
Missing Slots必須情報がなければ本当に停止したか
Scope Validity候補範囲と Schema 内に収まっているか
TTFT / E2E生成開始とルーティング完了までの時間

Parse が高くても意味が正しいとは限りません。合法な JSON を安定して出しながら、Skill を安定して間違えるモデルもあります。逆に、内容は理解しているようでも、出力形式が崩れて Runtime が使えない場合もあります。

実行ルーターとして重要なのは Skill、Action、Mode、不足 Slots の挙動です。Skill は強くても Action が弱いモデルは、第 1 段階の候補絞り込みには使えても、実行パラメータを直接任せるべきではありません。

公平とは、全モデルに同じ文字列を渡すことではない

10 モデルはすべて GGUF Q4_K_M、同じ evaluator、同じデータセット、同じ 4K/8K 設定、固定デコード条件で実行しました。

temperature = 0
top_p = 1
top_k = 1
seed = 42
candidate_limit = 3

ただし、全モデルに同じ ChatML 文字列を無理に渡してはいません。Llama 3 は header tokens、SmolLM3 は extended thinking を無効化し、LFM2.5 は必須の start-of-text token を使います。タスク、情報、出力契約は同じまま、外側のテンプレートだけをモデル本来の形式に合わせています。

私たちにとって公平な比較とは、仕事とルールを揃えたうえで、誤った入力形式による不利益を意図的に作らないことです。

各重みについて、提供元、リポジトリ、commit、ファイル名、バイト数、SHA-256、ライセンス、Prompt Profile も記録します。モデル名だけでは再現できません。同名でも変換や量子化ファイルが違えば、挙動が変わる可能性があります。

能力評価と実機測定を分ける理由

ここは特に誤解されやすい点です。

96 件の能力評価は、同じモデルファイルをデスクトップの Metal evaluator で実行します。大量実行、全 Raw Output の保存、安定した条件での再比較がしやすいためです。

リソース測定は A17 Pro、8 GB 物理メモリの iPhone 15 Pro Max 実機で行い、SwiftLlama と llama.cpp b8668 を使いました。各モデルを 4K と 8K でそれぞれ 3 回独立起動し、合計 60 回測定しました。

実機で記録するものは次のとおりです。

  • モデルのロード時間
  • 短い Prompt の TTFT
  • プロセスメモリ
  • Metal メモリ
  • 熱状態
  • 基本生成が完了したか
Flow diagram Preparing diagram
View diagram source
flowchart TB
    A[モデルファイルと SHA-256 を固定] --> B1[デスクトップ Metal 能力評価]
    A --> B2[iPhone 実機リソース評価]
    B1 --> C1[96 件の二言語要求]
    C1 --> D1[Parse Skill Action Mode]
    B2 --> C2[4K と 8K を各 3 回起動]
    C2 --> D2[Load TTFT Memory Thermal]
    D1 --> E[モデル選択]
    D2 --> E

この 2 種類の証拠は混ぜません。デスクトップの能力精度は iPhone のエンドツーエンド成功率ではなく、iPhone でロードできたことも 96 件を理解できた証明にはなりません。

4K と 8K で測ったもの

今回の実機 Prompt と生成は短くしています。4K/8K 測定が答えるのは主に 3 点です。

  1. 対象端末で、その context 設定のモデルをロードできるか。
  2. context 拡大による追加メモリはいくらか。
  3. 短い依頼での起動、最初の token、熱状態は許容できるか。

8K token を埋めた後も速度が同じだとは証明していません。長い Prompt の prefill 性能も未測定です。それには実際に約 3.5K/7.5K token を入力し、prefill、生成速度、消費電力、継続的な熱推移を測る必要があります。

今回の 8K は容量とリソースのテストであり、「8K 長文能力の認証」ではありません。

結果を証拠として残す

能力評価では最終的な百分率だけでなく、モデルの Raw Output と SHA-256 を保存します。集計 JSON には次の情報が入ります。

  • データセットのバージョンと digest
  • モデルファイルの SHA-256
  • Prompt 設定の SHA-256
  • Prompt Profile
  • context と候補数
  • ケースごとの期待値、実値、各判定
  • TTFT、E2E 遅延、token 数
  • 形式修復が必要だったか

実機側では、独立起動ごとの Raw Text、CSV 集計、モデル別チェックサムを残します。証拠ディレクトリ全体にも SHA256SUMS.txt があります。

これで人為的な誤りがすべて消えるわけではありません。それでも、どのファイルを、どの設定で測り、表の数値がどのサンプルから計算されたかを後から確認できます。

この結果で証明しないこと

現在の証拠は、このオンデバイス Agent のルーター選びには使えます。ただし、次の主張には直接使えません。

  • あるモデルの一般知能が最も高い
  • すべての言語と Tool で優れている
  • 8K の長文 prefill 性能を検証済み
  • 実際のアラーム、カレンダー、メールの成功率が特定の数字に達した
  • 学術的または業界全体のランキングである

96 件のうち 48 件の core は開発フィードバックに使われており、完全に独立した最終 holdout ではありません。確認質問や planning の重要な切片もまだ小さい状態です。実機測定は 1 構成 3 回で、モデル順序のランダム化、統一した冷却、電力、20 ターン連続セッションも未実施です。

これは記事末尾の形式的な注意書きではなく、結果そのものの一部です。

次に追加するもの

次版では、基準をさらに厳しくします。

  1. tuning と分離した 300 件以上の独立 holdout を作る。
  2. 全ケースを 2 名の非作者がバージョン管理された Rubric で確認する。
  3. 1 ケース 3 Trial 以上を実行し、安定通過、変動ケース、95% Wilson 下限を出す。
  4. 実際の 3.5K/7.5K prefill、連続会話、電力、熱推移、Jetsam 復旧を測る。
  5. 隔離 Tool fixture でパラメータ、順序、承認、確認質問、最終環境状態を検証する。
  6. 最後に少数の高リスク経路を、実機のシステム機能でエンドツーエンド確認する。

300 件の tuning/holdout 草案と Harness はすでにありますが、独立した 2 名の確認は完了していません。そのため、正式結果としては扱っていません。

最初の問いに戻る

この方法は「世界で最も賢い小型モデル」を探すものではありません。定義された端末、Runtime、Agent 契約の中で、現在のワークフローに最も適したデフォルトを選び、勝った理由、失敗する場所、証拠の限界を確認できるようにするものです。

10 モデルの結果、iPhone の 4K/8K リソース、モデルごとの判断は、「iPhone 実機で小型言語モデル 10 種を比較」で公開しています。

MonoWare より

App Store をタップする前に信頼を作る。

製品群を見るか、今後のプライバシーと製品技術ノートを購読できます。

ニュースレター

プライバシーと製品技術ノートを、ときどき送信します。