MATRIX

行为原子拆解

2026-08-11 · 把用户行为拆成 63 个标准化原子 → 落进原子库 → 智能 AI 组合判断 · 点任意原子看口径 · ← 引擎架构总图

Matrix 的定义:把大R 和他周边人的每一个动作,按固定口径拆成可枚举的字段,每天存一份;AI 不负责取数,只负责在这些字段的历史曲线上做判断。

它比直接问 AI 强的地方不是「更聪明」,是三件模型本身做不到的事:覆盖是确定的——不靠模型记得该跑什么;② 口径是固定的——同一个问题今天问和明天问答案一样;③ 发现可以累积——一个原子被挖到一次就永远在,不用每次重新碰运气。
模型本身不变,变的是输入。同一模型输入三行结论与输入 63 条六个月曲线,产出不同:只看近期与看半年,本案得出的结论就不一致。

三个域 · 63 个原子 + 4 类原文素材 + 10 个 AI 解读维度

每个原子=一个标准化的行为字段,每人每天一个值。点任意原子看它的口径、取数来源、以及实测踩过的坑。

普通原子 本次实例的关键原子 必须 AI 才能出值 交易 28 · 行为 21 · 关系 14
原子库(存量)
每人每天一行 × 63 字段
存原始值,不存判断
智能 AI 组合判断
任意时间跨度的原子曲线
找原子之间的关系
① 发现异常
主动指出需要关注的对象
② 为什么
具体到玩法、关系、日期
③ 洞察
上升成可复用规则
④ 建议
指到人、日期、玩法
⑤ 预警
提前判断
核心做法:把行为拆成标准化的小动作,逐个规范口径,再组合交给 AI 判断。
关键在于:原子库存的是「值」,不是「结论」。存「Lucky777 占比 64%」而不是存「他消费集中度上升了」。这样 AI 拿到的是可往回追溯任意远的曲线,而不是三行判断。
← 点左边任意一个原子。

橙色的是这次实例里真正起作用的关键原子,紫色的是必须靠 AI 读原文才能出值的。

时间轴怎么串

串接由 SQL 完成,AI 不参与。三条设计约束如下。

① 内容原子的产出物不是「今天有没有提竞品」,是带时间戳的事件。
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)金币消费背包送礼私聊
0084 · 40 次LoveBell → 4360894
MagicPearl/Clover/PumpkinCat → 28910730
69 条(发 33)· 2 人
0160 · 60 次FingerHeart/HalloweenCandy/PumpkinCat → 2891073038 条(发 19)· 1 人
021Lollipop → 2891073019 条(发 10)· 1 人
03580,50011,410 · 856 次Clover → 28910730
04580,50011,990 · 781 次
16580,5002,140 · 214 次Gift_Star → 2891073021 条
174,590 · 358 次Lollipop/Clover/PumpkinCat → 2891073065 条(发 31)
1812,680 · 405 次33 条 · 2 人
198,300 · 544 次SkyLantern → 2789458516 条 · 4 人
2212,130 · 675 次MusicCactus → 144150588 条
2311,140 · 554 次41 条(发 21)· 1 人
这一天的顺序是:私聊密集互动 → 充值 → 玩概率游戏 → 把开出的礼物送给同一个对象。
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输入输出
拉原文SQLmsg_ts 的消息明细
打标签单条消息 + 少量上下文该消息的类型标签,时间戳原样带出
合并时间轴事件层全表按 ts 排序的混合事件流
日级聚合事件层63 个原子值
组合判断已排序的事件流 + 多天原子曲线异常/原因/洞察/建议
AI 全程没有做「串接」这个动作。它做的是「看一条消息,说这是什么」和「看一条排好序的流,说为什么」。这两步之间是确定性的 SQL,所以第二步可复现。
待确认:两类时间戳的时区一致性。消息表用 msg_ts(epoch 毫秒),流水表用 ctime(字符串)。本次对齐结果自洽,但需在建表前确认二者时区口径相同,否则跨源合并会整体错位数小时。

原子实测:UID 29361701 × 过往六个月

数据范围 2026-03-01 至 2026-08-11,全部原子实跑。此前两处结论被推翻。

昨天用 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 万03,321.1 万258.0 万
txn_recharge_cnt 笔数52930181
txn_pay_days 充值天数4163091
txn_recharge_max 单笔最大58.1 万258 万258 万258 万258 万
txn_coin_out 金币消费4.09 万427.1 万73.9 万0353.3 万6.57 万
txn_ops 操作次数2,48472,7054,345060,475717
txn_avg_ticket 单次均额16.558.7170.158.491.6
txn_active_days 消费活跃天191730173
txn_sku_n 消费品类数19311001610
两个只有拉出六个月才看得到的东西:
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 万0346.8 万5.18 万
 占总消费比91.6%93.9%97.7%98.2%78.8%
txn_cp_draw_cnt CP 抽奖0186 次0000
txn_draw_cnt 群聊抽奖4522910505
rom_mic_sticker 上麦贴纸788 次501 次0

③ 礼物流转 —— 昨天完全看错的一块

原子3 月4 月5 月6 月7 月8 月 1–11
txn_gift_n 送礼次数1541,4048015025
txn_gift_out_n 送礼对象数3164 人3012 人16
txn_gift_amt 送礼总价值5,188817,5925,909014,4093,646
 ├ COIN 渠道(金币直购)1,6584,5862,50001,239192
 └ BACK_PACK 渠道(背包)3,530813,0063,409013,1703,454
txn_gift_sku 送礼品类数34102604913
txn_gift_in_n 收礼来源数12100 人12068 人11
txn_gift_in_amt 收礼价值1,912215,1525,57907,9194,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。
他还在玩,但赢来的东西不送人了。消费没有出口,变成纯自我消耗。

④ 私聊与关系

原子3 月4 月5 月6 月7 月8 月 1–11
cht_msgs 私聊消息数1,1612,81516114746192
cht_partner 对话对象数2185 人10441 人18
cht_sent 自己发出的条数5821,26057028070
cht_days 有聊天的天数2326188248
rel_cp_value 当月峰值亲密值899,4226,1171402,697333
rel_fam_event 家族事件4 次变动
进→被踢→退→建族被拒→自建成功当族长
rom_join_cnt 进房次数超时641 次 / 20 天超时超时77 次 / 14 天
6 月那一列有个昨天完全没发现的东西: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 万,两个月都是爆发期」——这四个原子全都被压没了,事后再也问不出来。这四个原子无一属于消费类,全部来自关系与场景域。哪个原子会有用无法事先预判,因此只能全存。

三个域对「存不存」的要求不一样

事后能不能重新算必须存吗为什么
行为能,全历史 1.3 秒应该存成本不是理由,diff 才是——「第一次」「比上月降 98%」没有存量写不出来
关系能,全历史 0.7 秒应该存同上。另外 CP 表本身按周记录,本来就是现成的时间序列
内容SQL 能(504 人 7 天 5.3 秒),但 AI 读不了必须存这条是硬的。504 人 7 天就有 38,163 条纯文本,一个月约 16 万条——事后没有任何办法让 AI 补读一遍。当天读完当天出原子值,是唯一可行的路

不存原子会怎样 —— 这是 Matrix 存在意义的一部分

不存原子会发生什么今天的实证
1AI 不一定会去看前几个月
它只看手边有的那段
昨天那版归因只跑了近期,结论是「脉冲型 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 个是这几天挖出来的,一定还有没挖到的。要配一条机制:每次归因只要用到了库里没有的东西,就把它加进库。这也正是它和「一次性做一张大而全的宽表」的区别——不用一开始就想全。

每天怎么跑(顺序很重要)

一个容易搞反的地方:宽表在后面,不在前面。
不是「先汇总出一张大 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 分钟
3AI 读原文,出 10 个内容原子必须用SQL 拉取很快(504 人 7 天 5.3 秒),大头是 AI 阅读。每人限量近 200 条群聊 + 100 条私聊,一次读完出全部标签
463 个值拼成一行,落进原子库不用每人每天一行。这一步产出的就是宽表
5阈值判断(原来那些 Detector)不用规则跑在原子上,改阈值不用重跑历史
6AI 读原子库的多天曲线,做组合判断必须用读的是任意时间跨度,不是今天这一行——这是它能看出「4 月和 7 月是两种消费」的前提
这一步不需要重做取数。原来 Skill 里那 12 条 SQL 本来就是这些原子的生产者,缺的只是把它们的输出规范成固定字段落库——现在是每次查完直接喂给 AI,跑完就没了。

原子和 Detector 的关系

Detector 不是被取代,是被降级成「原子上的一个阈值」。
比如 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 月那段关系降温了,而不是因为他没钱或者流失了。

① 六个月的整体节奏

月份充值 IDR金币消费操作次数送礼对象CP 当周亲密值峰值关系与家族事件
3 月154.9 万 / 5 笔4.1 万2,48414 人注册期
4 月4,291.4 万 / 29 笔427.1 万72,70538 人899,422(4/13 那周)4/10 进家族 → 4/11 被踢 → 4/15 退 → 4/15 建族被拒 → 4/19 自建家族当族长;4/15 拿到荣耀等级
5 月774.0 万 / 3 笔73.9 万4,3452 人6,117 → 2,520无变动
6 月0000140(6/29 那周,谷底)整月完全静默
7 月3,321.1 万 / 18 笔353.3 万60,4757 人2,697(7/06 那周)无任何关系或家族变动
8 月 1–10258.0 万 / 1 笔6.6 万7179 人333荣耀等级 8/31 到期
4 月与 7 月的充值、消费、操作次数处于同一量级,但送礼对象数相差 5 倍、CP 亲密值相差 300 倍。两次爆发的结构不同。

② 关系原子:CP 表按周记录,直接就是一条曲线

对应原子 rel_cp_value。他和 Yennefer(28910730)11 周的完整亲密值曲线:

周(起始日)当周亲密值相对峰值同期在发生什么
04-061,316
关系刚开始
04-13899,422
一周内涨了 683 倍。同期:4/15 拿荣耀等级、4/19 自建家族当族长、当月充值 4,291 万
04-2028,971
一周内跌掉 97%
04-276,117
继续降温
05-182,520
5 月送礼对象只剩 2 人
06-29140
谷底。6 月整月零充值、零消费
07-062,697
7 月复冲 3,321 万——但亲密值只有 4 月峰值的 0.3%
07-131,017
复冲期间关系仍在往下走
07-201,156
07-27445
7/30 起四条数据线同时归零
08-03333
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_fruit132.8 万(31%)71.1 万(20%)4 月三个玩法均衡,7 月只剩一个主力
luckyslot106.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 月正是这个形态(txn_game_conc 0.37→0.64,txn_gift_out_n 38→7),一个月后就停了。这两个原子在 7 月就都有值,不用等到 8 月。
还差一块数据:变点当天上了什么活动。7 月的复冲如果对应某个 Lucky777 活动,这条归因就完整了;现在数仓里没有任何活动元数据表(2026-08-11 查过 information_schema,只有推送日志和内容审核记录)。这是唯一一处「查不动了」,而且卡的正是最关键的一环。

和直接问一个接了数仓的 AI 有什么区别

先列不是区别的部分。

不是模型更强——同级或更强。不是 SQL 写得更好——它写得没问题。不是更快——查一个人,直接问它比建这套快得多。
判据只有一条:你知不知道要问什么。
直接问 AIMatrix
适合一个人、一个问题,你已经知道要问什么几百人、每天、你不知道要问什么
触发方式有人提问才有答案没人提问也在跑
覆盖取决于这次想到了什么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 做的事就是把它固化:此后任何人出现「玩法集中度上升 + 背包送出率下降」,系统直接报,不需要有人先想到去查。

成本判据

需求该用什么理由
今天 TOP1 是谁、充了多少报表或直接问不需要 Matrix。一条 SQL 的事
查某个指定用户的情况直接问更快。本案的六个月分析就是这么跑出来的
今天 504 人里谁值得看Matrix没人提问,直接问 AI 无从下手
为什么他上个月还好这个月不行Matrix需要半年原子曲线与事件时序
这个活动对大R 起作用了吗Matrix需要暴露组与对照组,且需活动元数据
他上周说了什么Matrix原文事后无法补读,一个月约 16 万条
已有人在手工做同一件事:每天把数据离线存到本地库自己用。这个行为本身说明「存量」这一层是必需的——差别只在于目前只给一个人用、口径只有一个人懂。

哪些原子要 AI 才能出值

63 个原子全部是 SQL 算出来的数。AI 只出上层的 10 个解读维度。另外 AI 还要用在最上面那层组合判断。

位置用不用 AI为什么
交易域 28 + 行为域 21不用全是统计与聚合。用 AI 反而有害——它每天算出来的口径会不一样。实测教训:同一个「家族变化」,写不写 status=17,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 拿到的是已经算好的值。这样才能保证同一个问题今天问和明天问答案一样——否则会出现同一问题前后答案不一致。