这套测试最早不是为了做一张模型排行榜。
我们当时遇到的问题很具体:手机里的本地 Agent 需要一个默认路由模型。它不能只会聊天,还要在很短的时间里判断用户想做什么、选择正确的能力、提取执行参数,并在信息不足时停下来追问。与此同时,它还得装得进手机,不能因为 8K context 就把内存和发热推到不可接受的水平。
所以我们真正想验证的是:
在我们的双语、结构化、手机本地 Agent 场景里,哪个模型能以合理的资源成本,最稳定地完成路由与执行参数生成?
这个限定很重要。我们测到的不是模型的通用智力,也不是写作、数学或知识问答排名。它回答的是一个产品工程问题。
先把 Agent 的工作拆开
用户说一句“明天早上七点叫我起床”,真正执行之前至少要完成两步判断。
第一步从当前可用能力中选出正确的 Skill,例如闹钟、日历、邮件或记忆。第二步再选择具体 Action,提取已知参数、列出缺失参数,并判断当前应该直接执行、先规划,还是向用户追问。
This diagram could not be rendered. Its source is still available below.
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 数据集,共 96 条请求:
| 维度 | 构成 |
|---|---|
| 语言 | 中文 48 条,英文 48 条 |
| Skill | 12 类 |
| 难度 | core 48 条,challenge 48 条 |
| 流程 | 两阶段 Skill → Action/Slots/Mode |
| Context | 4K 与 8K 分别完整运行 |
core 用例验证常见表达,例如创建闹钟、查询日程、起草邮件。challenge 用例会加入相近能力干扰、缺少必要信息、跨能力规划和更含糊的说法。
我们刻意保留了短输入。真实手机上的指令经常只有几个字,“八点提醒我”或者“回一下这封邮件”都很常见。一个模型如果只在写得像测试题的完整句子上表现稳定,对实际产品帮助不大。
每条用例都保存期望 Skill、Action、Mode 和相关结构约束。当前公开成绩按完整 96 条作为分母,不会把解析失败的样本从准确率里删掉。
96 条用例和预期结果
下面的“预期结果”不是最终自然语言答案,而是模型必须交给 Runtime 的路由契约。每条用例分别核对 Skill、Action 和 Mode;“附加断言”表示该题是否还检查缺槽为空/非空,或者必须进入规划。
三种具体判分示例
- 信息完整:
明天早上七点设置一个起床闹钟
应为 builtin.alarm.manage → create_alarm,Mode 为 act,missing_slots 必须为空。
- 信息不完整:
帮我起草一封邮件
应为 builtin.mail.draft → create_draft,Mode 为 clarify,missing_slots 必须非空。邮件 Schema 要求收件人、主题和正文。
- 多步骤任务:
先查看明天日程,然后为没有空闲时间的事项创建提醒
应为 builtin.task.plan_recover → orchestrate,Mode 为 act,并满足 requires_plan = true。
这里也能看出当前版本的一项限制:v3 对缺槽只检查“空”或“非空”,还没有逐个给缺失字段名称计分。精确槽位名称和值会进入下一版契约测试。
Core:48 条常规用例
| # / 用例 ID | 语言 | 测试输入 | 预期 Skill → Action | Mode | 附加断言 |
|---|---|---|---|---|---|
1 · zh-alarm-create | 中文 | 明天早上七点设置一个起床闹钟 | builtin.alarm.manage → create_alarm | act | 缺槽:空 |
2 · zh-alarm-list | 中文 | 查看我在 Vesta 里创建的所有闹钟 | builtin.alarm.manage → list_alarms | retrieve | — |
3 · en-alarm-create | 英文 | Set an alarm for 7 AM tomorrow. | builtin.alarm.manage → create_alarm | act | 缺槽:空 |
4 · en-alarm-list | 英文 | List all alarms currently managed by Vesta. | builtin.alarm.manage → list_alarms | retrieve | — |
5 · zh-schedule-event | 中文 | 明天下午三点在 A 会议室安排项目评审,持续一小时 | builtin.schedule.manage → create_calendar_event | act | 缺槽:空 |
6 · zh-schedule-reminder | 中文 | 提醒我周五下午六点提交周报 | builtin.schedule.manage → create_reminder | act | 缺槽:空 |
7 · en-schedule-event | 英文 | Create a calendar event for project review tomorrow at 3 PM for one hour. | builtin.schedule.manage → create_calendar_event | act | 缺槽:空 |
8 · en-schedule-reminder | 英文 | Remind me Friday at 6 PM to submit the weekly report. | builtin.schedule.manage → create_reminder | act | 缺槽:空 |
9 · zh-brief-today | 中文 | 汇总我今天的日程和未完成提醒 | builtin.daily.briefing → summarize_schedule | retrieve | — |
10 · zh-brief-conflict | 中文 | 看看本周安排里有没有冲突和逾期事项 | builtin.daily.briefing → summarize_schedule | retrieve | — |
11 · en-brief-today | 英文 | Summarize today's calendar and unfinished reminders. | builtin.daily.briefing → summarize_schedule | retrieve | — |
12 · en-brief-overdue | 英文 | Show my schedule conflicts and overdue reminders this week. | builtin.daily.briefing → summarize_schedule | retrieve | — |
13 · zh-general-explain | 中文 | 解释一下什么是最终一致性 | builtin.general.answer → answer | answer | — |
14 · zh-general-howto | 中文 | 如何安全地删除一个文件?只需要解释步骤 | builtin.general.answer → answer | answer | — |
15 · en-general-explain | 英文 | Explain eventual consistency in simple terms. | builtin.general.answer → answer | answer | — |
16 · en-general-howto | 英文 | How do I delete a file safely? Explain only. | builtin.general.answer → answer | answer | — |
17 · zh-knowledge-cite | 中文 | 根据我的本地项目文档,发布日期是什么?请引用来源 | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
18 · zh-knowledge-summary | 中文 | 总结我导入的合同里关于违约责任的内容 | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
19 · en-knowledge-cite | 英文 | Search my local documents for the launch date and cite the source. | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
20 · en-knowledge-compare | 英文 | Compare the pricing terms in my two imported contracts. | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
21 · zh-connected-contact | 中文 | 查一下通讯录里 Alex 的电话号码 | builtin.connected.context → answer_from_source | retrieve | — |
22 · zh-connected-web | 中文 | 总结这个网页的内容:https://example.com/report | builtin.connected.context → answer_from_source | retrieve | — |
23 · en-connected-mail | 英文 | Look in my Gmail for the latest message from Alex. | builtin.connected.context → answer_from_source | retrieve | — |
24 · en-connected-location | 英文 | What city am I currently in? | builtin.connected.context → answer_from_source | retrieve | — |
25 · zh-document-import | 中文 | 选择并导入这份 PDF 到本地知识库 | builtin.document.ingest → import_document | act | — |
26 · zh-document-ocr | 中文 | 识别我选择的图片文字并录入知识库 | builtin.document.ingest → scan_document | act | — |
27 · en-document-import | 英文 | Import the selected PDF into my local knowledge base. | builtin.document.ingest → import_document | act | — |
28 · en-document-ocr | 英文 | Run OCR on the selected image and add it to the knowledge base. | builtin.document.ingest → scan_document | act | — |
29 · zh-memory-remember | 中文 | 记住我不喜欢订阅制软件 | builtin.memory.governance → remember | act | 缺槽:空 |
30 · zh-memory-forget | 中文 | 忘记我之前保存的语言偏好 | builtin.memory.governance → forget | act | — |
31 · en-memory-list | 英文 | Show the long-term preferences you remember about me. | builtin.memory.governance → list_memories | retrieve | — |
32 · en-memory-remember | 英文 | Remember that I prefer one-time purchases. | builtin.memory.governance → remember | act | 缺槽:空 |
33 · zh-mail-complete | 中文 | 给 Alex 起草邮件,主题是周会,正文写明改到周五下午三点 | builtin.mail.draft → create_draft | act | 缺槽:空 |
34 · zh-mail-missing | 中文 | 帮我起草一封邮件 | builtin.mail.draft → create_draft | clarify | 缺槽:非空 |
35 · en-mail-complete | 英文 | Draft an email to Alex with subject Weekly Sync and say it moved to Friday at 3 PM. | builtin.mail.draft → create_draft | act | 缺槽:空 |
36 · en-mail-missing | 英文 | Create an email draft for me. | builtin.mail.draft → create_draft | clarify | 缺槽:非空 |
37 · zh-runtime-contract | 中文 | 检查 Vesta 当前的 Runtime 和安全执行契约 | builtin.runtime.inspect → inspect_runtime | retrieve | — |
38 · zh-runtime-mcp | 中文 | 列出本机 MCP Runtime 当前暴露的能力 | builtin.runtime.inspect → inspect_runtime | retrieve | — |
39 · en-runtime-contract | 英文 | Inspect Vesta's current runtime and safety contract. | builtin.runtime.inspect → inspect_runtime | retrieve | — |
40 · en-runtime-mcp | 英文 | Show the capabilities exposed by the local MCP runtime. | builtin.runtime.inspect → inspect_runtime | retrieve | — |
41 · zh-plan-sequence | 中文 | 先查看明天日程,然后为没有空闲时间的事项创建提醒 | builtin.task.plan_recover → orchestrate | act | 必须规划 |
42 · zh-plan-breakdown | 中文 | 把准备发布会这件事拆成可验证的步骤并跟踪进度 | builtin.task.plan_recover → orchestrate | act | 必须规划 |
43 · en-plan-sequence | 英文 | First inspect tomorrow's calendar, then create reminders for unresolved items. | builtin.task.plan_recover → orchestrate | act | 必须规划 |
44 · en-plan-breakdown | 英文 | Break down the product launch preparation into verifiable steps and track progress. | builtin.task.plan_recover → orchestrate | act | 必须规划 |
45 · zh-data-export | 中文 | 导出并加密备份我的全部 Vesta 本地数据 | builtin.data.portability → export_package | act | — |
46 · zh-data-restore | 中文 | 从这个 vestaexport 数据包选择性恢复记忆和任务 | builtin.data.portability → restore_package | act | — |
47 · en-data-export | 英文 | Export an encrypted backup of all my local Vesta data. | builtin.data.portability → export_package | act | — |
48 · en-data-inspect | 英文 | Inspect this Vesta backup package without restoring it. | builtin.data.portability → inspect_package | retrieve | — |
Challenge:48 条边界用例
| # / 用例 ID | 语言 | 测试输入 | 预期 Skill → Action | Mode | 附加断言 |
|---|---|---|---|---|---|
49 · challenge-zh-alarm-recurring | 中文 | 每个工作日早上八点半叫我起床 | builtin.alarm.manage → create_alarm | act | 缺槽:空 |
50 · challenge-zh-alarm-query | 中文 | 我明早有设叫醒铃吗? | builtin.alarm.manage → list_alarms | retrieve | — |
51 · challenge-en-alarm-recurring | 英文 | Wake me at 6:45 every weekday. | builtin.alarm.manage → create_alarm | act | 缺槽:空 |
52 · challenge-en-alarm-query | 英文 | Do I have a wake-up alarm tomorrow morning? | builtin.alarm.manage → list_alarms | retrieve | — |
53 · challenge-zh-schedule-create | 中文 | 下周一上午十点留半小时和产品经理同步 | builtin.schedule.manage → create_calendar_event | act | 缺槽:空 |
54 · challenge-zh-schedule-delete | 中文 | 删除明天下午由 Vesta 创建的牙医提醒 | builtin.schedule.manage → delete_reminder | act | — |
55 · challenge-en-schedule-create | 英文 | Put lunch with Sam on my calendar at noon Tuesday. | builtin.schedule.manage → create_calendar_event | act | 缺槽:空 |
56 · challenge-en-schedule-delete | 英文 | Cancel the Vesta reminder to pay rent. | builtin.schedule.manage → delete_reminder | act | — |
57 · challenge-zh-brief-tomorrow | 中文 | 我明天有哪些会和待办,按时间排一下 | builtin.daily.briefing → summarize_schedule | retrieve | — |
58 · challenge-zh-brief-load | 中文 | 这周哪几天的安排最满? | builtin.daily.briefing → summarize_schedule | retrieve | — |
59 · challenge-en-brief-morning | 英文 | Give me a morning briefing from my calendar and reminders. | builtin.daily.briefing → summarize_schedule | retrieve | — |
60 · challenge-en-brief-load | 英文 | Which days this week are overloaded? | builtin.daily.briefing → summarize_schedule | retrieve | — |
61 · challenge-zh-general-rewrite | 中文 | 把这句话改得更礼貌:你写错了 | builtin.general.answer → answer | answer | — |
62 · challenge-zh-general-calculate | 中文 | 计算 240 的 18% 是多少 | builtin.general.answer → answer | answer | — |
63 · challenge-en-general-rewrite | 英文 | Rewrite this more politely: You are wrong. | builtin.general.answer → answer | answer | — |
64 · challenge-en-general-howto | 英文 | How can I set an alarm on iPhone? Explain the steps only. | builtin.general.answer → answer | answer | — |
65 · challenge-zh-knowledge-policy | 中文 | 从已经收录的报销制度里找出打车标准 | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
66 · challenge-zh-knowledge-compare | 中文 | 对比知识库中两份方案的风险章节 | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
67 · challenge-en-knowledge-policy | 英文 | According to documents already in my library, what is the reimbursement limit? | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
68 · challenge-en-knowledge-summary | 英文 | Summarize the termination clause from the contract I previously imported. | builtin.knowledge.answer → answer_from_knowledge | retrieve | — |
69 · challenge-zh-connected-web | 中文 | 打开并概括这个链接:https://example.com/brief | builtin.connected.context → answer_from_source | retrieve | — |
70 · challenge-zh-connected-outlook | 中文 | 在 Outlook 里找 Alex 最新发来的邮件 | builtin.connected.context → answer_from_source | retrieve | — |
71 · challenge-en-connected-contact | 英文 | Find Jordan's phone number in my contacts. | builtin.connected.context → answer_from_source | retrieve | — |
72 · challenge-en-connected-web | 英文 | Read and summarize https://example.com/brief. | builtin.connected.context → answer_from_source | retrieve | — |
73 · challenge-zh-document-scan | 中文 | 把我刚选的扫描件 OCR 后加入资料库 | builtin.document.ingest → scan_document | act | — |
74 · challenge-zh-document-word | 中文 | 导入这个 Word 文件并建立本地索引 | builtin.document.ingest → import_document | act | — |
75 · challenge-en-document-photo | 英文 | Extract text from this selected photo and save it to my local library. | builtin.document.ingest → scan_document | act | — |
76 · challenge-en-document-sheet | 英文 | Add the selected spreadsheet to my local documents. | builtin.document.ingest → import_document | act | — |
77 · challenge-zh-memory-remember | 中文 | 以后回答尽量简短,请记住这个偏好 | builtin.memory.governance → remember | act | 缺槽:空 |
78 · challenge-zh-memory-list | 中文 | 列出你长期保存的关于我的偏好 | builtin.memory.governance → list_memories | retrieve | — |
79 · challenge-en-memory-forget | 英文 | Forget that I prefer dark mode. | builtin.memory.governance → forget | act | — |
80 · challenge-en-memory-update | 英文 | Change my saved language preference to Chinese. | builtin.memory.governance → remember | act | — |
81 · challenge-zh-mail-complete | 中文 | 给财务起草邮件,说明发票将在周五补交 | builtin.mail.draft → create_draft | act | 缺槽:空 |
82 · challenge-zh-mail-missing | 中文 | 写封邮件通知项目延期 | builtin.mail.draft → create_draft | clarify | 缺槽:非空 |
83 · challenge-en-mail-complete | 英文 | Draft an email to finance saying the invoice will arrive Friday. | builtin.mail.draft → create_draft | act | 缺槽:空 |
84 · challenge-en-mail-missing | 英文 | Write an email announcing the delay. | builtin.mail.draft → create_draft | clarify | 缺槽:非空 |
85 · challenge-zh-runtime-sources | 中文 | 检查 Vesta 当前授权了哪些数据源 | builtin.runtime.inspect → inspect_runtime | retrieve | — |
86 · challenge-zh-runtime-tools | 中文 | 查看本地执行器现在注册了哪些工具 | builtin.runtime.inspect → inspect_runtime | retrieve | — |
87 · challenge-en-runtime-tools | 英文 | Which tools are currently registered in the local runtime? | builtin.runtime.inspect → inspect_runtime | retrieve | — |
88 · challenge-en-runtime-write | 英文 | Check whether this runtime is allowed to execute write operations. | builtin.runtime.inspect → inspect_runtime | retrieve | — |
89 · challenge-zh-task-sequence | 中文 | 先找出今天逾期的事项,再逐项建立新的提醒 | builtin.task.plan_recover → orchestrate | act | 必须规划 |
90 · challenge-zh-task-resume | 中文 | 继续上次中断的发布准备任务并从失败步骤恢复 | builtin.task.plan_recover → recover | act | 必须规划 |
91 · challenge-en-task-sequence | 英文 | Review today's overdue items first, then create a reminder for each one. | builtin.task.plan_recover → orchestrate | act | 必须规划 |
92 · challenge-en-task-resume | 英文 | Resume the interrupted launch task from its failed step. | builtin.task.plan_recover → recover | act | 必须规划 |
93 · challenge-zh-data-inspect | 中文 | 只检查这个备份包里有什么,不要恢复 | builtin.data.portability → inspect_package | retrieve | — |
94 · challenge-zh-data-export | 中文 | 把知识库和长期偏好导出成加密数据包 | builtin.data.portability → export_package | act | — |
95 · challenge-en-data-restore | 英文 | Restore only memories from this Vesta export package. | builtin.data.portability → restore_package | act | — |
96 · challenge-en-data-inspect | 英文 | Verify this backup archive without importing anything. | builtin.data.portability → inspect_package | retrieve | — |
我们分别看哪些指标
我们不使用一个可以互相抵消问题的总分。
| 指标 | 它回答的问题 |
|---|---|
| Parse | 两阶段输出能否完整解析并进入契约 |
| Skill | 是否选中了正确能力 |
| Action | 是否选中了能力中的正确操作 |
| Mode | 应该执行、规划还是追问 |
| Missing Slots | 必填信息缺失时,是否真的停下来询问 |
| Scope Validity | 输出是否仍在候选能力和 Schema 范围内 |
| TTFT / E2E | 多快开始回答,以及整次路由耗时 |
Parse 高不代表语义正确。一个模型可以非常稳定地输出合法 JSON,同时稳定地选错 Skill。反过来,模型可能理解了任务,却因为输出格式漂移而无法被 Runtime 使用。这两类失败必须分开看。
最终是否适合作为执行路由模型,主要看 Skill、Action、Mode 和缺槽行为。只在 Skill 上表现好、Action 明显偏低的模型,可以继续研究为第一阶段粗选器,但不能直接获得系统操作权。
尽量公平,不等于所有 Prompt 一模一样
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。Prompt 内容和输出契约保持一致,外层模板遵循模型原生格式。
这是我们对公平性的理解:任务相同、信息相同、规则相同,但不要故意用错误模板让某个模型吃亏。
每个权重还记录发布方、仓库、commit、文件名、字节数、SHA-256、许可证和 Prompt Profile。只写一个模型名称远远不够;同名模型的不同转换或量化文件,结果可能并不一样。
能力测试和真机测试为什么分开
这里有一个容易误读的地方。
96 条能力用例使用相同模型权重,在桌面 Metal evaluator 上运行。这样做便于批量执行、保存完整原始输出,并让不同模型在稳定环境中重复比较。
资源数据则来自 iPhone 15 Pro Max 真机,配置为 A17 Pro、8 GB 物理内存、SwiftLlama 和 llama.cpp b8668。每个模型分别测试 4K 与 8K,每个组合独立启动三次,共 60 次。
真机记录:
- 模型加载时间;
- 短 Prompt 的 TTFT;
- 进程内存;
- Metal 内存;
- 热状态;
- 是否成功完成基础生成。
This diagram could not be rendered. Its source is still available below.
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 各三次独立启动]
C2 --> D2[Load TTFT Memory Thermal]
D1 --> E[选型判断]
D2 --> E
我们没有把这两类数据混在一起。桌面上的能力准确率不能冒充 iPhone 端到端任务成功率;iPhone 上成功加载也不能证明模型已经理解了 96 条请求。
4K 和 8K 到底测了什么
本轮真机 Prompt 很短,生成也很短。因此 4K/8K 数据主要回答三件事:
- 模型能否在目标设备上按该 context 配置成功加载;
- context 扩容带来多少内存增量;
- 短请求下的启动、首 token 和热状态是否可接受。
它没有证明模型在填满 8K token 后仍然保持同样速度,也没有测长文 prefill 吞吐。要验证后者,需要实际放入约 3.5K 和 7.5K token,并记录 prefill、生成速度、能耗和持续热曲线。
换句话说,本轮的 8K 是容量与资源测试,不是“8K 长文本能力认证”。
一次结果如何留下证据
每次能力评测都会保存模型原始输出及其 SHA-256,而不只保留最后的百分比。汇总 JSON 同时记录:
- 数据集版本与 digest;
- 模型文件 SHA-256;
- Prompt 配置 SHA-256;
- Prompt Profile;
- context 与候选数量;
- 每条用例的期望值、实际值和各项判断;
- TTFT、E2E 延迟和 token 数;
- 是否触发格式修复。
真机侧保留每次独立启动的原始文本、CSV 汇总和单模型校验文件。整个证据目录另有统一 SHA256SUMS.txt。
这套做法不能阻止所有人为错误,但至少可以回答三个基本问题:当时测的是哪个文件、使用了什么配置、最后一个百分比是由哪些原始样本算出来的。
我们不会用这套结果证明什么
目前这套测试可以支持“为当前手机本地 Agent 选择路由模型”,但不能直接支持以下说法:
- 某个模型的通用智力更强;
- 某个模型在所有语言、所有 Tool 场景都更好;
- 8K 长文吞吐已经得到验证;
- 真实闹钟、日历或邮件操作的端到端成功率已经达到某个数字;
- 这是一份学术意义上的行业排名。
当前 96 条中,48 条 core 用例参与过开发反馈,不能视为完全独立的最终留出集。clarify、planning 等关键切片的样本仍然偏少。真机每个配置只有三次启动,也没有完成随机运行顺序、统一冷却、耗电和 20 轮持续会话。
这些限制不是附在文章末尾的客套话,而是结论的一部分。
下一版怎么补强
我们已经为下一版准备了更严格的方向:
- 建立不少于 300 条的独立 holdout,并与 tuning 集隔离;
- 每条案例由两名非作者按版本化 Rubric 复核;
- 每案例至少运行三次,报告稳定通过、波动案例和 95% Wilson 下界;
- 加入真实 3.5K/7.5K prefill、持续会话、耗电、热曲线与 Jetsam 恢复;
- 在隔离 Tool fixture 中验证参数、调用顺序、审批、追问和最终环境状态;
- 最后再用真机系统能力验证少量高风险端到端路径。
其中 300 条 tuning/holdout 草案和 Harness 已经存在,但尚未完成人工双审,所以我们不会把它们包装成正式成绩。
回到最初的问题
这套方法没有试图找出“世界上最聪明的小模型”。它做的是一件更窄、也更有用的事:在明确的设备、Runtime 和 Agent 契约下,找出最适合当前场景的默认模型,并知道它为什么赢、会在哪里失败。
完整的 10 模型结果、4K/8K 真机资源数据和逐模型判断,可以继续阅读《iPhone 真机横测 10 款小模型》。