从事件流到生命状态的计算投影
ShiGraph = fold(EventStream, ShiProjection)
简单理解: ShiGraph 不是数据库里的一张表,而是从事件流实时计算出来的视图。
定义: 资产被使用的频率和模式
数据来源: UsageOccurred 事件的时间戳
计算: 近7天使用次数 / 近30天使用次数 / 使用趋势
4档: 低活跃(0) / 中活跃(1) / 高活跃(2) / 转化期(3)
定义: 资产部署和使用的平台分布
数据来源: DeploymentEvent 和 UsageOccurred 中的 sandbox_id
计算: 部署的沙箱数量 / 跨地域分布
4档: 单沙箱(0) / 少沙箱(1) / 多沙箱(2) / 跨域部署(3)
定义: 资产被引用和衍生的网络连接
数据来源: DerivativeCreated 和 CitationEvent
计算: 被引用次数 / 衍生作品数 / 依赖该资产的其他资产数
4档: 孤立(0) / 弱连接(1) / 中连接(2) / 强生态(3)
| 事件类型 | 触发场景 | 用于维度 |
|---|---|---|
UsageOccurred |
用户在沙箱中调用 Skill | 时间维度 |
DeploymentEvent |
Skill 部署到新沙箱 | 空间维度 |
DerivativeCreated |
基于 Skill 创建衍生作品 | 关系维度 |
CitationEvent |
Skill 被其他作品引用 | 关系维度 |
def calculate_shigraph(asset_id):
# 1. 读取事件流(最近90天)
events = event_store.query(
asset_id=asset_id,
since=now() - 90_days,
types=[Usage, Deployment, Derivative, Citation]
)
# 2. 计算时间维度
usage_7d = count(events.filter(type=Usage, since=7_days))
usage_30d = count(events.filter(type=Usage, since=30_days))
temporal_score = calculate_temporal(usage_7d, usage_30d, trend)
# 输出: 0(低) | 1(中) | 2(高) | 3(转化)
# 3. 计算空间维度
sandboxes = unique(events.filter(type=Deployment).sandbox_id)
spatial_score = calculate_spatial(len(sandboxes), geo_distribution)
# 输出: 0(单) | 1(少) | 2(多) | 3(跨域)
# 4. 计算关系维度
citations = count(events.filter(type=Citation))
derivatives = count(events.filter(type=Derivative))
dependents = count_dependent_assets(asset_id)
relational_score = calculate_relational(citations, derivatives, dependents)
# 输出: 0(孤立) | 1(弱) | 2(中) | 3(强)
# 5. 组合三维坐标
coordinate = [temporal_score, spatial_score, relational_score]
# 例如: [2, 2, 3] = 高活跃 + 多沙箱 + 强生态
# 6. 映射到状态(64卦或技术命名)
state = map_coordinate_to_state(coordinate)
# 例如: [2,2,3] → "Xian"(咸卦·大成)或 "Stage.MATURE"
return {
"coordinate": coordinate,
"state": state,
"metrics": {
"usage_7d": usage_7d,
"sandboxes": len(sandboxes),
"derivatives": derivatives
}
}
4×4×4 = 64 种组合,可以用两种方式命名:
| 坐标 [时间,空间,关系] | 文化命名(64卦) | 技术命名 | 含义 |
|---|---|---|---|
[0,0,0] |
坤卦 | Stage.SEED | 潜藏期:低活跃、单沙箱、无连接 |
[1,1,1] |
屯卦 | Stage.SPROUT | 萌芽期:开始被使用,初步扩散 |
[2,2,2] |
泰卦 | Stage.GROWTH | 成长期:活跃增长,多平台,有连接 |
[2,2,3] |
咸卦 | Stage.MATURE | 大成期:高活跃、多平台、强生态 |
[3,3,3] |
乾卦 | Stage.TRANSFORM | 转化期:进入新周期,准备蜕变 |
Stage.SEED、Stage.MATURE 这种技术命名。\n 用户界面显示"萌芽期"、"大成期"。\n 64卦是东方文化用户的亲切感设计,不是技术必需。
场景: 创作者拍脑袋定价 100 ECHO,不知道是否合理
解决: 根据生命状态计算参考价系数
价格 = 基础价 × 状态系数 SEED: 0.5 | GROWTH: 1.0 MATURE: 2.0 | TRANSFORM: 1.5
场景: 新作品就设置完全开放,结果被滥用
解决: 状态约束四权力配置
SEED 期: 衍 ≤ 1, 扩 ≤ 1 MATURE 期: 衍 ≥ 3, 扩 ≥ 3
场景: 按标签分类,优质作品被淹没
解决: 按"生命状态"匹配
"找处于成长期、 跨平台部署的 Skill" → 推荐 [2,2,x] 状态的作品
场景: 平台人工审核,标准不透明
解决: 状态跃迁自动触发规则
进入 MATURE 期自动: - 检查衍生权限 - 建议解锁收益 - 通知创作者
| 维度 | 简单方案 | ShiGraph |
|---|---|---|
| 数据结构 | 静态字段:status: "active" |
动态计算:从事件流投影 |
| 状态流转 | 人工定义:草稿→发布→下架 | 数据涌现:从使用模式中生长 |
| 维度 | 单一:用没用过 | 三维:时间×空间×关系 |
| 定价 | 固定值或创作者设定 | 根据状态系数动态调整 |
| 约束 | 无或硬编码 | 基于状态的动态约束 |
| 可解释性 | "系统设定的" | "基于过去7天使用数据计算" |
关键区别:简单方案记录"状态是什么",ShiGraph 理解"状态为什么是这样"。
场景: 两首都被用了1000次的歌
A:1000次都在1个平台,1周内爆发
B:1000次分布在10个平台,3个月内均匀
结果: 系统认为一样"active"
场景: 同样两首歌
A:时间=3(转化期), 空间=1(少), 关系=1(弱)
B:时间=2(高活跃), 空间=3(跨域), 关系=2(中)
结果: 完全不同的状态和策略
完整版是三维,但MVP可以只做一维:
// MVP 简化版
function calculate_stage_mvp(asset_id) {
// 只算时间维度:近7天使用次数
usage_7d = query_usage_last_7_days(asset_id);
if (usage_7d < 10) return Stage.SEED;
if (usage_7d < 100) return Stage.SPROUT;
if (usage_7d < 500) return Stage.GROWTH;
return Stage.MATURE;
}
// V1.5 完整版
function calculate_stage_full(asset_id) {
temporal = calculate_temporal_score(asset_id); // 时间
spatial = calculate_spatial_score(asset_id); // 空间
relational = calculate_relational_score(asset_id); // 关系
coordinate = [temporal, spatial, relational];
return map_to_stage(coordinate); // 64种组合
}
ShiGraph 不是去外部抓数据的预言机,\n
是从内部事件流理解使用数据意义的计算引擎。\n
它回答:\n
"这个资产现在处于什么生命阶段?\n
应该适用什么规则?"
ECHO 内部沙箱的事件流,不需要预言机
从事件流实时计算三维坐标,每小时更新
定价系数、权限约束、发现推荐、治理规则
代码用技术命名(Stage.MATURE),界面用文化命名(大成期)