docs: add avatar takeover chat design spec
This commit is contained in:
@@ -0,0 +1,284 @@
|
||||
# 数字分身接管聊天功能 — 设计文档
|
||||
|
||||
## 1. 概述
|
||||
|
||||
### 1.1 背景
|
||||
当前数字分身应用中,分身只能与主人一对一聊天。用户希望分身能在主人授权下,接管主人在会会平台上的聊天(单聊和群聊),替主人与他人对话。
|
||||
|
||||
### 1.2 目标
|
||||
- 主人可在授权管理页面开启"分身接管聊天"功能
|
||||
- 支持两种接管模式:立即接管、延迟接管(N 秒后)
|
||||
- 分身回复优先使用知识库(QA 问答对 + 文档向量搜索)
|
||||
- 支持单聊和群聊两种场景
|
||||
- 以主人身份发送回复,对方无感知
|
||||
|
||||
### 1.3 技术基础
|
||||
- 会会平台使用网易云信作为 IM 底层
|
||||
- 已有接口:`/api/im/netease`(获取云信凭证)、`/api/v2message/push/record/*`(消息推送)
|
||||
- 已有分身聊天接口:`POST /api/avatar/{id}/chat`
|
||||
|
||||
---
|
||||
|
||||
## 2. 架构设计
|
||||
|
||||
### 2.1 整体架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ 会会平台 (网易云信) │
|
||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
|
||||
│ │ 单聊 P2P │ │ 群聊 Group │ │ 消息推送 Push │ │
|
||||
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
|
||||
└──────────────────────┬──────────────────────────────────┘
|
||||
│ HTTP API
|
||||
──────────────────────▼──────────────────────────────────┐
|
||||
│ 分身接管服务 (Avatar Takeover Service) │
|
||||
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │
|
||||
│ │ 消息监听器 │ │ 接管决策器 │ │ 回复执行器 │ │
|
||||
│ └──────────────┘ ──────────────┘ └───────────────┘ │
|
||||
│ ┌──────────────────────────────────────────────────┐ │
|
||||
│ │ Redis 延迟队列 │ │
|
||||
│ └──────────────────────────────────────────────────┘ │
|
||||
└──────────────────────┬──────────────────────────────────┘
|
||||
│ 调用现有接口
|
||||
┌──────────────────────▼──────────────────────────────────┐
|
||||
│ 数字分身应用 │
|
||||
│ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │
|
||||
│ │ 授权管理 UI │ │ 分身聊天 API │ │ 知识库 │ │
|
||||
│ └──────────────┘ └──────────────┘ └───────────────┘ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 模块划分
|
||||
|
||||
| 模块 | 位置 | 职责 |
|
||||
|------|------|------|
|
||||
| 接管配置 | 授权管理页面 + authorizations 表 | 存储接管开关、模式、延迟秒数 |
|
||||
| 消息监听器 | 后端定时任务 | 轮询网易云信消息,发现新消息 |
|
||||
| 接管决策器 | 后端服务 | 判断是否接管、立即还是延迟 |
|
||||
| 回复执行器 | 后端服务 | 调用分身聊天接口生成回复,以主人身份发送 |
|
||||
| 延迟队列 | Redis | 存储待处理消息,实现延迟接管 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 数据模型
|
||||
|
||||
### 3.1 扩展 Authorization 表
|
||||
|
||||
在现有 `authorizations` 表基础上新增字段:
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `takeover_enabled` | BOOLEAN | 是否开启分身接管聊天 |
|
||||
| `takeover_mode` | VARCHAR | 接管模式:`immediate`(立即)/ `delayed`(延迟) |
|
||||
| `takeover_delay_seconds` | INTEGER | 延迟秒数(仅 delayed 模式有效),默认 30 |
|
||||
|
||||
**权限关联**:
|
||||
- `permissions` 数组中包含 `"takeover"` 时,表示该授权允许分身接管
|
||||
- `target_type = "user"` 且 `permissions` 含 `"takeover"` → 单聊接管
|
||||
- `target_type = "organization"` 或群聊相关 → 群聊接管
|
||||
|
||||
### 3.2 Redis 数据结构
|
||||
|
||||
```
|
||||
# 延迟消息队列
|
||||
takeover:delayed:{owner_accid}:{message_id} = {
|
||||
"avatar_id": "...",
|
||||
"from_accid": "...",
|
||||
"content": "...",
|
||||
"chat_type": "p2p|group",
|
||||
"chat_id": "...",
|
||||
"timestamp": 1234567890
|
||||
}
|
||||
TTL = takeover_delay_seconds + 10
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 核心流程
|
||||
|
||||
### 4.1 消息监听流程
|
||||
|
||||
```
|
||||
┌──────────┐ ┌──────────────┐ ┌──────────────┐
|
||||
│ 定时任务 │────►│ 轮询 Push API │────►│ 获取未读消息 │
|
||||
└──────────┘ └──────────────┘ └──────┬───────┘
|
||||
│
|
||||
┌─────────▼─────────┐
|
||||
│ 遍历每条新消息 │
|
||||
└─────────┬─────────┘
|
||||
│
|
||||
┌─────────▼─────────┐
|
||||
│ 查询主人授权配置 │
|
||||
└─────────┬─────────┘
|
||||
│
|
||||
┌───────────────────┼───────────────────┐
|
||||
│ │ │
|
||||
┌─────▼─────┐ ┌──────▼────── ┌──────▼──────┐
|
||||
│ 未开启接管 │ │ 立即接管模式 │ │ 延迟接管模式 │
|
||||
└───────────┘ └──────┬──────┘ └──────┬──────┘
|
||||
│ │
|
||||
┌─────────▼─────────┐ ┌────▼────
|
||||
│ 立即调用分身回复 │ │ 写入延迟 │
|
||||
───────────────────┘ │ 队列 │
|
||||
└─────────┘
|
||||
```
|
||||
|
||||
### 4.2 延迟接管流程
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────────┐
|
||||
│ 消息写入 Redis 延迟队列 (TTL = delay_seconds + 10) │
|
||||
└────────────────────────┬─────────────────────────────────┘
|
||||
│
|
||||
│ 延迟期间
|
||||
│
|
||||
┌─────────▼─────────┐
|
||||
│ 主人是否有回复? │
|
||||
└─────────┬─────────┘
|
||||
────┴────┐
|
||||
│ │
|
||||
┌─────▼──┐ ┌───▼────
|
||||
│ 有回复 │ │ 无回复 │
|
||||
└──┬─────┘ └───┬────┘
|
||||
│ │
|
||||
┌─────▼─────┐ ───▼──────────────┐
|
||||
│ 删除队列 │ │ TTL 到期触发 │
|
||||
│ 不接管 │ │ 调用分身回复 │
|
||||
───────────┘ └──────────────────
|
||||
```
|
||||
|
||||
### 4.3 回复生成流程
|
||||
|
||||
```
|
||||
┌────────────────────┐
|
||||
│ 收到他人消息内容 │
|
||||
└─────────┬──────────┘
|
||||
│
|
||||
┌─────────▼──────────┐
|
||||
│ 查找主人的分身 │
|
||||
│ (按 owner_id 匹配) │
|
||||
└─────────┬──────────
|
||||
│
|
||||
┌─────────▼──────────┐
|
||||
│ 调用分身聊天接口 │
|
||||
│ POST /api/avatar/ │
|
||||
│ {id}/chat │
|
||||
│ 优先:QA 问答对 │
|
||||
│ 其次:知识库文档 │
|
||||
│ 最后:Qwen 生成 │
|
||||
└─────────┬──────────┘
|
||||
│
|
||||
┌─────────▼──────────
|
||||
│ 以主人身份发送回复 │
|
||||
│ 通过网易云信 API │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. API 设计
|
||||
|
||||
### 5.1 授权管理增强
|
||||
|
||||
**PUT /api/avatar/{avatar_id}/authorizations/takeover**
|
||||
|
||||
请求体:
|
||||
```json
|
||||
{
|
||||
"authorization_id": "授权记录ID",
|
||||
"takeover_enabled": true,
|
||||
"takeover_mode": "delayed",
|
||||
"takeover_delay_seconds": 30
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 消息监听(内部接口)
|
||||
|
||||
**POST /api/internal/takeover/process**
|
||||
|
||||
由定时任务调用,无需认证。
|
||||
|
||||
请求体:
|
||||
```json
|
||||
{
|
||||
"owner_accid": "主人网易云信账号",
|
||||
"messages": [
|
||||
{
|
||||
"msg_id": "消息ID",
|
||||
"from_accid": "发送者账号",
|
||||
"content": "消息内容",
|
||||
"chat_type": "p2p",
|
||||
"chat_id": "会话ID",
|
||||
"timestamp": 1234567890
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 5.3 网易云信消息发送
|
||||
|
||||
复用现有网易云信 API 封装,新增单聊消息发送方法:
|
||||
|
||||
**POST /im/netease/message/send/p2p**
|
||||
|
||||
请求体:
|
||||
```json
|
||||
{
|
||||
"from_accid": "主人账号",
|
||||
"to_accid": "对方账号",
|
||||
"content": "回复内容",
|
||||
"msg_type": "text"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 错误处理
|
||||
|
||||
| 场景 | 处理方式 |
|
||||
|------|---------|
|
||||
| 分身聊天接口调用失败 | 记录日志,不回复,下次继续监听 |
|
||||
| 网易云信发送失败 | 重试 3 次,失败后记录日志 |
|
||||
| 主人有多个分身 | 取第一个 active 状态的分身 |
|
||||
| 知识库无匹配内容 | 使用 Qwen 兜底生成回复 |
|
||||
| Redis 连接失败 | 降级为立即接管模式 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 配置项
|
||||
|
||||
在 `SystemConfig` 表中新增配置:
|
||||
|
||||
| 配置 key | 说明 | 默认值 |
|
||||
|---------|------|-------|
|
||||
| `takeover_poll_interval` | 消息轮询间隔(秒) | 10 |
|
||||
| `takeover_default_delay` | 默认延迟秒数 | 30 |
|
||||
| `takeover_retry_times` | 发送重试次数 | 3 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 测试要点
|
||||
|
||||
1. **功能测试**
|
||||
- 立即接管:收到消息后立即由分身回复
|
||||
- 延迟接管:主人 N 秒内回复则不分身接管,超时则分身回复
|
||||
- 知识库优先:QA 问答对精确匹配优先返回
|
||||
|
||||
2. **边界测试**
|
||||
- 主人有多个分身时的选择逻辑
|
||||
- 知识库为空时的 Qwen 兜底
|
||||
- 网易云信 API 异常时的降级
|
||||
|
||||
3. **性能测试**
|
||||
- 轮询频率对服务器负载的影响
|
||||
- Redis 延迟队列的内存占用
|
||||
|
||||
---
|
||||
|
||||
## 9. 后续扩展
|
||||
|
||||
- Webhook 回调替代轮询(需要会会平台支持)
|
||||
- 多分身协同接管
|
||||
- 接管历史记录和统计
|
||||
- 接管效果评估和优化
|
||||
Reference in New Issue
Block a user