| 系统 | 核心职责 | 不负责 | 拥有数据 | 依赖 |
|---|---|---|---|---|
| 🧸 智能娃娃 | 采集老人语音、播放 AI 回复音频 | 不做任何计算、不存数据、不联网 | 无(纯透传设备) | 手机蓝牙连接 |
| 📱 老人端 App | BLE 中转音频、展示提醒/健康/对话记录、管理设置、本地降级反馈 | 不跑 AI 模型、不直接存业务数据 | 本地缓存(会话、设置、预置音频) | 后端 API(WebSocket)· 手机 BLE |
| 🖥️ 后端服务 | API 网关、用户管理、数据持久化、定时任务、消息推送、计费、PII 脱敏 | 不做 AI 推理、不管理 Prompt 内容 | 所有业务数据(用户、对话、提醒、健康、产品) | PostgreSQL · Redis · Agent · 第三方 API |
| 🤖 Agent 智能体 | 对话理解、意图识别、工具调用、流式回复生成、情绪分析 | 不存数据、不管理用户、不发通知 | 无状态(每次调用独立) | DeepSeek API · 后端(工具执行) |
| ⚙️ 后台管理 | 运营看板、用户管理、产品管理、Prompt 模板、数据导出 | 不直接服务终端用户 | 操作日志 | 后端 API(管理员鉴权) |
| 💬 子女端(微信) | 接收老人情绪报告、异常告警、对话摘要 | 不直接与老人交互 | 无(消息由后端推送) | 微信模板消息 API |
| 步骤 | 🧸 娃娃 | 📱 老人端 App | 🖥️ 后端服务 | 🤖 Agent | 💬 子女端 |
|---|---|---|---|---|---|
| 1 | 老人按住按钮说话 麦克风采集音频 |
||||
| 2 | 通过 BLE 发送音频流 | BLE 接收音频 前台服务保活 |
|||
| 3 | WebSocket 连接 流式上传音频 断网时播放本地预置音频 |
流式接收音频 PII 脱敏 → 讯飞 ASR |
|||
| 4 | 构建上下文 加载用户画像 + 历史 |
||||
| 5 | 调用 Agent | 流式生成回复 边生成边输出,触发 Function Call |
|||
| 6 | 执行工具调用 (设提醒/查天气/推荐) |
持续输出文本 + 情绪标签 | |||
| 7 | 流式 TTS 合成 音频片段边合成边推送 存储对话记录 |
||||
| 8 | 接收音频片段 → BLE 流式转发 | WebSocket 推送音频流 | |||
| 9 | 播放 TTS 音频 老人听到回复 |
||||
| 10 | 情绪分析异常? 触发告警 |
收到微信通知 "老人情绪低落" |
| 步骤 | 📱 老人端 App | 🖥️ 后端服务 | 🤖 Agent | 💬 子女端 |
|---|---|---|---|---|
| 1 | 老人输入文字 / 点击快捷按钮 | |||
| 2 | POST /api/chat/message | 接收消息 · 加载上下文 | ||
| 3 | 调用 Agent | 生成回复 + Function Call | ||
| 4 | 显示文字回复 可选:TTS 播报 |
返回 reply + actions 存储对话记录 |
返回文本 + 情绪 | |
| 5 | 异常? → 推送通知 | 收到微信告警 |
| 场景 | 👨👩👧 子女 | 💬 微信服务号 | 🖥️ 后端服务 | 📱 老人端 App | 🤖 Agent |
|---|---|---|---|---|---|
| 日报 | 每日 20:00 生成日报 对话次数、情绪趋势、健康提醒完成率 |
分析情绪趋势 | |||
| 收到日报推送 "今日对话 12 次,情绪平稳" |
模板消息推送 | 调用微信 API | |||
| 告警 | 检测到异常情绪/未按时吃药 | ||||
| 收到告警 "老人情绪持续低落,建议联系" |
模板消息推送 | 紧急通知 | |||
| 设置 | 设置提醒 / 修改偏好 | 存储设置 | 同步生效 |
| 场景 | ⚙️ 后台管理 | 🖥️ 后端服务 | 🤖 Agent | 📱 老人端 |
|---|---|---|---|---|
| 看板 | 查看 DAU、对话量、成本、异常 | 聚合统计数据 | ||
| Prompt | 修改 AI 人设 / 推荐规则 | 更新 prompt_templates 表 | 下次对话使用新 Prompt | 对话风格变化 |
| 产品 | 上架/下架推荐产品 | 更新 products 表 + 向量索引 | RAG 检索范围变化 | |
| 排查 | 查看异常对话追踪 | 查询 agent_traces 表 |
| 数据类型 | 存储位置 | 娃娃 | 老人端 | 子女端 | 后台 | 保留策略 |
|---|---|---|---|---|---|---|
| 语音原始音频 | 对象存储 | — | — | — | 可查 | 30 天自动清理 |
| 对话文字记录 | PostgreSQL | — | 自己的 | — | 全部 | 180 天归档 |
| 用户画像 | PostgreSQL + Redis | — | 自己的 | — | 全部 | 永久 |
| 提醒数据 | PostgreSQL | — | 自己的 | 只读 | 全部 | 永久 |
| 健康数据 | PostgreSQL | — | 自己的 | 只读 | 全部 | 永久 |
| 情绪报告 | PostgreSQL | — | — | 汇总 | 全部 | 90 天 |
| Agent 追踪 | PostgreSQL | — | — | — | 全部 | 90 天 |
| 操作日志 | PostgreSQL | — | — | — | 全部 | 180 天 |
| 协议 | BLE (Bluetooth Low Energy) |
| 音频格式 | Opus 编码,16kHz 采样 |
| 传输延迟 | < 100ms(BLE 范围内) |
| 有效距离 | ~10 米(室内) |
| 断连处理 | App 提示"娃娃未连接",自动重连 |
| Android | Foreground Service + WakeLock + 电池优化白名单 |
| iOS | Background Modes (BLE + Audio) |
| 电量消耗 | ~3-5% / 小时(待机) |
| 网络要求 | WiFi 或 4G,最低 100kbps |
| 断网处理 | 本地缓存消息,恢复后同步;语音场景播放本地预置音频兜底(见下方降级策略) |
| 能力 | 一期(MVP) | 二期 |
|---|---|---|
| 娃娃交互 | 语音对话(按住说话) | 免唤醒 + 连续对话 |
| 子女端 | 微信服务号通知(日报 + 告警) | App 内子女模式(完整功能) |
| 健康设备 | 不接入 | 蓝牙血压计/血糖仪 |
| 产品推荐 | 基础 RAG + 标签匹配 | 用户行为 + 协同过滤 |
| Agent 能力 | 提醒 / 天气 / 推荐 / 聊天 | 日程管理 / 菜谱 / 用药提醒 |
| 娃娃联网 | 仅 BLE,依赖手机 | Wi-Fi 模块(ESP32),娃娃可直连后端 |
当前 App 与后端之间使用 HTTPS 传输音频,存在连接建立开销和头部冗余,不利于双向流式传输。
| 当前 | HTTPS 请求/响应,串行 ASR → Agent → TTS |
| 优化后 | WebSocket 双向流,流式 ASR → 流式 Agent → 流式 TTS |
| 延迟收益 | 首字响应时间可缩短 30-50% |
老人手机极易遇到网络断开或 App 被杀后台的情况。对语音交互而言,"没反应"比"报错"更致命——老人会以为娃娃坏了。
| 断网场景 | 播放预置音频"连不上网,请检查手机" |
| App 被杀 | 娃娃播放"手机好像休息了,帮我看看" |
| BLE 断连 | 娃娃内置蜂鸣提示音(硬件层) |
老人语音中可能涉及健康状况、家庭住址、家庭矛盾等敏感信息。直接将带个人标识的数据发给外部 ASR/LLM 存在隐私合规风险。
| 过滤内容 | 姓名、电话、地址、身份证、银行卡、疾病诊断 |
| 处理方式 | 正则替换为占位符(如 [姓名] [电话]) |
| 位置 | 后端服务 → Agent 之间,或 Agent → LLM 之前 |
BLE 网关模式将手机 App 作为音频中转站,强依赖 Foreground Service + WakeLock。国内深度定制 Android 系统(华为、小米、OPPO)对后台查杀非常激进,单靠应用层保活难以保证 100% 稳定。
| 一期 | BLE → 手机 → 后端(手机是必需中转) |
| 二期 | Wi-Fi → 后端(手机变为可选) |
| 成本 | ESP32 模组 ~¥5-8,可选保留 BLE 双通道 |