小恺在家

我是爷爷奶奶带大的,现在我在深圳,他们在南宁。我想给他们做一个点一下就能说话的东西,于是有了小恺在家:把聊天做成打电话,用我本人录制并授权的声音,也给家里人留一个看得到提醒的地方。从第一次提交到 2.0 上线用了一周。

2026.10 至今给长辈的 AI 语音陪伴2.0 已上线AI 陪伴

长辈点一下就能和“虚拟小恺”打电话:聊天、查天气、辨谣言、按时提醒吃药;家人在网页后台看记录、摘要和需要留意的事。

我的角色:产品与技术决策 Owner:需求、边界、评测与发布;代码与 Claude Code 协作实现

爷爷奶奶在南宁

我是爷爷奶奶带大的。小时候最熟悉的,就是他们的声音。现在我在深圳,他们在南宁。

我能做的,主要是打电话。可电话之外的日子里,药有没有按时吃,转发来的“养生消息”是不是真的,他们想找人说话时有没有人接,我都不太知道。

小恺在家是我给他们做的一个助手:长辈打开手机,点一下就能说话;家里人在网页后台,看得到提醒有没有完成、有没有需要留意的事。

抽象示意:通话中的虚拟小恺、“给小恺打电话”按钮、下一个吃药提醒和天气卡片
示意图:首页只做一件事,拨通以后直接说;提醒和天气退到旁边。

把聊天做成打电话

1.0 的首页是四个一样大的方块,长辈要先想清楚“我要聊天还是查询”。2.0 改成只有一个最显眼的动作:一张大卡片,写着“给小恺打电话”。下面是下一个提醒,再下面是“打给家人”和“问问小恺”。

吃药提醒也做成了来电:“小恺给您打电话了”。接起来是全屏的吃药页,可以再听一遍、点“吃好了”,或者让它 10 分钟后再打。30 分钟还没确认,家属后台会收到一条提醒。喝水、散步这类可以设成普通通知,不弹来电。

小恺在家长辈首页的“给小恺打电话”按钮,以及通话中的大字字幕
2.0 长辈端:首页只有一个最显眼的动作,通话页只显示最近一问一答。

用我的声音,但它不是我

小恺用的是我本人录制、本人授权的声音。我想让爷爷奶奶接起电话时,听到的是熟悉的人。

正因为声音像我,边界更要写清楚。它自称“虚拟小恺”,是电脑里的帮手,不冒充我本人;长辈明确把它当成孙子本人时,家属后台会收到提醒。没有配置授权声线的家庭,App 就不写“孙子的声音”,改成“陪您说说话”。它也替代不了家里人的电话。我希望它让两通电话之间的日子少一点空白,仅此而已。

抽象示意:左边模型负责选工具、组织语言、提出候选记忆和风险判断,右边程序负责权限、拦截剂量问题、确认状态和写入数据
示意图:模型负责说话和判断,程序守住边界和数据;记忆要家属确认,提醒只有长辈能点完成。

模型做什么,程序管什么

这是我在整个项目里最在意的一条线:

  • 模型负责: 听懂长辈在说什么、决定要不要查资料、组织回答、提出“候选记忆”和风险判断。
  • 程序负责: 权限、拦截个人用药剂量的问题、确认提醒状态、写入数据。助手能回答“我今天吃药了吗”,但没有任何工具能替长辈打勾。
  • 家属把关: 模型从聊天里提出的“记忆”要家属确认后,才会进入之后的对话。

技术上,语音由手机直连实时语音模型,后端只代理连接、保存文字和执行工具调用。LangGraph 只用在三处:查资料(校验 → 检索 → 核对来源)、风险识别、每日摘要。一个家庭、一个进程、一个 SQLite 数据库,够用就好。

小恺在家家属后台的家庭看板,显示今日聊天、提醒完成情况和一条高优先级风险提醒
家属后台的家庭看板。截图为合成的演示家庭数据,不是真实长辈记录。

规则在主集上满分,在留出集上不到一半

风险识别一开始全靠关键词规则。在我调规则用的那批用例上,它是 100%;换一批调完之后才写的新用例,只剩不到一半。这个落差说明规则在“背答案”,也说明了为什么需要模型兜底。

现在是“高精度规则先判,模型兜底”。在新增了诈骗和情绪低落两类的 50 条留出用例上,仅规则 0.64,规则加模型 0.78。还修过一个规则设计错误:一句“我老伴走了以后我真的不想活了”,因为句子里有“老伴”,被当成在说别人而漏掉了。现在本人自述的自伤表达一律按最高优先级处理。CI 每次都会跑离线评测,分数低于基线就不让合并。

现在

爷爷奶奶已经开始用了。上面的评测数字都来自合成用例,不代表真实对话;真实使用中哪里顺手、哪里还要改,我在一边看一边调,之后再回来补上。

想了解更多,可以去 小恺在家官网 看看功能介绍和开发笔记。

2026-10-03 第一次提交,10-07 部署 1.0(网页与安卓),一周内发布 2.0

长辈端:打电话聊天、查天气新闻、辨真假、拍药盒识别、像来电一样的吃药提醒;家属端:记录、每日摘要、风险提醒与提醒完成情况

风险识别留出集上,仅规则 0.64,规则 + 模型 0.78(50 条合成用例);CI 每次运行离线评测,低于基线即失败

Expo / React NativeReactFastAPIWebRTC 实时语音LangGraphSQLite