Files
story/docs/managed-memory-20260916.md
Codex Local bf1233d5df
ci / verify (push) Canceled after 0s
feat: expand companion platform, device controls, and memoir workflows
Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
2026-10-08 10:06:44 +08:00

83 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 聊天记录与老人记忆
> 2026-10-07 更新:用户已确认聊天应直接从火山 Viking 检索;平台回忆提取用于整理故事和回忆录。原来的“平台筛选后注入聊天”方式被替换,详见 [原生检索说明](native-viking-retrieval-20261007.md)。以下保留 2026-09-16 的实施记录。
## 现在的流程
1. 设备向平台请求开始聊天,平台查设备绑定的老人。
2. 平台把该老人的有效记忆加入其智能体的 S2S 对话配置,然后返回设备所需的聊天参数。
3. 设备直接与火山聊天。火山按照本次 `session_id` 把聊天文字回调给平台,平台保存聊天记录。
4. 设备报告结束。平台等待末尾字幕回调,后台把已收到的用户和助手文字上传到火山记忆库。
5. 火山异步提取记忆;平台读取结果,保存成小程序可查看、修改和删除的记忆。下一通聊天再带入。
设备不用另传整份聊天文字,也不用拿记忆库密钥。这次不需要重新烧录或重新绑定。
## 两份数据分别干什么
| 数据 | 保存位置 | 用途 |
| --- | --- | --- |
| 聊天记录 | 平台数据库 `call_utterance` | 家人查看原始对话,作为上传来源 |
| 火山提取的记忆 | 火山记忆库 `memory` 的 `event_v1` | 火山根据对话自动整理事实 |
| 可管理的记忆 | 平台 `curated_memory` / `memory_version` | 家人查看、纠正、停用、删除;作为下次聊天的资料 |
不同老人使用由“租户 ID + 老人 ID”生成的独立 `user_id`,查询和上传都限定该标识,不以设备编号当作老人记忆身份。换设备后仍跟随老人。
## 小程序
在家人的故事与记忆页面查看记忆。聊天结束后不是立即生成;处理期间会显示上传或提取状态。接口失败不会把已有列表隐藏。
人工修改优先,后台不会用原提取结果覆盖人工修改。删除、停用后不再带入新的聊天;后台同步处理火山对应事件。撤回授权停止上传,个人信息删除沿用平台现有删除流程。
## 运行条件
- 老人已授权“聊天记录保存”和“个性化记忆”,设备仍按原流程绑定。
- API、worker 使用已有 `VIKING_MEMORY_RESOURCE_ID`、`VIKING_MEMORY_API_KEY_FILE`、事件类型配置。
- 数据库新增迁移 `000067_managed_call_memory`,记录上传进度和云端事件对应关系;上传或查询失败自动重试。
- 已结束且仍有授权、仍保存文字的旧直连聊天会自动补传。不补造缺失的聊天记录。
本方案使用火山提取事件记忆,不依赖平台另配 ARK 文本提取模型;不另外自动生成 `profile_v1`。老人偏好等事实也可以包含在事件记忆中。
`MemoryConfig.Enable` 仍为 `false`,这是有意的:纯 S2S 使用平台整理后的资料注入,避免云端直接检索绕过家人的修改、停用和删除。不要仅为“启用记忆”把这个开关打开。
## 状态接口
`POST /api/v1/memories/sync/status`(使用已有小程序登录凭证)
输入:`{"elder_id":"老人公开ID"}`。
在原有返回字段上增加:
| 输出字段 | 含义 |
| --- | --- |
| `upload_pending_count` | 等待上传的通话数 |
| `extracting_count` | 已上传,尚未读取到记忆结果的通话数 |
| `synced_call_count` | 已读取到记忆结果的通话数 |
| `error_code` | 最近的同步错误码;后台继续重试 |
`SYNCED` 表示已取到记忆,不代表火山保证提取全部结束;没有新事实的聊天可能一直没有提取结果。平台保留聊天记录,不会凭空编造记忆。
## 当前边界
- 长期记忆由模型提取,可能遗漏或理解错误,家人可以纠正。
- 纯 S2S 每通开始时带入近期有效记忆,当前沿用约 1000 字符的上下文预算;并非把全部历史聊天无限塞入模型,也不是通话中随问随查全部历史的检索系统。
- 单通上传最多 1000 条文字消息;超限会保留原文并标记 `TRANSCRIPT_TOO_LARGE`,不静默截断。
- 回调只有收到的文字才能入库;中断造成的缺失字幕无法恢复。迟到回调按新的文字版本补传,同一会话重试使用稳定云端会话 ID。
## 已做的验证
- 独立测试数据库:上传失败重试、重复读取去重、跨老人结果排除、自动记忆在家人页面可见、下一次聊天带入记忆、修改同步、删除不复活、撤回授权清理。
- 火山真实接口使用独立测试身份完成上传、提取、更新、单条删除和按测试身份清理;未写入真实老人测试事实。
- 设备接口和固件均保持不变。
## 上线结果(2026-09-16)
- 后端版本 `0.93.1-rc.memory1` 已部署到 `82.157.201.114`,数据库迁移到 67;切换前已备份。
- API、callbacks、worker 均正常运行,健康检查通过。
- 当前 COM6 绑定的老人“姥姥”:4 通有效历史对话完成补传,生成 6 条记忆,6 条同步任务可见,无上传错误。另有 6 通缺少用户或助手正文的通话被跳过,未编造记忆。
- 后端全量 Go 测试通过;4 个核心模块使用隔离数据库完成集成测试;小程序 97 项测试通过,原生 WXML 检查家人资料和家庭成员页面正常。
- 火山真实测试仅写入独立联调身份,测试事件已删除并查询确认无剩余。
- 小程序状态提示改动在 `C:\Users\19926\WeChatProjects\voicelink`,需要重新编译/上传体验版才会出现在手机上。
- 尚未代替用户进行上线后的实体设备主观语音记忆验收;自动化测试已验证新通话配置会带入该老人的记忆。
接口参考:[上传会话 AddSession](https://www.volcengine.com/docs/84313/1783353?lang=zh)、[事件检索](https://www.volcengine.com/docs/84313/2100967)。