Matrix 的定义:把大R 和他周边人的每一个动作,按固定口径拆成可枚举的字段,每天存一份;AI 不负责取数,只负责在这些字段的历史曲线上做判断。
它比直接问 AI 强的地方不是「更聪明」,是三件模型本身做不到的事:① 覆盖是确定的——不靠模型记得该跑什么;② 口径是固定的——同一个问题今天问和明天问答案一样;③ 发现可以累积——一个原子被挖到一次就永远在,不用每次重新碰运气。
模型本身不变,变的是输入。同一模型输入三行结论与输入 63 条六个月曲线,产出不同:只看近期与看半年,本案得出的结论就不一致。
它比直接问 AI 强的地方不是「更聪明」,是三件模型本身做不到的事:① 覆盖是确定的——不靠模型记得该跑什么;② 口径是固定的——同一个问题今天问和明天问答案一样;③ 发现可以累积——一个原子被挖到一次就永远在,不用每次重新碰运气。
模型本身不变,变的是输入。同一模型输入三行结论与输入 63 条六个月曲线,产出不同:只看近期与看半年,本案得出的结论就不一致。
三个域 · 63 个原子 + 4 类原文素材 + 10 个 AI 解读维度
每个原子=一个标准化的行为字段,每人每天一个值。点任意原子看它的口径、取数来源、以及实测踩过的坑。
普通原子
本次实例的关键原子
必须 AI 才能出值
交易 28 · 行为 21 · 关系 14
↓
原子库(存量)
每人每天一行 × 63 字段
存原始值,不存判断
存原始值,不存判断
智能 AI 组合判断
读任意时间跨度的原子曲线
找原子之间的关系
找原子之间的关系
① 发现异常
主动指出需要关注的对象
② 为什么
具体到玩法、关系、日期
③ 洞察
上升成可复用规则
④ 建议
指到人、日期、玩法
⑤ 预警
提前判断
核心做法:把行为拆成标准化的小动作,逐个规范口径,再组合交给 AI 判断。
关键在于:原子库存的是「值」,不是「结论」。存「Lucky777 占比 64%」而不是存「他消费集中度上升了」。这样 AI 拿到的是可往回追溯任意远的曲线,而不是三行判断。
关键在于:原子库存的是「值」,不是「结论」。存「Lucky777 占比 64%」而不是存「他消费集中度上升了」。这样 AI 拿到的是可往回追溯任意远的曲线,而不是三行判断。
← 点左边任意一个原子。
橙色的是这次实例里真正起作用的关键原子,紫色的是必须靠 AI 读原文才能出值的。
橙色的是这次实例里真正起作用的关键原子,紫色的是必须靠 AI 读原文才能出值的。
时间轴怎么串
串接由 SQL 完成,AI 不参与。三条设计约束如下。
① 内容原子的产出物不是「今天有没有提竞品」,是带时间戳的事件。
AI 读原文时输出
行为流水、礼物流水、充值单本来就带时间戳。四类事件因此天然落在同一条轴上,串接是一次 ORDER BY。
AI 读原文时输出
{ts, 类型, 原句, 对象, 场景},ts 取自消息表的 msg_ts 字段,不由 AI 生成。行为流水、礼物流水、充值单本来就带时间戳。四类事件因此天然落在同一条轴上,串接是一次 ORDER BY。
② 10 个内容原子一次读完,不分 10 次跑。除 token 成本外,更关键的是分开跑会丢上下文——「这破游戏不如 apk lain」一句同时属于竞品提及、产品吐槽、负面情绪三个原子,分三次读会各自命中,但丢掉「它们出自同一句」这个信息。
③ 原文拉取是纯 SQL,不是瓶颈。实测 504 人 7 天 38,163 条纯文本,5.3 秒;单人六个月 24.5 秒。瓶颈只在 AI 阅读量,因此限量为每人每天近 200 条群聊 + 100 条私聊。
实测:四条数据线在小时级对齐
UID 29361701,2026-04-12(CP 亲密值爆发的前一天)。四张表各自带时间戳,按小时合并后的结果。
| 时 | 充值(IDR) | 金币消费 | 背包送礼 | 私聊 |
|---|---|---|---|---|
| 00 | 84 · 40 次 | LoveBell → 4360894 MagicPearl/Clover/PumpkinCat → 28910730 | 69 条(发 33)· 2 人 | |
| 01 | 60 · 60 次 | FingerHeart/HalloweenCandy/PumpkinCat → 28910730 | 38 条(发 19)· 1 人 | |
| 02 | 1 | Lollipop → 28910730 | 19 条(发 10)· 1 人 | |
| 03 | 580,500 | 11,410 · 856 次 | Clover → 28910730 | |
| 04 | 580,500 | 11,990 · 781 次 | ||
| 16 | 580,500 | 2,140 · 214 次 | Gift_Star → 28910730 | 21 条 |
| 17 | 4,590 · 358 次 | Lollipop/Clover/PumpkinCat → 28910730 | 65 条(发 31) | |
| 18 | 12,680 · 405 次 | 33 条 · 2 人 | ||
| 19 | 8,300 · 544 次 | SkyLantern → 27894585 | 16 条 · 4 人 | |
| 22 | 12,130 · 675 次 | MusicCactus → 14415058 | 8 条 | |
| 23 | 11,140 · 554 次 | 41 条(发 21)· 1 人 |
这一天的顺序是:私聊密集互动 → 充值 → 玩概率游戏 → 把开出的礼物送给同一个对象。
00–02 时与 28910730 私聊 126 条并持续送小礼物;03 时与 04 时各充值 58 万,充完立即消费 1.1 万/1.2 万金币、操作 1,637 次;16 时第三次充值后送出 Gift_Star;19 时起礼物开始扩散到其他对象。
顺序反过来即是另一种解释——「为了送礼而充值」与「充完钱顺便送礼」是两个不同结论。没有时间轴,这两者无法区分。
00–02 时与 28910730 私聊 126 条并持续送小礼物;03 时与 04 时各充值 58 万,充完立即消费 1.1 万/1.2 万金币、操作 1,637 次;16 时第三次充值后送出 Gift_Star;19 时起礼物开始扩散到其他对象。
顺序反过来即是另一种解释——「为了送礼而充值」与「充完钱顺便送礼」是两个不同结论。没有时间轴,这两者无法区分。
原子有两种输出形态
| 形态 | 粒度 | 用途 | 说明 |
|---|---|---|---|
| 事件 | 每个动作一行,带真实时间戳 | 归因 | 合并后即为事件层。统一 schema:uid · ts · 类 · 型 · 值 · 对象 · 场景 |
| 日值 | 每人每天一行 × 63 字段 | 发现异常 | 由事件聚合而来。日级足以检出「变了」,不足以判断「谁先谁后」 |
用法是两段式:先用日值定位到哪几天出了问题,再调事件层看那几天内部的顺序。既不必每次扫明细,也不会在需要时拿不到。
事件层只收动作类原子,分三类
判据:这个原子的「顺序」有没有意义。没有顺序意义的不进事件层。
| 类 | 包含 | 回答什么 | 密度(实测单人单日) |
|---|---|---|---|
| 支出事件 | 充值、金币消费、送礼 | 钱花在哪、什么时候 | 约 4,555 条(4/12:消费 4,537 + 充值 3 + 送礼 15) |
| 接触事件 | 私聊、群聊发言、点赞、评论、关注、进房、上麦 | 和谁、在哪、什么时候 | 约 350 条(私聊 318 + 进房约 32) |
| 状态变更事件 | CP 建立/解除、家族进出、等级跃迁 | 关系什么时候变的 | 0–数条/月 |
支出事件占单日事件量的 93%,且绝大多数是概率游戏的逐次投注。全量入库则 504 人一天约 228 万条,一个月近 6,800 万条,信噪比极低。
因此支出事件须压缩后入库:同一玩法的连续投注按分钟或小时聚合成一条,保留首末时间戳、次数、合计金额。逐次明细只在需要追查某一小时时回源。
因此支出事件须压缩后入库:同一玩法的连续投注按分钟或小时聚合成一条,保留首末时间戳、次数、合计金额。逐次明细只在需要追查某一小时时回源。
不进事件层的两类原子
| 类 | 例子 | 为什么不进 |
|---|---|---|
| 状态量 | rel_cp_value 当周亲密值 · rel_fam_days 在册天数 · rel_honor_level 荣耀等级 | 本身是快照,没有小时级时间点。按其自然周期(周/日)存即可 |
| 聚合量 | txn_sku_n 品类数 · txn_active_days 活跃天数 · txn_game_conc 集中度 · txn_backpack_rate 背包送出率 | 本身就是统计结果,不是动作,不存在「发生时刻」 |
所以不是每个域都要跑时间轴。交易域与行为域的动作类原子进事件层;关系域基本全是状态量,只需按周/日快照;AI 解读维度输出的标签属于接触事件(带消息时间戳)。
AI 只在两处判断,中间隔着结构化数据
| 步骤 | AI | 输入 | 输出 |
|---|---|---|---|
| 拉原文 | 否 | SQL | 带 msg_ts 的消息明细 |
| 打标签 | 是 | 单条消息 + 少量上下文 | 该消息的类型标签,时间戳原样带出 |
| 合并时间轴 | 否 | 事件层全表 | 按 ts 排序的混合事件流 |
| 日级聚合 | 否 | 事件层 | 63 个原子值 |
| 组合判断 | 是 | 已排序的事件流 + 多天原子曲线 | 异常/原因/洞察/建议 |
AI 全程没有做「串接」这个动作。它做的是「看一条消息,说这是什么」和「看一条排好序的流,说为什么」。这两步之间是确定性的 SQL,所以第二步可复现。
待确认:两类时间戳的时区一致性。消息表用
msg_ts(epoch 毫秒),流水表用 ctime(字符串)。本次对齐结果自洽,但需在建表前确认二者时区口径相同,否则跨源合并会整体错位数小时。原子实测:UID 29361701 × 过往六个月
数据范围 2026-03-01 至 2026-08-11,全部原子实跑。此前两处结论被推翻。
昨天用
真实的礼物支出是 817,592 金币,占 4 月总消费的 19.1%。差 188 倍。
原因:99.4% 的礼物走的是背包渠道(
coin_bill 算出「4 月礼物支出 4,343 金币,占比 0.1%,不重要」——该判断错误。真实的礼物支出是 817,592 金币,占 4 月总消费的 19.1%。差 188 倍。
原因:99.4% 的礼物走的是背包渠道(
gift_way='BACK_PACK'),根本不经过金币账单——他是先玩概率游戏开出礼物,再从背包送人。只查 coin_bill 永远看不到这一层。① 充值与消费
| 原子 | 3 月 | 4 月 | 5 月 | 6 月 | 7 月 | 8 月 1–11 |
|---|---|---|---|---|---|---|
txn_recharge_amt 充值额 | 154.9 万 | 4,291.4 万 | 774.0 万 | 0 | 3,321.1 万 | 258.0 万 |
txn_recharge_cnt 笔数 | 5 | 29 | 3 | 0 | 18 | 1 |
txn_pay_days 充值天数 | 4 | 16 | 3 | 0 | 9 | 1 |
txn_recharge_max 单笔最大 | 58.1 万 | 258 万 | 258 万 | — | 258 万 | 258 万 |
txn_coin_out 金币消费 | 4.09 万 | 427.1 万 | 73.9 万 | 0 | 353.3 万 | 6.57 万 |
txn_ops 操作次数 | 2,484 | 72,705 | 4,345 | 0 | 60,475 | 717 |
txn_avg_ticket 单次均额 | 16.5 | 58.7 | 170.1 | — | 58.4 | 91.6 |
txn_active_days 消费活跃天 | 19 | 17 | 3 | 0 | 17 | 3 |
txn_sku_n 消费品类数 | 19 | 31 | 10 | 0 | 16 | 10 |
两个只有拉出六个月才看得到的东西:
①
②
①
txn_active_days:4 月和 7 月的消费活跃天数完全一样,都是 17 天。txn_avg_ticket 也几乎一样(58.7 vs 58.4)。说明他单次行为、投入天数都没变——区别不在「花多少」,在「花在什么上」。②
txn_avg_ticket 5 月飙到 170.1(4 月的 2.9 倍),但只玩了 3 天。下大注、快速结束——像是关系断掉之后的「最后试一把」。这个原子昨天完全没看。② 玩法结构
| 原子 | 3 月 | 4 月 | 5 月 | 6 月 | 7 月 | 8 月 1–11 |
|---|---|---|---|---|---|---|
txn_prob_share 概率游戏支出 | 3.75 万 | 401.1 万 | 72.2 万 | 0 | 346.8 万 | 5.18 万 |
| 占总消费比 | 91.6% | 93.9% | 97.7% | — | 98.2% | 78.8% |
txn_cp_draw_cnt CP 抽奖 | 0 | 186 次 | 0 | 0 | 0 | 0 |
txn_draw_cnt 群聊抽奖 | 45 | 229 | 1 | 0 | 50 | 5 |
rom_mic_sticker 上麦贴纸 | 7 | 88 次 | 5 | 0 | 1 次 | 0 |
③ 礼物流转 —— 昨天完全看错的一块
| 原子 | 3 月 | 4 月 | 5 月 | 6 月 | 7 月 | 8 月 1–11 |
|---|---|---|---|---|---|---|
txn_gift_n 送礼次数 | 154 | 1,404 | 8 | 0 | 150 | 25 |
txn_gift_out_n 送礼对象数 | 31 | 64 人 | 3 | 0 | 12 人 | 16 |
txn_gift_amt 送礼总价值 | 5,188 | 817,592 | 5,909 | 0 | 14,409 | 3,646 |
├ COIN 渠道(金币直购) | 1,658 | 4,586 | 2,500 | 0 | 1,239 | 192 |
└ BACK_PACK 渠道(背包) | 3,530 | 813,006 | 3,409 | 0 | 13,170 | 3,454 |
txn_gift_sku 送礼品类数 | 34 | 102 | 6 | 0 | 49 | 13 |
txn_gift_in_n 收礼来源数 | 12 | 100 人 | 12 | 0 | 68 人 | 11 |
txn_gift_in_amt 收礼价值 | 1,912 | 215,152 | 5,579 | 0 | 7,919 | 4,247 |
txn_backpack_rate背包送出率 背包送礼价值 ÷ 概率游戏支出 | 9.4% | 20.3% | 0.47% | — | 0.38% | 6.7% |
「背包送出率」为新增原子,是本案的关键指标。
4 月:充值 4,291 万 → 玩概率游戏 401 万 → 开出的礼物从背包送出 81.3 万给 64 个人 → 收到 100 个人的回礼 → 私聊 85 个对象 → CP 亲密值 899,422 → 4/15 拿荣耀等级 → 4/19 自建家族当族长。
概率游戏在 4 月不是目的,是「生产礼物的机器」,礼物是社交货币。送出率 20.3%。
7 月:同样充值 3,321 万、同样玩概率游戏 346.8 万,但背包只送出 1.3 万给 12 个人,送出率 0.38%——是 4 月的 1/53。
他还在玩,但赢来的东西不送人了。消费没有出口,变成纯自我消耗。
4 月:充值 4,291 万 → 玩概率游戏 401 万 → 开出的礼物从背包送出 81.3 万给 64 个人 → 收到 100 个人的回礼 → 私聊 85 个对象 → CP 亲密值 899,422 → 4/15 拿荣耀等级 → 4/19 自建家族当族长。
概率游戏在 4 月不是目的,是「生产礼物的机器」,礼物是社交货币。送出率 20.3%。
7 月:同样充值 3,321 万、同样玩概率游戏 346.8 万,但背包只送出 1.3 万给 12 个人,送出率 0.38%——是 4 月的 1/53。
他还在玩,但赢来的东西不送人了。消费没有出口,变成纯自我消耗。
④ 私聊与关系
| 原子 | 3 月 | 4 月 | 5 月 | 6 月 | 7 月 | 8 月 1–11 |
|---|---|---|---|---|---|---|
cht_msgs 私聊消息数 | 1,161 | 2,815 | 161 | 14 | 746 | 192 |
cht_partner 对话对象数 | 21 | 85 人 | 10 | 4 | 41 人 | 18 |
cht_sent 自己发出的条数 | 582 | 1,260 | 57 | 0 | 280 | 70 |
cht_days 有聊天的天数 | 23 | 26 | 18 | 8 | 24 | 8 |
rel_cp_value 当月峰值亲密值 | — | 899,422 | 6,117 | 140 | 2,697 | 333 |
rel_fam_event 家族事件 | — | 4 次变动 进→被踢→退→建族被拒→自建成功当族长 | 无 | 无 | 无 | 无 |
rom_join_cnt 进房次数 | 超时 | 641 次 / 20 天 | 超时 | 超时 | 77 次 / 14 天 | — |
6 月那一列有个昨天完全没发现的东西:
他 6 月一条私聊都没发出去,但有 8 天收到过消息(共 14 条)。账号仍在使用,只是不再主动发言。这与「流失」是两种状态,只有把「发出」和「收到」拆成两个原子才能区分——合并成「消息数 14」则该信息丢失。
cht_sent = 0。他 6 月一条私聊都没发出去,但有 8 天收到过消息(共 14 条)。账号仍在使用,只是不再主动发言。这与「流失」是两种状态,只有把「发出」和「收到」拆成两个原子才能区分——合并成「消息数 14」则该信息丢失。
⑤ 取数成本实测 —— 这张表决定了架构
| 原子组 | 六个月一次跑 | 按月切片 | 结论 |
|---|---|---|---|
| 充值(4 个原子) | 2.3 秒 | 不需要 | 这几类随时补跑都可以,存它们的理由是 diff 不是成本 |
| 消费+玩法(14 个原子) | 3.8 秒 | 不需要 | |
| 送礼(6 个原子) | 8.9 秒 | 不需要 | |
| 收礼(3 个原子) | 5.2 秒 | 不需要 | |
| 私聊(4 个原子) | 24.5 秒 | 不需要 | |
| 房间行为(5 个原子) | 504 超时 | 4 月 3.1 秒 ✅ 7 月 54.2 秒 ✅ 7–8 月(42 天)超时 ❌ 3–6 月(4 个月)超时 ❌ | 同样跑一个月,4 月 3.1 秒、7 月 54.2 秒,差 17 倍。切片能跑但耗时不可预测——这类原子只能每天算一次存下来,回填要按月切且必须容忍失败重跑 |
首次回填量大、之后增量补充,是唯一可行的节奏。
房间行为六个月一次跑必然超时,但按月切片就能跑通。所以节奏是:首次回填按月切片、允许重试、跑一次就好;之后每天只补当天,几秒钟。
需求要求覆盖过往半年。临时扫原始表无法满足。
房间行为六个月一次跑必然超时,但按月切片就能跑通。所以节奏是:首次回填按月切片、允许重试、跑一次就好;之后每天只补当天,几秒钟。
需求要求覆盖过往半年。临时扫原始表无法满足。
为什么把「结论层」改成「原子库」
存「结论」的信息量不足以支撑归因——归因需要追溯到很远的行为并反复调用,本案实例可证。
| 存「结论」(原来的设计) | 存「原子」(改后) | |
|---|---|---|
| 存什么 | 「7 月消费集中度上升了」 | txn_game_conc = 0.64(4 月那天是 0.37) |
| 能追溯多远 | 只能追溯到「当初写过结论」的那些天 | 任意远。每天每个字段都有值,拉六个月就是六个月的曲线 |
| 能不能重新提问 | 不能。如果当初的结论没提到「CP 抽奖次数」,事后就再也问不出来了 | 能。换个问题就换一组原子重新组合,库不用动 |
| 会不会失真 | 会。结论是压缩过的,压缩时丢掉的东西找不回来 | 不会。原子是原始值 |
| AI 拿到什么 | 三行判断 | 63 条曲线,可以自己找相关性 |
今天的实例就是最直接的证据。
「4 月和 7 月是两种不同的消费」这个结论,是靠 txn_cp_draw_cnt(CP 抽奖次数:186 → 0)、rom_mic_sticker(上麦贴纸:88 → 1)、txn_gift_out_n(送礼对象:38 → 7)、rel_cp_value(CP 亲密值:899,422 → 2,697)这四个原子同时拿出来才看出来的。
如果当初存的是结论——「4 月消费 427 万、7 月消费 353 万,两个月都是爆发期」——这四个原子全都被压没了,事后再也问不出来。这四个原子无一属于消费类,全部来自关系与场景域。哪个原子会有用无法事先预判,因此只能全存。
「4 月和 7 月是两种不同的消费」这个结论,是靠 txn_cp_draw_cnt(CP 抽奖次数:186 → 0)、rom_mic_sticker(上麦贴纸:88 → 1)、txn_gift_out_n(送礼对象:38 → 7)、rel_cp_value(CP 亲密值:899,422 → 2,697)这四个原子同时拿出来才看出来的。
如果当初存的是结论——「4 月消费 427 万、7 月消费 353 万,两个月都是爆发期」——这四个原子全都被压没了,事后再也问不出来。这四个原子无一属于消费类,全部来自关系与场景域。哪个原子会有用无法事先预判,因此只能全存。
三个域对「存不存」的要求不一样
| 域 | 事后能不能重新算 | 必须存吗 | 为什么 |
|---|---|---|---|
| 行为 | 能,全历史 1.3 秒 | 应该存 | 成本不是理由,diff 才是——「第一次」「比上月降 98%」没有存量写不出来 |
| 关系 | 能,全历史 0.7 秒 | 应该存 | 同上。另外 CP 表本身按周记录,本来就是现成的时间序列 |
| 内容 | SQL 能(504 人 7 天 5.3 秒),但 AI 读不了 | 必须存 | 这条是硬的。504 人 7 天就有 38,163 条纯文本,一个月约 16 万条——事后没有任何办法让 AI 补读一遍。当天读完当天出原子值,是唯一可行的路 |
不存原子会怎样 —— 这是 Matrix 存在意义的一部分
| 不存原子会发生什么 | 今天的实证 | |
|---|---|---|
| 1 | AI 不一定会去看前几个月 它只看手边有的那段 | 昨天那版归因只跑了近期,结论是「脉冲型 45%、CP 降温带走充值动机 25%」。今天拉了六个月,结论完全不同——不是 CP 降温,是 4 月和 7 月本来就是两种不同的消费(7 月复冲时 CP 亲密值只有峰值的 0.3% 且还在下滑)。这不是 AI 能力问题,是它压根没看那段数据。 |
| 2 | 就算叫它去跑,也不一定跑得出来 有些数据临时跑不动 | 房间行为六个月一次跑,504 超时。按月切片才行,而且 4 月 3.1 秒、7 月 54.2 秒,同样一个月差 17 倍,跨 42 天又超时。要跑通得知道「按月切、要重试、耗时不可预测」——这是工程知识,不是分析能力,不该指望模型每次都想到。 |
| 3 | 就算跑出来了,也可能不稳定 同一个问题两次答案不同 | 实例:同一个「礼物支出」,第一次从 coin_bill 算是 4,343,第二次从 gift_receive_bill 算是 817,592。差 188 倍,且第一次计算时无任何异常提示。如果这是每天自动跑,就会今天报「礼物不重要」、明天报「礼物占 19%」,没人知道该信哪个。 |
| 4 | 而且不稳定是有方向的 它会系统性漏掉「没想到要问」的东西 | 今天最关键的三个原子,没有一个在我原计划里。背包送出率是因为两张表对不上才去查 gift_way;「自己发出的条数」是顺手把发出和收到拆开才发现 6 月是 0;CP 抽奖次数是翻原始 commodity_name 列表撞见的。重跑一遍未必能再挖到这三个。其后果比「答案不稳定」更严重——无法得知漏了什么。 |
| 5 | 错了也改不对 修正无法回溯 | 那个 188 倍的口径错误,临时跑数改了只有这一次对;原子库改一次 SQL,所有历史重算一遍,以后永远是对的,而且改动留痕,能解释「为什么上周说 4,343、这周说 817,592」。 |
| 6 | 没法横向比 只能一个个看,看不了一群人 | 现在每个人都是单独跑的,所以答不了「他的背包送出率在大R里算高还是低」。原子库让每个人都有同样 63 个字段,横向对比才成立——这正是分区域 Top20、以及「有钱人是不是已经不满足现在的玩法」这类问题的前提。 |
第 4 条推出一个关键性质:发现原子是一次性成本,不是每次重来。
一个原子只要被发现过一次,写进库,它就永远在了——之后每个人、每一天都会有这个字段的值。而临时跑数是「每次重新碰运气」。
所以原子库是长出来的,不是一次设计出来的。现在这 63 个是这几天挖出来的,一定还有没挖到的。要配一条机制:每次归因只要用到了库里没有的东西,就把它加进库。这也正是它和「一次性做一张大而全的宽表」的区别——不用一开始就想全。
一个原子只要被发现过一次,写进库,它就永远在了——之后每个人、每一天都会有这个字段的值。而临时跑数是「每次重新碰运气」。
所以原子库是长出来的,不是一次设计出来的。现在这 63 个是这几天挖出来的,一定还有没挖到的。要配一条机制:每次归因只要用到了库里没有的东西,就把它加进库。这也正是它和「一次性做一张大而全的宽表」的区别——不用一开始就想全。
每天怎么跑(顺序很重要)
一个容易搞反的地方:宽表在后面,不在前面。
不是「先汇总出一张大 R 宽表,再从宽表里切小 SQL」,而是反过来——每组原子各自从它的源表直接跑,跑出来的结果拼成宽表。宽表是产出物,不是输入。
为什么这个顺序不能反:① 源表的分区规则根本不一样(
不是「先汇总出一张大 R 宽表,再从宽表里切小 SQL」,而是反过来——每组原子各自从它的源表直接跑,跑出来的结果拼成宽表。宽表是产出物,不是输入。
为什么这个顺序不能反:① 源表的分区规则根本不一样(
_ad 是全量快照,查最新一天分区再用 ctime 过滤业务时间;_sd 是单日分区),一张前置宽表容纳不了两种;② 你事先不知道哪个原子有用——CP 抽奖次数、上麦贴纸这种是从 commodity_name 里挖出来的,前置宽表每加一个原子就要重建一次。| 步 | 做什么 | 用不用 AI | 实测 |
|---|---|---|---|
| 1 | 确定当天的名单(watchlist) | 不用 | 持有有效荣耀等级的人。实测印尼 504 人 |
| 2 | 约 12 条批量 SQL 跑出 63 个原子 | 不用 | 一条 SQL 能同时出好几个原子——实测一条批量查询一次出了 7 个原子(消费总额/操作数/概率游戏/CP 抽奖/礼物/贴纸/人数),全名单一天 13.9 秒。必须 uid IN (名单) 批量,绝不能逐人循环。估计全部跑完 2–3 分钟 |
| 3 | AI 读原文,出 10 个内容原子 | 必须用 | SQL 拉取很快(504 人 7 天 5.3 秒),大头是 AI 阅读。每人限量近 200 条群聊 + 100 条私聊,一次读完出全部标签 |
| 4 | 63 个值拼成一行,落进原子库 | 不用 | 每人每天一行。这一步产出的就是宽表 |
| 5 | 阈值判断(原来那些 Detector) | 不用 | 规则跑在原子上,改阈值不用重跑历史 |
| 6 | AI 读原子库的多天曲线,做组合判断 | 必须用 | 读的是任意时间跨度,不是今天这一行——这是它能看出「4 月和 7 月是两种消费」的前提 |
这一步不需要重做取数。原来 Skill 里那 12 条 SQL 本来就是这些原子的生产者,缺的只是把它们的输出规范成固定字段落库——现在是每次查完直接喂给 AI,跑完就没了。
原子和 Detector 的关系
Detector 不是被取代,是被降级成「原子上的一个阈值」。
比如 Spending Drop 这个 detector=
这样拆的好处很实在:阈值改了不用重跑历史——原子库里的值不动,只是重新判一次。实测那三处口径偏差(家族差 7,100 倍、消费告警差 38 倍)若发生在原子层需全量返工;发生在阈值层只需改一行配置。
所以那 15 个 detector 应该这样安放:8 个结构化的 → 挂在对应原子上的阈值;5 个语义型 → 本身就是内容域的原子(AI 出值);2 个(消费驱动力、事件因果)→ 不是 detector 也不是原子,是 AI 那一层的任务。
比如 Spending Drop 这个 detector=
txn_coin_out 这个原子 + 一条阈值规则。原子是永远都有值的,detector 只是「值超过某条线就点亮」。这样拆的好处很实在:阈值改了不用重跑历史——原子库里的值不动,只是重新判一次。实测那三处口径偏差(家族差 7,100 倍、消费告警差 38 倍)若发生在原子层需全量返工;发生在阈值层只需改一行配置。
所以那 15 个 detector 应该这样安放:8 个结构化的 → 挂在对应原子上的阈值;5 个语义型 → 本身就是内容域的原子(AI 出值);2 个(消费驱动力、事件因果)→ 不是 detector 也不是原子,是 AI 那一层的任务。
他 4 月为什么冲,5、6 月为什么停,7 月为什么又冲
UID 29361701(印尼,荣耀 L2)。所有数字都是 2026-08-11 实跑,数据日 2026-08-10。这就是「分析得够深」应该长的样子。
结论:4 月与 7 月是两种不同性质的消费,不能视作同一现象重复发生。
4 月是关系带出来的消费——CP 亲密值那一周暴涨 683 倍,家族十天换了四个最后自己当族长,钱花在 CP 抽奖、38 个人的礼物、上麦贴纸、戒指上。
7 月是纯玩法消费——CP 抽奖归零、群聊抽奖跌 92%、礼物几乎没有、上麦贴纸只剩 1 次,Lucky777 一个玩法吃掉 64%。
5、6 月停,是因为 4 月那段关系降温了,而不是因为他没钱或者流失了。
4 月是关系带出来的消费——CP 亲密值那一周暴涨 683 倍,家族十天换了四个最后自己当族长,钱花在 CP 抽奖、38 个人的礼物、上麦贴纸、戒指上。
7 月是纯玩法消费——CP 抽奖归零、群聊抽奖跌 92%、礼物几乎没有、上麦贴纸只剩 1 次,Lucky777 一个玩法吃掉 64%。
5、6 月停,是因为 4 月那段关系降温了,而不是因为他没钱或者流失了。
① 六个月的整体节奏
| 月份 | 充值 IDR | 金币消费 | 操作次数 | 送礼对象 | CP 当周亲密值峰值 | 关系与家族事件 |
|---|---|---|---|---|---|---|
| 3 月 | 154.9 万 / 5 笔 | 4.1 万 | 2,484 | 14 人 | — | 注册期 |
| 4 月 | 4,291.4 万 / 29 笔 | 427.1 万 | 72,705 | 38 人 | 899,422(4/13 那周) | 4/10 进家族 → 4/11 被踢 → 4/15 退 → 4/15 建族被拒 → 4/19 自建家族当族长;4/15 拿到荣耀等级 |
| 5 月 | 774.0 万 / 3 笔 | 73.9 万 | 4,345 | 2 人 | 6,117 → 2,520 | 无变动 |
| 6 月 | 0 | 0 | 0 | 0 | 140(6/29 那周,谷底) | 整月完全静默 |
| 7 月 | 3,321.1 万 / 18 笔 | 353.3 万 | 60,475 | 7 人 | 2,697(7/06 那周) | 无任何关系或家族变动 |
| 8 月 1–10 | 258.0 万 / 1 笔 | 6.6 万 | 717 | 9 人 | 333 | 荣耀等级 8/31 到期 |
4 月与 7 月的充值、消费、操作次数处于同一量级,但送礼对象数相差 5 倍、CP 亲密值相差 300 倍。两次爆发的结构不同。
② 关系原子:CP 表按周记录,直接就是一条曲线
对应原子 rel_cp_value。他和 Yennefer(28910730)11 周的完整亲密值曲线:
| 周(起始日) | 当周亲密值 | 相对峰值 | 同期在发生什么 |
|---|---|---|---|
| 04-06 | 1,316 | 关系刚开始 | |
| 04-13 | 899,422 | 一周内涨了 683 倍。同期:4/15 拿荣耀等级、4/19 自建家族当族长、当月充值 4,291 万 | |
| 04-20 | 28,971 | 一周内跌掉 97% | |
| 04-27 | 6,117 | 继续降温 | |
| 05-18 | 2,520 | 5 月送礼对象只剩 2 人 | |
| 06-29 | 140 | 谷底。6 月整月零充值、零消费 | |
| 07-06 | 2,697 | 7 月复冲 3,321 万——但亲密值只有 4 月峰值的 0.3% | |
| 07-13 | 1,017 | 复冲期间关系仍在往下走 | |
| 07-20 | 1,156 | ||
| 07-27 | 445 | 7/30 起四条数据线同时归零 | |
| 08-03 | 333 | 8/6 起回来,但只有 6.6 万金币 |
该曲线排除了「7 月复冲源于关系回暖」这一假设。7 月复冲的时候亲密值只有 4 月峰值的 0.3%,而且在复冲期间还在继续往下掉。7 月这次跟关系没关系。
③ 行为原子:4 月和 7 月的结构完全不同
两个月的金币消费总量接近(427.1 万 vs 353.3 万),但拆到原子层是两个人。
| 原子 | 4 月 | 7 月 | 怎么理解 |
|---|---|---|---|
| Lucky777 支出 | 159.2 万(37%) | 226.4 万(64%) | txn_game_conc 集中度翻倍 |
| lucky_fruit | 132.8 万(31%) | 71.1 万(20%) | 4 月三个玩法均衡,7 月只剩一个主力 |
| luckyslot | 106.7 万(25%) | 49.3 万(14%) | |
txn_cp_draw_cnt CP 抽奖 | 16.2 万 · 186 次 | 0 | 归零。CP 抽奖为双人玩法,无关系即不会使用 |
txn_draw_cnt 群聊抽奖 | 3.4 万 · 229 次 | 2,588 · 50 次 | −92% |
txn_gift_amt 礼物(金币账单口径) | 4,343 · 20 种 含奔驰、花车、迪斯科 | 605 · 6 种 | −86%,且只剩最便宜的几种 |
rom_mic_sticker 上麦贴纸 | 88 次 | 1 次 | −99%,4 月他在房间里,7 月基本不上麦 |
| 戒指 | 买了 1 枚 | 0 | 关系型消费的标志物 |
txn_gift_out_n 送礼对象数 | 38 人 | 7 人 | 社交面收窄 −82% |
txn_avg_ticket 单次均额 | 58.7 金币 | 58.4 金币 | 几乎完全一样——单次行为没变,变的是频次和场景 |
④ 所以答案是
4 月 · 为什么冲
关系带出来的消费。4/13 那一周 CP 亲密值从 1,316 涨到 899,422,同期他 4/15 拿到荣耀等级、4/19 自建家族当上族长。这个月他花钱的地方是 CP 抽奖 186 次、38 个人的礼物、88 次上麦贴纸、一枚戒指——概率游戏只是这一整套社交行为的一部分,而且三个玩法平摊。此阶段的消费发生在社交场景内,而非独立的投注行为。
5 月 · 为什么停
关系高峰过去。亲密值 4/20 那周直接跌掉 97%,5 月只剩 2,520。送礼对象从 38 人掉到 2 人,充值降到 774 万。消费跟着关系一起降温,不是他没钱了。
6 月 · 为什么完全归零
亲密值到 6/29 那周只剩 140,是峰值的万分之一点五。充值 0、消费 0、操作 0、送礼对象 0。关系断供之后,他在这个产品里就没有花钱的理由了——因为他的消费从头到尾都挂在关系上。
7 月 · 为什么又冲
这次跟关系无关。复冲 3,321 万的同时,亲密值只有 2,697(4 月峰值的 0.3%)且持续下滑,家族零变动,CP 抽奖 0 次,礼物 605 金币,上麦 1 次。Lucky777 一个玩法吃掉 64%,投注 38,990 次。他回来不是因为找回了什么人,是因为回到了那个玩法。
8 月 · 现在
7/30 起充值、消费、私聊、进房四条线同时归零,8/6 回来但只有 6.6 万金币。荣耀等级 8/31 到期,8/7 那笔 258 万充值在到期前 24 天。
可复用洞察:关系驱动的爆发会留下存量,玩法驱动的爆发不会。
4 月那次爆发结束后,他还剩下 CP、家族、38 个送过礼的人,所以 5 月还有 774 万的余温;7 月这次爆发什么都没留下——没有新关系、没有新家族、送礼对象只有 7 人,因此 8 月停止后没有回升。
由此得到一条可以直接做成预警的规则:当一个大R 出现「玩法集中度上升」+「送礼对象数下降」同时发生时,要提前预警——那是消费正在脱离关系。Witcher 7 月正是这个形态(
4 月那次爆发结束后,他还剩下 CP、家族、38 个送过礼的人,所以 5 月还有 774 万的余温;7 月这次爆发什么都没留下——没有新关系、没有新家族、送礼对象只有 7 人,因此 8 月停止后没有回升。
由此得到一条可以直接做成预警的规则:当一个大R 出现「玩法集中度上升」+「送礼对象数下降」同时发生时,要提前预警——那是消费正在脱离关系。Witcher 7 月正是这个形态(
txn_game_conc 0.37→0.64,txn_gift_out_n 38→7),一个月后就停了。这两个原子在 7 月就都有值,不用等到 8 月。还差一块数据:变点当天上了什么活动。7 月的复冲如果对应某个 Lucky777 活动,这条归因就完整了;现在数仓里没有任何活动元数据表(2026-08-11 查过
information_schema,只有推送日志和内容审核记录)。这是唯一一处「查不动了」,而且卡的正是最关键的一环。和直接问一个接了数仓的 AI 有什么区别
先列不是区别的部分。
不是模型更强——同级或更强。不是 SQL 写得更好——它写得没问题。不是更快——查一个人,直接问它比建这套快得多。
判据只有一条:你知不知道要问什么。
判据只有一条:你知不知道要问什么。
| 直接问 AI | Matrix | |
|---|---|---|
| 适合 | 一个人、一个问题,你已经知道要问什么 | 几百人、每天、你不知道要问什么 |
| 触发方式 | 有人提问才有答案 | 没人提问也在跑 |
| 覆盖 | 取决于这次想到了什么 | 63 个原子每天必跑,与是否想到无关 |
| 口径 | 每次重新推导 | 写死在配置里,改动留痕 |
| 历史 | 能补跑结构化数据,补不了原文 | 原文当天读完存标签 |
| 横向比较 | 两个人两次会话,结论不可比 | 人人同样 63 个字段 |
| 知识沉淀 | 会话结束即消失 | 发现一次即永久保留 |
用本案做的对照
同一个问题:「29361701 为什么 4 月充很多、5–6 月不冲、7 月又冲」。
| 会被查到吗 | 直接问 | Matrix | 原因 |
|---|---|---|---|
| 月度充值与消费曲线 | 会 | 会 | 最自然的第一步 |
| CP 亲密值周曲线 | 可能 | 会 | 需要先知道 CP 表是按周记录的 |
| 礼物走的是背包渠道 | 不会 | 会 | 没有理由怀疑 coin_bill 算出来的 4,343 是错的。真值 817,592,差 188 倍 |
| CP 抽奖次数 186 → 0 | 不会 | 会 | 要翻 commodity_name 明细才能发现这个道具 |
| 点赞人数 47 → 6 | 不会 | 会 | 点赞与消费看起来无关,不会被想到 |
| 6 月发出 0 条但收到 14 条 | 不会 | 会 | 需要把「发出」和「收到」拆成两个原子 |
直接问会得到的结论是:「脉冲型付费,4 月与 7 月都是爆发期」。这个结论看起来完整、有数据支撑,而且是错的——两次爆发的性质完全不同。
找到真实原因用了两天、六轮追问,其中两条关键线索来自偶然:发现背包渠道是因为两张表的数字对不上;发现「发出 0 条」是因为顺手把收发拆开了。
这个过程无法复现,也无法每天对 504 个人做一遍。Matrix 做的事就是把它固化:此后任何人出现「玩法集中度上升 + 背包送出率下降」,系统直接报,不需要有人先想到去查。
找到真实原因用了两天、六轮追问,其中两条关键线索来自偶然:发现背包渠道是因为两张表的数字对不上;发现「发出 0 条」是因为顺手把收发拆开了。
这个过程无法复现,也无法每天对 504 个人做一遍。Matrix 做的事就是把它固化:此后任何人出现「玩法集中度上升 + 背包送出率下降」,系统直接报,不需要有人先想到去查。
成本判据
| 需求 | 该用什么 | 理由 |
|---|---|---|
| 今天 TOP1 是谁、充了多少 | 报表或直接问 | 不需要 Matrix。一条 SQL 的事 |
| 查某个指定用户的情况 | 直接问 | 更快。本案的六个月分析就是这么跑出来的 |
| 今天 504 人里谁值得看 | Matrix | 没人提问,直接问 AI 无从下手 |
| 为什么他上个月还好这个月不行 | Matrix | 需要半年原子曲线与事件时序 |
| 这个活动对大R 起作用了吗 | Matrix | 需要暴露组与对照组,且需活动元数据 |
| 他上周说了什么 | Matrix | 原文事后无法补读,一个月约 16 万条 |
已有人在手工做同一件事:每天把数据离线存到本地库自己用。这个行为本身说明「存量」这一层是必需的——差别只在于目前只给一个人用、口径只有一个人懂。
哪些原子要 AI 才能出值
63 个原子全部是 SQL 算出来的数。AI 只出上层的 10 个解读维度。另外 AI 还要用在最上面那层组合判断。
| 位置 | 用不用 AI | 为什么 |
|---|---|---|
| 交易域 28 + 行为域 21 | 不用 | 全是统计与聚合。用 AI 反而有害——它每天算出来的口径会不一样。实测教训:同一个「家族变化」,写不写 status=1 差 7,100 倍(35,514 条 vs 5 条)。这类口径必须人写死在配置里 |
| 关系域 14 个原子(状态量) | 不用 | 快照对比与聚合。而且数据本身已经给了语义:家族退出原因 quit_reason 直接分了 leave/kickout/disband,「被踢」和「自己退」不用 AI 就能分 |
| AI 解读维度 10 项 | 必须用 | 唯一非 AI 不可的一批。实测:504 人一天 5,918 条私聊,竞品关键词命中 0 条——不是没人提竞品,是用户说「di apk lain」(别的软件)不说品牌名;「whatsapp」全称也是 0,大家只打「wa」。关键词方案会得出「今天没问题」的错误结论 |
| 组合判断层 | 必须用 | 整套里唯一真正需要判断力的地方。它要在 63 条原子曲线之间找关系、提假设、决定下一步再查什么。这次的实例就是靠它:行为原子说「4 月和 7 月都爆发了」,关系原子说「4 月亲密值 899,422、7 月只有 2,697」,把两组曲线放一起才得出「这是两种不同的消费」 |
一条边界:AI 只判断,不取数。所有原子的 SQL 都写死在组件里,AI 拿到的是已经算好的值。这样才能保证同一个问题今天问和明天问答案一样——否则会出现同一问题前后答案不一致。