이 테스트는 모델 순위표를 만들기 위해 시작한 것이 아닙니다.
처음 마주한 문제는 훨씬 구체적이었습니다. 스마트폰의 로컬 에이전트에는 기본 라우팅 모델 하나가 필요합니다. 이 모델은 대화만 잘해서는 부족합니다. 짧은 시간 안에 사용자의 의도를 이해하고, 올바른 기능을 고르고, 실행 파라미터를 추출하고, 필수 정보가 부족하면 멈춰서 질문해야 합니다. 동시에 8K context를 사용해도 메모리와 발열이 현실적인 범위에 머물러야 합니다.
우리가 확인하려던 질문은 다음과 같습니다.
현재의 이중언어·구조화·온디바이스 에이전트 흐름에서, 합리적인 리소스 비용으로 라우팅과 실행 파라미터를 가장 안정적으로 만드는 모델은 무엇인가?
이 범위가 중요합니다. 일반 지능, 글쓰기, 수학, 지식 질의의 순위를 측정하는 것이 아닙니다. 하나의 제품 엔지니어링 선택에 답하는 테스트입니다.
에이전트가 실제로 하는 일을 먼저 나눈다
“내일 아침 7시에 깨워 줘”라는 요청을 실행하기 전, 에이전트는 적어도 두 단계의 판단을 거칩니다.
먼저 현재 사용할 수 있는 기능 중 올바른 Skill을 선택합니다. 알람, 캘린더, 메일, 메모리 등이 여기에 해당합니다. 그다음 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, known Slots, missing Slots, objectives가 들어 있는 명확한 구조를 요구합니다. 이후 Swift Runtime이 결과가 검색된 후보 범위에 있는지, 현재 Schema에 맞는지 결정적 규칙으로 검사합니다.
시스템 기능을 다루는 에이전트에게 “대략 이해했다”는 실행 보장이 아닙니다. 잘못된 Action을 고른 것과 필수 파라미터 하나를 빠뜨린 것은 서로 다른 실패이며, 둘 다 드러나야 합니다.
96개 사례의 구성
모델 비교에는 v3-96-staged-skill-action 데이터셋을 사용합니다.
| 기준 | 구성 |
|---|---|
| 언어 | 중국어 48개, 영어 48개 |
| Skill | 12종 |
| 난이도 | core 48개, challenge 48개 |
| 프로토콜 | 2단계 Skill → Action/Slots/Mode |
| Context | 4K와 8K에서 전체 실행 |
core 사례는 알람 생성, 일정 확인, 이메일 초안처럼 흔한 표현을 다룹니다. challenge 사례에는 비슷한 Skill의 혼동, 필수 정보 누락, 여러 기능을 잇는 계획, 더 모호한 표현을 넣었습니다.
짧은 입력도 의도적으로 남겼습니다. 스마트폰에서 하는 요청은 몇 단어로 끝나는 경우가 많습니다. 시험 문제처럼 완전한 문장에서만 안정적인 모델은 실제 제품에서 큰 도움이 되지 않습니다.
각 사례에는 기대 Skill, Action, Mode와 관련 구조 제약이 저장됩니다. 공개 정확도의 분모는 항상 전체 96개입니다. Parse에 실패한 사례를 정확도 계산에서 빼지 않습니다.
96개 테스트 사례와 기대 결과
아래 기대 결과는 최종 자연어 답변이 아니라 모델이 Runtime에 전달해야 하는 라우팅 계약입니다. 각 사례에서 Skill, Action, Mode를 따로 확인합니다. 추가 조건은 missing Slots의 빈 값 여부 또는 계획 필요 여부를 뜻합니다.
세 가지 구체적인 채점 예시
- 정보가 완전한 요청:
Set an alarm for 7 AM tomorrow.
builtin.alarm.manage → create_alarm, Mode는 act, missing_slots는 비어 있어야 합니다.
- 정보가 부족한 요청:
Create an email draft for me.
builtin.mail.draft → create_draft, Mode는 clarify, missing_slots는 비어 있지 않아야 합니다. 메일 Schema에는 수신자, 제목, 본문이 필요합니다.
- 여러 단계 요청:
First inspect tomorrow's calendar, then create reminders for unresolved items.
builtin.task.plan_recover → orchestrate, Mode는 act, requires_plan = true여야 합니다.
현재 v3의 한계도 표에서 확인할 수 있습니다. missing Slots는 비었는지 아닌지만 채점하며, 빠진 필드 이름을 모두 정확히 제시했는지는 개별 점수로 계산하지 않습니다. 정확한 Slot 이름과 값은 다음 계약 테스트에 추가할 예정입니다.
Core: 일반 사례 48개
| # / Case 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개
| # / Case 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 | Skill 안의 올바른 동작을 선택했는가 |
| Mode | 실행, 계획, 확인 중 무엇을 해야 하는가 |
| Missing Slots | 필수 정보가 없을 때 실제로 멈췄는가 |
| Scope Validity | 후보 범위와 Schema 안에 머물렀는가 |
| TTFT / E2E | 생성 시작과 라우팅 완료까지 얼마나 걸렸는가 |
Parse가 높다고 의미가 정확한 것은 아닙니다. 완전히 유효한 JSON을 안정적으로 만들면서 Skill을 계속 잘못 선택할 수도 있습니다. 반대로 요청은 이해한 것처럼 보여도 출력 형식이 흔들려 Runtime이 사용할 수 없는 경우도 있습니다.
실행 라우터로 쓸 때는 Skill, Action, Mode, missing-slot 동작이 가장 중요합니다. 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 메모리
- 열 상태
- 기본 생성 완료 여부
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 각각 3회 실행]
C2 --> D2[Load TTFT Memory Thermal]
D1 --> E[모델 선택]
D2 --> E
두 종류의 근거를 섞지 않습니다. 데스크톱의 능력 정확도는 iPhone의 엔드투엔드 작업 성공률이 아닙니다. iPhone에서 로드에 성공했다고 96개 요청을 이해했다는 뜻도 아닙니다.
4K와 8K에서 실제로 측정한 것
이번 기기 테스트의 Prompt와 생성은 의도적으로 짧습니다. 4K/8K 측정은 세 가지 질문에 답합니다.
- 대상 기기에서 해당 context 설정으로 모델을 로드할 수 있는가.
- context를 늘릴 때 추가 메모리가 얼마나 필요한가.
- 짧은 요청에서 시작 시간, 첫 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가 있습니다.
이 과정이 모든 사람의 실수를 없애 주지는 않습니다. 하지만 어떤 파일을 어떤 설정으로 테스트했고, 표의 백분율이 어떤 원본 사례에서 계산됐는지는 나중에 확인할 수 있습니다.
이 결과로 증명하지 않는 것
현재 근거는 이 온디바이스 에이전트의 라우터를 선택하는 데 사용할 수 있습니다. 다음 주장에는 직접 사용할 수 없습니다.
- 특정 모델의 일반 지능이 더 높다
- 모든 언어와 Tool 영역에서 더 우수하다
- 긴 8K prefill 성능을 검증했다
- 실제 알람, 캘린더, 메일 작업의 성공률이 특정 수치에 도달했다
- 학술적 또는 업계 전체 순위다
현재 96개 중 48개 core 사례는 개발 피드백에 사용됐기 때문에 완전히 독립된 최종 holdout이 아닙니다. clarification과 planning 같은 중요한 구간의 사례 수도 아직 적습니다. 기기 구성당 실행도 3회뿐이며, 모델 순서 무작위화, 동일한 냉각 조건, 배터리 측정, 20턴 연속 세션은 아직 하지 않았습니다.
이 한계는 글 끝에 형식적으로 붙인 문장이 아니라 결과의 일부입니다.
다음 버전에서 보강할 것
다음 버전은 더 엄격한 기준을 목표로 합니다.
- tuning과 분리된 300개 이상의 독립 holdout을 구축합니다.
- 각 사례를 작성자가 아닌 두 사람이 버전이 지정된 Rubric으로 검토합니다.
- 사례당 최소 3 Trial을 실행하고 안정 통과, 변동 사례, 95% Wilson 하한을 보고합니다.
- 실제 3.5K/7.5K prefill, 연속 세션, 에너지, 열 곡선, Jetsam 복구를 측정합니다.
- 격리된 Tool fixture에서 파라미터, 호출 순서, 승인, 확인 질문, 최종 환경 상태를 검증합니다.
- 마지막으로 소수의 고위험 경로를 실제 기기 시스템 기능으로 엔드투엔드 확인합니다.
300개 tuning/holdout 초안과 평가 Harness는 이미 있지만, 독립적인 2인 검토가 끝나지 않았습니다. 따라서 아직 공식 결과로 제시하지 않습니다.
처음의 질문으로 돌아가면
이 방법은 “세계에서 가장 똑똑한 소형 모델”을 찾지 않습니다. 정의된 기기, Runtime, 에이전트 계약 안에서 현재 흐름에 가장 적합한 기본 모델을 고르고, 왜 이겼는지, 어디서 실패하는지, 근거의 경계가 어디인지 확인할 수 있게 합니다.
10개 모델 결과와 iPhone 4K/8K 리소스, 모델별 판단은 iPhone에서 소형 언어 모델 10종 비교에서 확인할 수 있습니다.