小恺在家
我是爷爷奶奶带大的,现在我在深圳,他们在南宁。我想给他们做一个点一下就能说话的东西,于是有了小恺在家:把聊天做成打电话,用我本人录制并授权的声音,也给家里人留一个看得到提醒的地方。从第一次提交到 2.0 上线用了一周。
项目背景 / Problem
长辈点一下就能和“虚拟小恺”打电话:聊天、查天气、辨谣言、按时提醒吃药;家人在网页后台看记录、摘要和需要留意的事。
我的角色:产品与技术决策 Owner:需求、边界、评测与发布;代码与 Claude Code 协作实现
爷爷奶奶在南宁
我是爷爷奶奶带大的。小时候最熟悉的,就是他们的声音。现在我在深圳,他们在南宁。
我能做的,主要是打电话。可电话之外的日子里,药有没有按时吃,转发来的“养生消息”是不是真的,他们想找人说话时有没有人接,我都不太知道。
小恺在家是我给他们做的一个助手:长辈打开手机,点一下就能说话;家里人在网页后台,看得到提醒有没有完成、有没有需要留意的事。
把聊天做成打电话
1.0 的首页是四个一样大的方块,长辈要先想清楚“我要聊天还是查询”。2.0 改成只有一个最显眼的动作:一张大卡片,写着“给小恺打电话”。下面是下一个提醒,再下面是“打给家人”和“问问小恺”。
吃药提醒也做成了来电:“小恺给您打电话了”。接起来是全屏的吃药页,可以再听一遍、点“吃好了”,或者让它 10 分钟后再打。30 分钟还没确认,家属后台会收到一条提醒。喝水、散步这类可以设成普通通知,不弹来电。
用我的声音,但它不是我
小恺用的是我本人录制、本人授权的声音。我想让爷爷奶奶接起电话时,听到的是熟悉的人。
正因为声音像我,边界更要写清楚。它自称“虚拟小恺”,是电脑里的帮手,不冒充我本人;长辈明确把它当成孙子本人时,家属后台会收到提醒。没有配置授权声线的家庭,App 就不写“孙子的声音”,改成“陪您说说话”。它也替代不了家里人的电话。我希望它让两通电话之间的日子少一点空白,仅此而已。
模型做什么,程序管什么
这是我在整个项目里最在意的一条线:
- 模型负责: 听懂长辈在说什么、决定要不要查资料、组织回答、提出“候选记忆”和风险判断。
- 程序负责: 权限、拦截个人用药剂量的问题、确认提醒状态、写入数据。助手能回答“我今天吃药了吗”,但没有任何工具能替长辈打勾。
- 家属把关: 模型从聊天里提出的“记忆”要家属确认后,才会进入之后的对话。
技术上,语音由手机直连实时语音模型,后端只代理连接、保存文字和执行工具调用。LangGraph 只用在三处:查资料(校验 → 检索 → 核对来源)、风险识别、每日摘要。一个家庭、一个进程、一个 SQLite 数据库,够用就好。
规则在主集上满分,在留出集上不到一半
风险识别一开始全靠关键词规则。在我调规则用的那批用例上,它是 100%;换一批调完之后才写的新用例,只剩不到一半。这个落差说明规则在“背答案”,也说明了为什么需要模型兜底。
现在是“高精度规则先判,模型兜底”。在新增了诈骗和情绪低落两类的 50 条留出用例上,仅规则 0.64,规则加模型 0.78。还修过一个规则设计错误:一句“我老伴走了以后我真的不想活了”,因为句子里有“老伴”,被当成在说别人而漏掉了。现在本人自述的自伤表达一律按最高优先级处理。CI 每次都会跑离线评测,分数低于基线就不让合并。
结果与范围 / Now
2026-10-03 第一次提交,10-07 部署 1.0(网页与安卓),一周内发布 2.0
长辈端:打电话聊天、查天气新闻、辨真假、拍药盒识别、像来电一样的吃药提醒;家属端:记录、每日摘要、风险提醒与提醒完成情况
风险识别留出集上,仅规则 0.64,规则 + 模型 0.78(50 条合成用例);CI 每次运行离线评测,低于基线即失败



