Files
boss/docs/source-material/量产版综合解决方案_媒体直连任务网关账本结算.md
2026-03-26 23:16:56 +08:00

769 lines
15 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.

# 量产版综合解决方案:媒体直连、任务网关、账本结算与代理兜底
## 1. 文档定位
这份文档是基于前面讨论进一步收敛出来的一版“量产优先”的综合方案。
目标不是追求理论上最轻,而是在下面几个维度同时拿到更好的平衡:
- 开发更便捷
- 安全性更高
- 更适合商业化和量产
- 不明显影响用户体感
- 服务器压力尽量小
这份方案相对于“设备直接调用方舟文本 API + 业务 token 切片”的版本,做了一个关键收敛:
`不让设备长期持有可直接消费方舟文本推理能力的真实主能力。`
也就是说:
- 媒体面尽量直连云侧
- AI 任务面由你的服务端托管
- 配额、续权、计量、结算由你的服务端统一掌控
- 长任务保留代理通道做兜底
---
## 2. 最终推荐结论
如果你要做量产交付,我建议采用这一版架构:
`媒体直连 + 任务网关 + 配额账本 + 长任务代理兜底`
一句话解释:
1. 设备可以直连低延迟媒体链路
2. 设备不直接持有长期方舟文本 API 能力
3. 所有高价值 AI 任务由你的服务端创建、放行、续权、停止和结算
4. 用户侧卖套餐能力,不直接卖 token
5. 用量以云侧回流为最终结算依据
这是我认为更适合商业化量产的原因:
- 对设备端更友好,开发边界更清晰
- 对服务端更可控,后续改套餐和风控不用动设备协议
- 对用户体感更稳,可以做自然边界续写和无感续权
- 对财务和运营更友好,能做账本、对账、客服排障和渠道分账
---
## 3. 为什么不直接沿用网页最后那套方案
网页最后那套方案的核心优点是:
- 链路短
- 服务器流量小
- 设备直连,用户体感好
但量产时它有四个硬伤:
### 3.1 设备端不可信
只要设备能直接消费方舟文本能力,理论上就总会面临:
- 固件被逆向
- 协议被重放
- 授权被抽取
- 请求被伪造
- 套餐控制被绕过
### 3.2 开发复杂度其实不低
看起来是“直连更轻”,但如果真的要补齐:
- 细粒度计量
- 低水位续权
- 中断恢复
- 长故事续写
- 用量回补
- 审计和客服排障
设备端和服务端两边都会变复杂。
### 3.3 商业化边界不够清晰
一旦你要支持:
- 不同套餐
- 多设备共享
- 家庭账户
- 渠道/OEM
- 试用版与正式版
- 企业版和标准版
“设备直连 + 业务 token 切片”会越来越难维护。
### 3.4 结算闭环不够硬
真正能拿来做最终扣费和纠纷处理的,不能是设备估算,必须是云侧真实用量。
如果设备可以绕开你的任务控制面,后续审计很容易出灰区。
---
## 4. 设计目标与非目标
### 4.1 设计目标
1. 用户说话和收听时延保持低
2. 套餐额度、续权和停用由你自己掌控
3. 设备端协议尽量稳定,后续套餐和规则升级尽量不改设备逻辑
4. 结算必须可追溯、可回放、可纠偏
5. 支持 1000 台到 1 万台设备平滑扩展
6. 支持后续做渠道版和企业版
### 4.2 非目标
1. 不追求所有能力都完全绕开服务端
2. 不追求把所有 token 精确暴露给最终用户
3. 不追求第一版就做极致复杂的租户隔离
---
## 5. 方案全貌
```text
设备
├─ 1. 设备认证 / 会话启动 / 续权 / 心跳
│ 走你的任务网关
├─ 2. RTC / 音频 / 媒体
│ 尽量直连云侧
└─ 3. 文本生成 / 故事生成 / 高价值任务
走你的任务网关或代理通道
你的服务端
├─ 设备身份中心
├─ 用户与套餐中心
├─ 任务网关
├─ 续权中心
├─ 配额账本
├─ 风控中心
├─ 用量归因与结算中心
└─ 运营与报表后台
云侧
├─ RTC / 媒体服务
├─ 方舟模型服务
└─ usage / task / bill 回流能力
```
---
## 6. 核心设计原则
### 6.1 媒体和任务分离
不要把“低延迟媒体链路”和“高价值 AI 计费链路”混成一个面。
建议划分:
- 媒体链路:尽量直连,追求低延迟
- 任务链路:服务端托管,追求控制权
### 6.2 设备侧只保存短期能力
设备最多保存:
- 设备身份凭证
- 当前会话的短期租约
- 当前任务的临时句柄
设备侧不应该保存:
- 长期主 API Key
- 可跨任务复用的高价值主能力
### 6.3 套餐卖能力,不卖底层计费单位
对用户展示:
- 月度陪伴时长
- 月度故事次数
- 高级模型次数
- 家庭共享设备数
内部映射:
- 预算单位
- 账本流水
- 云侧真实成本
### 6.4 真正的结算只认云侧回流
设备侧心跳和事件上报只能辅助判断:
- 在线状态
- 故障定位
- 体验追踪
不能拿来做最终结算真相。
---
## 7. 核心对象模型
### 7.1 设备身份
用于唯一识别一台量产设备。
建议字段:
- `device_id`
- `product_id`
- `firmware_version`
- `device_public_key`
- `activation_status`
- `risk_level`
### 7.2 用户订阅
用于控制套餐和可用能力。
建议字段:
- `user_id`
- `plan_id`
- `plan_start_at`
- `plan_end_at`
- `monthly_budget_units`
- `daily_budget_units`
- `max_active_devices`
- `max_active_sessions`
### 7.3 会话
一段连续的用户使用周期。
建议字段:
- `session_id`
- `device_id`
- `user_id`
- `session_type`
- `status`
- `started_at`
- `last_seen_at`
- `closed_at`
- `close_reason`
### 7.4 任务租约
这是这套方案的核心对象。
它不是云厂商 token而是你自己的业务租约。
建议字段:
- `lease_id`
- `session_id`
- `user_id`
- `device_id`
- `task_type`
- `granted_units`
- `consumed_units_estimate`
- `soft_threshold`
- `hard_threshold`
- `grace_units`
- `expires_at`
- `state`
### 7.5 账本流水
所有额度变化必须流水化,而不是只存一份余额。
流水类型建议:
- `reserve`
- `consume`
- `release`
- `grace_consume`
- `refund`
- `manual_adjust`
- `settlement_delta`
---
## 8. 架构分层
## 8.1 设备侧模块
设备端建议只保留下面这些稳定模块:
1. 设备身份模块
- 保存设备身份和短期租约
2. 会话管理模块
- 开始、续权、结束、重连
3. 媒体模块
- 处理音频输入输出
4. 本地缓存与播放模块
- 缓冲流式文本、缓冲 TTS 播放
5. 状态上报模块
- 心跳、弱网状态、任务阶段
设备端不要自己做:
- 复杂套餐计算
- 最终结算
- 风控决策
- 多租户逻辑
## 8.2 服务端模块
### A. 设备身份中心
负责:
- 设备注册
- 激活
- 黑名单
- 固件版本治理
### B. 用户与套餐中心
负责:
- 订阅档位
- 套餐预算
- 设备绑定
- 家庭共享
- 试用和正式套餐切换
### C. 任务网关
负责:
- 会话启动
- AI 任务创建
- 模型路由
- 文本流式输出代理
- 任务停止与取消
### D. 续权中心
负责:
- 低水位续租
- 授权回收
- 租约失效
- 自然边界停机
### E. 配额账本
负责:
- 预算预占
- 实时估算扣减
- 最终结算
- 退款和纠偏
### F. 风控中心
负责:
- 单设备单活会话
- 请求速率限制
- 异常续权检测
- 风险分级处理
### G. 用量归因中心
负责:
- 接收云侧 usage 回流
- 归因到用户、设备、会话、任务
- 和账本做差异修正
---
## 9. 核心流程设计
## 9.1 设备激活
1. 设备首次启动,调用 `/device/activate`
2. 服务端下发设备身份和初始化配置
3. 设备绑定用户
4. 建立设备和用户关系
结果:
- 后续所有会话都可以挂到 `device_id + user_id`
## 9.2 开始一次会话
1. 设备调用 `/sessions/open`
2. 服务端校验:
- 设备有效
- 用户有效
- 套餐有效
- 当前并发不超限
- 风控未触发
3. 服务端创建 `session`
4. 服务端预占一笔预算
5. 服务端签发第一段 `lease`
6. 设备拿到可用会话句柄开始交互
## 9.3 正常生成
短任务流程:
1. 设备把请求发到你的任务网关
2. 任务网关决定模型、上下文、预算和任务类型
3. 任务网关调用云侧模型
4. 服务端把流式文本回给设备
5. 设备边播边显示
为什么这里不直接让设备调用云侧文本 API
- 服务端才能稳定插入套餐控制
- 服务端才能统一做日志和风控
- 文本流量很小,代理成本远低于媒体流代理
## 9.4 低水位续租
设备本地不做最终计费,但可以做“估算预警”。
建议策略:
1. 当前租约只发一小段预算
2. 设备端收到服务端回传的预算阈值
3. 消费逼近低水位时,后台调用 `/leases/renew`
4. 服务端再次检查套餐余额和风险状态
5. 若可续,则下发下一段租约
6. 当前任务不阻塞
## 9.5 长故事续写
长故事和长文本不要按“耗尽就停”处理,而要按自然边界处理。
建议流程:
1. 服务端把故事拆成片段目标
2. 每一片都有独立租约预算
3. 到片尾或句尾时判断是否续租
4. 续租成功则继续下一片
5. 续租失败则在当前片自然结束时收口
这样用户的感知会明显更好。
## 9.6 grace quota 机制
为了避免“生成到一半突然断”,建议每个高价值任务都预留一小段 `grace_units`
含义:
- 正常额度用完后,不立刻砍掉
- 允许把当前句、当前段或当前故事片收完
- 收完后再提示继续购买或等待下周期恢复
这部分一定要小,避免被长期滥用。
## 9.7 异常中断与重连
设备断网时:
1. 设备缓存最近的 `session_id``lease_id`
2. 恢复后调用 `/sessions/resume`
3. 服务端判断:
- 会话是否仍有效
- 租约是否仍有效
- 是否需要补发一段租约
## 9.8 结束与结算
1. 任务完成或用户主动结束
2. 设备调用 `/sessions/close`
3. 服务端标记会话结束
4. 云侧 usage 回流到服务端
5. 用量归因中心做最终结算
6. 账本释放未用完预占
7. 记录最终账单明细
---
## 10. 用户体验设计原则
## 10.1 不把续权做成显式动作
不要让用户看到:
- “正在续费中”
- “额度同步中”
- “请等待 token 刷新”
用户侧应该只感知:
- 正常继续
- 自然结束
- 结束后再提示套餐不足
## 10.2 所有中断都尽量在自然边界发生
自然边界包括:
- 一句话结束
- 一段故事结束
- 一轮语音回复结束
- 一个章节结束
## 10.3 设备侧必须有最小缓冲
为了避免轻微抖动造成体感卡顿,设备侧要有:
- 流式文本缓冲
- TTS 音频缓冲
- 最近一次租约状态缓存
## 10.4 续权失败的用户提示
不要提示“token 不足”。
建议提示业务语言:
- “本月故事额度已用完”
- “当前套餐已达上限”
- “请升级套餐继续使用”
---
## 11. 安全设计
## 11.1 基线原则
1. 设备不保存长期方舟主密钥
2. 所有租约都短期有效
3. 每次请求都有唯一 `request_id`
4. 设备请求必须带签名和时间戳
5. 所有可重放请求都要有去重机制
## 11.2 强制做的风控规则
- 单设备单活会话
- 单用户并发设备数限制
- 单 IP / 单设备 / 单账号速率限制
- 短时间异常高频续租熔断
- 固件版本黑名单
- 风险设备强制切代理通道
## 11.3 审计能力
至少保留以下审计链:
- 设备请求日志
- 会话启动日志
- 租约签发日志
- 云侧任务日志
- usage 回流日志
- 最终结算流水
这样客服和财务才能查账。
---
## 12. 商业化设计
## 12.1 用户侧套餐表达
建议对用户卖下面这些能力包:
- 基础版:短问答 + 基础陪伴
- 标准版:更多陪伴时长 + 更多故事次数
- 高级版:长故事、优先模型、更高并发家庭设备数
- 企业版:独立策略、独立配额池、独立报表
## 12.2 内部结算单位
内部不要只用一个 token 概念,建议统一成 `budget_units`
映射规则举例:
- 1 次短问答 = X units
- 1 分钟语音陪伴 = Y units
- 1 次长故事片段 = Z units
真实云侧成本回来后,再做误差校准。
## 12.3 渠道/OEM 预留
从第一版就建议预留:
- `tenant_id`
- `channel_id`
- `plan_catalog`
- `billing_group`
这样以后做渠道版不用重构核心账本。
---
## 13. 数据模型建议
建议至少落下面这些表:
1. `device_registry`
2. `device_binding`
3. `user_subscription`
4. `plan_catalog`
5. `session`
6. `lease`
7. `quota_ledger`
8. `vendor_task`
9. `vendor_usage_raw`
10. `usage_settlement`
11. `risk_event`
12. `ops_adjustment`
### 核心关系
- 一个用户可以绑定多台设备
- 一台设备同一时刻只允许一个活跃主会话
- 一个会话可以有多段租约
- 多段租约统一归并到一次最终结算
---
## 14. 接口建议
第一版建议只做下面这组接口。
### 设备侧接口
- `POST /device/activate`
- `POST /device/login`
- `POST /sessions/open`
- `POST /sessions/heartbeat`
- `POST /leases/renew`
- `POST /sessions/close`
- `POST /sessions/resume`
### 云侧回调接口
- `POST /vendor/callback/task`
- `POST /vendor/callback/usage`
- `POST /vendor/callback/bill`
### 运营后台接口
- `POST /ops/device/blacklist`
- `POST /ops/session/terminate`
- `POST /ops/quota/adjust`
- `GET /ops/user/usage`
- `GET /ops/device/history`
---
## 15. 服务器压力控制思路
这套方案比全量代理轻,原因在于:
1. 媒体流不走你的服务端
2. 文本流量远小于音频/视频流量
3. 账本、续权、风控都是轻量 JSON 请求
4. usage 回流是异步的,不阻塞主链路
推荐压测关注点:
- `sessions/open`
- `leases/renew`
- 流式文本转发连接数
- usage 回调写库速度
- Redis 热键和并发锁
推荐基础组件:
- API 网关
- 应用服务
- Redis
- MySQL 或 PostgreSQL
- MQ
- 对象存储
- 可观测系统
---
## 16. 分阶段落地建议
## 第一阶段:可上线 MVP
先做:
- 设备激活
- 用户绑定
- 套餐档位
- 会话启动
- 低水位续租
- 单设备单活会话
- usage 回流
- 账本结算
## 第二阶段:量产增强
再补:
- 渠道/OEM
- 家庭账户
- 黑名单和熔断
- 运营后台
- 套餐促销和试用
## 第三阶段:企业化
最后补:
- 租户隔离
- SLA 分层
- 独立报表
- 分账能力
---
## 17. 这套方案最适合什么业务阶段
最适合:
- 正准备量产
- 需要卖套餐
- 设备长期在线
- 既有实时语音,也有高价值文本任务
- 后面可能要做渠道和企业客户
不那么适合:
- 纯内部测试 Demo
- 完全不考虑商业化
- 完全不在意设备破解风险
---
## 18. 最终建议
如果你要我给一个量产优先的单一结论,我的建议就是:
`不要做设备长期直连方舟文本 API。`
而要做:
`媒体直连 + 任务网关 + 配额账本 + 长任务代理兜底`
这是当前最平衡的一版:
- 比全量代理轻
- 比纯直连稳
- 比“设备直连 + 业务 token 切片”更适合量产和商业化
---
## 19. 后续建议继续补的文档
如果继续往下推进,下一批建议补:
1. 接口字段定义文档
2. 会话与租约状态机
3. 数据库表结构草案
4. 用户套餐与账本扣费规则
5. 异常流程和兜底时序图
6. 风控规则清单
这六样补齐后,就可以直接拆给开发排期了。