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

15 KiB
Raw Blame History

量产版综合解决方案:媒体直连、任务网关、账本结算与代理兜底

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. 方案全貌

设备
  │
  ├─ 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_idlease_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. 风控规则清单

这六样补齐后,就可以直接拆给开发排期了。