hyapp-server/docs/幸运礼物产品文档.md
2026-06-25 23:35:44 +08:00

308 lines
12 KiB
Markdown
Raw 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.

# 幸运礼物 · 必爆隐藏奖池产品方案6.25 版)
## 文档信息
| 项 | 内容 |
| --- | --- |
| 版本 | v1.0 |
| 日期 | 2026-06-25 |
| 范围 | 语音房幸运礼物的新一版产品与算法方案 |
| 状态 | 产品方案,不能直接等同于当前代码已上线能力 |
目标是在语音房送礼场景里提供一个极简、高方差、长期自平衡的幸运礼物系统。用户侧只感知“送礼 -> 开奖 -> 结果表现”,后台通过隐藏奖池完成持续喂池和必然爆池。平台先抽水,剩余资金进入小奖反馈层和隐藏奖池层,所有开奖必须可审计、可重放。
## 1. 项目背景与目标
### 1.1 背景
用户发送幸运礼物后,需要马上获得强反馈。传统固定倍数或简单随机容易出现长时间无大奖、低波动、低传播的问题,用户会认为玩法“干等”或“不刺激”。新方案用三层反馈叠加:
- 高频小奖让每次送礼都有反馈。
- 稀有大奖制造黑天鹅惊喜。
- 必爆隐藏奖池保证在可控贡献量内一定出现大额 payout。
### 1.2 核心目标
| 目标 | 说明 |
| --- | --- |
| 用户侧 | 每次送礼都有独立开奖体验,高频小奖、稀有大奖和必爆大奖叠加。 |
| 平台侧 | 每笔先抽水,剩余奖池自平衡,不允许平台倒贴。 |
| 长期循环 | 通过“持续喂池 -> 必然爆池 -> 留底滚动”形成可持续戏剧性循环。 |
| 认知成本 | 用户端不展示复杂池子、爆点和概率,只触发送礼并接收结果。 |
| 审计公平 | 每次开奖记录 before/after、随机因子、trigger 状态和结果,支持事后重放。 |
### 1.3 成功标准
- 单次 100 金礼物的玩家侧期望返还约为 75-78 金。
- 必爆机制保证在可控贡献量内一定出现大额 payout。
- 大奖释放后隐藏奖池仍保留 52%-68% 底池,继续滚雪球。
- 内部账号、机器人和主播测试流量不能真实消耗 J Fund。
## 2. 核心设计理念
### 2.1 三层爽感
| 层级 | 机制 | 产品意义 |
| --- | --- | --- |
| 高频层 S Fund | 超过 58% 概率获得正返还。 | 维持连续发送行为,避免每次都空。 |
| 稀有大奖层 J Fund | 1% 概率按隐藏池百分比释放。 | 形成不可预测的大额惊喜。 |
| 必然爆发层 Must-Hit | 隐藏爆点强制释放 32%-48% 奖池。 | 消除长期干等,完成喂池到爆池的闭环。 |
### 2.2 隐藏与独立
- 公共奖池状态、爆点和当前周期不对客户端展示。
- S Fund 与 J Fund 独立 roll小奖层 Miss 不影响大奖层触发。
- 每次送礼都先形成完整开奖事实,再由表现层展示结果。
### 2.3 平台零风险
- 每笔送礼先扣平台抽水。
- J Fund payout 只能按比例释放,并受留底、单次上限和风控上限约束。
- 奖池余额不足时不能透支,必须降级为可支付结果或 Miss。
## 3. 资金流与数学模型
每送 100 金单位礼物,资金拆分如下:
| 去向 | 金额 | 占比 |
| --- | ---: | ---: |
| 平台抽水 | 22 金 | 22% |
| S Fund 小奖反馈 | 28 金 | 28% |
| J Fund 隐藏奖池 | 50 金 | 50% |
长期口径:
- 平台固定收益22 金。
- S Fund 期望返还:约 22.84 金,利用率约 81.6%。
- J Fund payout 长期受控在总贡献 50% 以内,依赖分段释放比例、必爆上限和留底。
- 玩家侧综合期望返还约为 75.84 金,符合社交礼物玩法的健康区间。
## 4. 开奖算法
### 4.1 S Fund 小奖反馈层
S Fund 使用 Alias Method 做 O(1) 采样。金额使用连续均匀分布,避免固定值被用户感知为机械规律。
| Tier | 概率 | 返还金额 | 期望贡献 |
| --- | ---: | ---: | ---: |
| Miss | 42% | 0 | 0 |
| 小回血 | 32% | Uniform[8, 18] | 4.16 |
| 中回血 | 16% | Uniform[25, 45] | 5.60 |
| 好奖 | 7% | Uniform[60, 120] | 6.30 |
| 大回血 | 3% | Uniform[150, 280] | 6.45 |
期望值:
```text
E[S] = 0.32 * 13 + 0.16 * 35 + 0.07 * 90 + 0.03 * 215
= 22.51
```
说明:原始方案中的 `22.84` 与表格均值直接计算不完全一致。按当前表格区间中点计算是 `22.51`。如果产品口径必须锁定 `22.84`,需要微调某一档金额区间或概率后再进入实现。
### 4.2 J Fund 基础隐藏奖池层
每次送礼原子增加 50 金到 J Fund。J Fund 与 S Fund 独立开奖。
基础触发:
- 触发概率1.0%。
- 获奖金额:`win_J = J * r`
- 释放后:`J_new = J - win_J`,不清空奖池,保留自然底池。
释放比例按当前 J Fund 规模分段:
| J Fund 当前规模 | r 范围 |
| --- | --- |
| J < 200000 | Uniform[0.05, 0.10] |
| 200000 <= J < 500000 | Uniform[0.08, 0.15] |
| J >= 500000 | Uniform[0.12, 0.22] |
### 4.3 Must-Hit 必爆机制
周期初始化:
```text
T = J_current + Uniform[280000, 720000]
```
每次送礼按顺序执行:
1. `J = J + 50`
2. 如果 `J >= T` 且当前周期未触发,强制触发超级爆池。
3. 超级爆池金额为 `win_J = J * r`,其中 `r = Uniform[0.32, 0.48]`
4. 释放后 `J_new = J - win_J`,通常保留 52%-68% 底池。
5. 新周期爆点为 `T_new = J_new + Uniform[300000, 800000]`
参数依据:
- 28 万到 72 万爆点贡献区间用于覆盖热门房间约 40-120 分钟的心理窗口。
- 32%-48% 强制释放比例保证单次大奖冲击力,同时保留底池继续滚动。
## 5. 完整开奖流程
```text
on_lucky_gift(user_id, amount = 100):
platform_rake += 22
s_fund += 28
j_before = j_fund
j_fund += 50
s_win = roll_s_fund()
credit_user(user_id, s_win)
j_win = 0
forced = false
if j_fund >= current_trigger and current_cycle_not_triggered:
r = uniform(0.32, 0.48)
j_win = j_fund * r
j_win = apply_jackpot_caps(j_win, j_fund)
j_fund -= j_win
current_trigger = j_fund + uniform(300000, 800000)
forced = true
else if random() < 0.01:
r = get_r_by_pool_size(j_fund)
j_win = j_fund * r
j_win = apply_jackpot_caps(j_win, j_fund)
j_fund -= j_win
if j_win > 0:
credit_user(user_id, j_win)
write_audit_log(...)
```
必须注意:真实实现不能在抽奖事务里直接调用钱包入账。应先写开奖事实和 outbox再由 worker 幂等发奖,避免数据库事务和外部 RPC 混在一起。
## 6. 安全、公平与风控规则
| 规则 | 要求 |
| --- | --- |
| 单次上限 | `win_J = min(win_J, j_fund * 0.48, 500000)`。 |
| 个人累计上限 | 可选日/周 jackpot 累计封顶,防止洗钱和异常套利。 |
| 内部账号隔离 | internal、bot、host 测试账号只能走 S Fund 和模拟 J Fund不真实消耗 J Fund。 |
| 随机性 | 使用密码学安全 RNG每次记录 seed 或可验证随机材料,支持重放。 |
| 并发安全 | J Fund 更新必须在数据库事务内完成,使用行锁、版本号或分布式锁防止并发透支。 |
| 初始种子 | 新周期可注入 8 万到 15 万启动 J Fund计入营销成本或后期回收。 |
| 审计完整性 | 每笔记录 gift_id、user_id、room_id、j_before、j_after、s_win、j_win、forced_hit、random_seed、trigger、ts。 |
## 7. 参数配置与动态调优
### 7.1 推荐 v1.0 参数
| 参数 | 推荐值 | 调优方向 |
| --- | --- | --- |
| 平台抽水 | 22% | 不可低于 18%。 |
| S Fund 贡献 | 28% | 维持 E[S] 约 22.5-23.5。 |
| J Fund 贡献 | 50% | 核心滚雪球资金来源。 |
| 基础池奖概率 | 1.0% | 可在 0.6%-1.5% 调整。 |
| 必爆释放比例 | Uniform[0.32, 0.48] | 越高越激进,越低越耐久。 |
| 初始爆点范围 | Uniform[280000, 720000] | 礼物量越大,范围可越大。 |
| 新周期爆点范围 | Uniform[300000, 800000] | 大奖后重建周期,避免连爆过密。 |
### 7.2 动态微调
当 J Fund 过大时,可以轻微抬高基础大奖概率:
```text
p_base = 0.01 + min(0.004, (J - 500000) / 75000000)
```
动态调参必须写入规则版本或配置变更记录,不能只改运行内存,否则无法审计和复盘。
## 8. 预期效果与 KPI
| 维度 | 预期 |
| --- | --- |
| 用户行为 | 高频小奖维持发送频率,稀有大奖和必爆大奖制造传播峰值。 |
| 经济指标 | 平台抽水稳定J Fund 不透支,大额释放后仍有底池恢复能力。 |
| 风险指标 | 单用户单次/累计上限、内部账号隔离、完整审计降低套利和质疑。 |
| 长期循环 | 数学上保证喂池后一定爆发,形成持续正反馈循环。 |
## 9. 技术实施建议
### 9.1 后端落地顺序
1. 先实现资金原子更新、J Fund 周期状态、开奖事实和完整审计日志。
2. 再接入 outbox worker由钱包服务幂等入账。
3. 最后接入房间 IM、区域播报、后台配置、后台查询和监控告警。
### 9.2 服务边界
| 服务 | 职责 |
| --- | --- |
| room-service | 只负责送礼主链路、房间状态、Room Cell 和房间 outbox不拥有奖池。 |
| activity-service | 拥有幸运礼物规则、S Fund、J Fund、开奖事实、风控和发奖 outbox。 |
| wallet-service | 负责送礼扣费和幸运礼物返奖入账,保证幂等账务。 |
| statistics-service | 只消费事件写聚合表,不回查 owner service 明细表。 |
| server/admin | 提供参数配置、规则版本、开奖明细和统计查询入口。 |
### 9.3 必须支持热更新
以下参数需要后台配置并落规则版本:
- 平台抽水比例。
- S Fund 分布、概率和金额区间。
- J Fund 贡献比例。
- 基础大奖概率和分段释放比例。
- Must-Hit 爆点范围和释放比例。
- 单次、单用户、设备、房间、主播风控上限。
- 内部账号和机器人隔离规则。
### 9.4 监控告警
- J Fund 余额异常波动。
- 实际 win rate 与配置概率长期偏离。
- 单用户、单设备、单房间大额中奖集中。
- outbox 发奖积压或失败。
- 钱包返奖幂等冲突。
- 必爆周期长时间未重置或重复触发。
### 9.5 合规
上线前需要法务确认虚拟礼物概率玩法边界。客户端可以公开必要规则说明,但不能暴露隐藏奖池余额、当前爆点和触发进度。
## 10. 审计日志字段
每笔开奖至少记录:
| 字段 | 说明 |
| --- | --- |
| gift_id | 本次送礼或抽奖唯一 ID。 |
| command_id | 幂等命令 ID重试必须复用。 |
| user_id | 送礼用户。 |
| room_id | 房间 ID。 |
| target_user_id | 收礼用户。 |
| amount | 本次礼物真实扣费金额。 |
| s_before / s_after | S Fund 变更快照。 |
| j_before / j_after | J Fund 变更快照。 |
| s_win | S Fund 中奖金额。 |
| j_win | J Fund 中奖金额。 |
| forced_hit | 是否 Must-Hit 强制触发。 |
| trigger_before / trigger_after | 周期爆点变更。 |
| random_seed | 可验证随机材料。 |
| random_rolls | 本次所有随机 roll 明细。 |
| status | pending、granted、failed。 |
| created_at_ms | UTC epoch milliseconds。 |
## 11. 当前实现差距
本方案与当前仓库中的幸运礼物 v2 配置化 RTP 奖档模型不是同一个口径。进入技术实现前,需要明确是否替换现有 v2 主链路,或作为新 `pool_id` / 新规则版本并行上线。
必须确认的差距:
- 当前实现按 `pool_id`、规则版本、阶段奖档和 RTP 窗口抽奖;新方案按 S Fund、J Fund 和 Must-Hit 周期抽奖。
- 当前实现已有三层基础奖池和风控计数;新方案需要新增隐藏 J Fund 周期状态和强制爆点。
- 当前实现 worker 已支持异步发奖;新方案必须复用这个账务边界,不能把伪代码中的 `credit_user` 做成事务内 RPC。
- 当前统计只能消费事实事件写聚合表;新方案的 S/J payout 需要补充事件字段或独立统计读模型。
## 12. 版本迭代计划
| 版本 | 内容 |
| --- | --- |
| v1.1 | 增加多档幸运礼物,高价礼物贡献更高 J Fund 比例。 |
| v1.2 | 按房间活跃度自适应 Must-Hit 爆点范围。 |
| v1.3 | 可选展示个人累计 jackpot 贡献,默认仍保持极简模式。 |