前情提要:开发了一款轻量养车记账软件,欢迎油车电车高端人士体验( 7 天前发的上篇)
一句话:把「 AI 帮你记」背后的模型,从手机上跑一个 2.33GB 的大模型,换成了自己训练的 4.5MB 小模型 lingxi (灵犀) 0.1.0,纯 Dart 推理、无任何原生依赖。
lingxi-0.1.0(下载体积从 GB 级墙降到 4.5MB ,MB 级不再强制 Wi-Fi )上篇评论区有人担心「端侧 AI 会让人变傻」,但其实更尴尬的是技术账:让一个通用 LLM 做槽位抽取,等于让它承担本该由规则承担的活——中文数字换算、元→分乘 100 、相对日期推算、句中多数字消歧、备注改写。
于是引入两类最难防的错:金额量级错误(×100 出错,7 元记成 700 元,用户会漏过去)和备注幻觉(编造原文不存在的文本,污染账本)。而且抽取任务真正承载的决策信息只有约 3 bit ,LLM 是按语言建模约 45 bit 造的,纯粹浪费容量。
所以我换了个思路:候选枚举 → 模型选择 → 规则解引用。
"呃,昨天在壳牌那儿,95 的加了 42 升,367 块 8"
① 枚举 把所有片段编号,并顺手把计算全做完:
N1=42 升(42.0) N2=367 块 8(=36780 分) D0=昨天(=设备当天-1)
② 标记 ⟨N1⟩42 升 ⟨N2⟩367 块 8
③ 模型 一次前向:指出 N2 是金额、N1 是升数、D0 是日期、类别=加油
④ 解引用 按编号取回算好的值 → 草稿
模型从头到尾没做过一次算术、没做过一次日期换算、没写过一个原文不存在的字。中文数字、小数、心算、自我改口、多数字消歧、相对日期这六类难题,从"生成/计算"坍缩成了"选择",容量需求直接掉两个数量级,且结构上不可能幻觉——它只能指认候选。
| 项 | 值 |
|---|---|
| 参数量 | 4.42M ( 4 层 × 256 宽编码器,RoPE + SwiGLU + RMSNorm ,全网络无 bias ) |
| 产物 | slot.ptw 4.49MB( int8 逐行量化;加载反量化为 fp32 ,常驻内存约 18MB ) |
| 运行时 | 纯 Dart,无原生库、无新依赖;常驻 isolate ,Android/iOS/macOS/Windows 通吃 |
| 推理时延 | p50 ~18ms / p90 ~48ms ( M4 Pro, JIT 实测; AOT 更快,300ms 预算内) |
| 训练 | 发布版 3000 步,CPU 上约 4 分钟( 242s )训完 |
评测(这是我最想吹也最想交代的部分):
一个反直觉的结论来自容量扫参:精度和参数量几乎无关——630K 参数金标准已 100%,14.5M 无任何可辨识提升,瓶颈是数据与词汇覆盖而不是模型大小。当务之急是把评测集做大,而不是把模型做大。
训练数据怎么来的?模板族合成 + 用 qwen3:14b 当"教师"只借它的词汇多样性(一次问 30 种说法:「给车洗了个澡」「掏了过路费」「补点电」……),模式引擎再乘上槽位空间生成十万级样本;评测诚信纪律是生成的说法与评测集任何文本重合一律丢弃。整个训练链路、契约、测试向量都在 pitstop-ml/ 工作区,权重发布到 HuggingFace ,有防回归门禁。
App 还是那款不上应用商店的养车记账(本地单机 / 在线共享双模式,多车、固定费用、统计都有),现在多了个 4.5MB 的 AI 帮你记。下载:https://pitstops.top
模型仓库:https://huggingface.co/XiaoDaZhen/pitstop-lingxi-0.1.0( slot.ptw ,4.49MB )
有任何想问的尽管问,我很乐意展开聊。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.