一个瑜伽老师,每周独自上六节45分钟的课,课后还要写进度记录、发跟进邮件、编周报。这些活儿全落在晚上。有人给她做了个桌面应用,把这三件事交给跑在自己笔记本上的Gemma。
![]()
应用叫Saathi,通过Ollama在本地调用Gemma,打包成6 MB的原生Mac应用。它不联网,学生的伤病记录不出这台机器。
为什么非要本地跑?这位老师的学生档案里存着每个人的年龄段、经验、目标和伤病手术史。这些恰恰是排一堂安全课最有用的输入,也是最不该粘进在线聊天机器人的东西。作者替她做过预约网站,清楚数据库里有什么。
功能分三块。课前,选好今晚的课和到课学生,Saathi用梵文和英文起草序列,并为每个有伤或做过手术的学生单独写提示:避开哪些体式、给什么替代动作,依据是本人的实际状况。课后,输入几句随手记,它给每个学生写一条进度日志,再以老师的口吻起草一封简短的跟进邮件——从不自己发送。周报环节,它把一周笔记变成通讯稿草稿,不出现学生姓名,也不提任何健康细节。
技术栈是Tauri 2外壳加React和TypeScript前端,Ollama在localhost上服务Gemma,应用调用/api/chat并在format字段里塞JSON schema,让Ollama约束输出,直接拿回结构化数据而不是待解析的文本。SQLite经Tauri SQL插件存在老师自己的磁盘上。学生可以从她现有预约库的students表直接导入,也能手动添加。
作者列了几条踩坑记录。Gemma 4默认会"思考",第一次调用返回空回复,因为token预算全花在隐藏推理上,传think: false才解决。schema只有堵住漏洞才算契约:第一版计划时长对、每人提示也对,但每个区块的poses列表都是空的,因为schema允许为空,加上minItems: 2并写明每个区块必须包含什么才修好。schema里属性的顺序就是生成顺序,他把每个学生的提示挪到最前面,老师最关心的部分最先出现。还有一次切标签页,请求在后台继续跑,第二次点击排在它后面,现在应用让每个界面保持挂载、流式输出,并加了能中止请求的Stop按钮。
代价也很直白。在16 GB的M1 Pro上,Gemma的生成速度大约是每秒2到4个token。不开流式,一份完整计划要盯着转圈约六分钟;开了流式,第一批提示大约一分钟后出现,计划边写边填,但作者计时的最后一份三人计划仍花了9分11秒。托管API几秒就能答完。
输出也有毛边。区块加起来是40分钟,不是要求的45分钟——schema能强制字段存在,强制不了求和。有个膝关节炎的学生,提示里说避开战士二式和三角式,序列里却把这两个都作为椅子变体排了进去。作者说这勉强算替代动作,但读起来像自相矛盾,所以每份计划都写明安全由老师最终判断。
成本账是这么算的:她的第一节课收费10加元,按token计费、每份计划和每封邮件都累加的账单,对一周教六节课的人来说不是好生意。本地推理只花电费,两份完整计划让作者的电池从94%掉到92%。模型本身是个设置项:默认的gemma4:e4b有9.5 GB,对16 GB笔记本太重,换成6 GB的e4b-it-qat,应用里其他东西一行没改。下个月有更好或更小的开源模型,换上去就行;想让它更像自己说话,声音存在一段可编辑的提示词里,将来还能用自己的通讯稿做微调,不用问谁许可。
隐私在这里是结构性的,不是承诺出来的。学生的伤病不离开这台机器,没有服务器可被攻破,没有厂商隐私政策要读,一人工作室也不用签数据处理协议。对加拿大的健康信息来说,这比"我们发给API但保证不滥用"好谈得多。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.