83 lines
5.7 KiB
Markdown
83 lines
5.7 KiB
Markdown
# 聊天记录与老人记忆
|
||||
|
|
|
|||
|
|
> 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)。
|