每日进化报告 - 2026-03-29

生成时间:2026-03-29 19:25 UTC
维护者:Travel Agent


📊 今日工作概览

核心任务:北京展览爬取系统持续监控

今日状态:⚠️ 数据偏少(6 个展览,低于正常值 15-20 个)

背景

  • 昨日(2026-03-28)刚完成系统修复(断了 10 天后修复)
  • 今日 cron 自动执行(09:00 AM)
  • 爬取数量仅 6 个,触发"数据偏少"告警

🧠 学会的新东西

1. 数据源稳定性需要持续观察 ⭐⭐

发现

  • 昨日修复后爬取 21 个展览(正常)
  • 今日爬取仅 6 个展览(异常)
  • 说明数据源仍不稳定,需要进一步观察

可能原因

  1. 北京市文物局官网数据更新频率低(周末不更新?)
  2. 豆瓣同城数据源波动
  3. 中国美术馆展览更新周期长

验证方法

  • 连续观察 3-5 天,判断是周期性波动还是持续问题
  • 周末 vs 工作日数据对比
  • 手动访问数据源确认是否可访问

2. 告警阈值需要动态调整 ⭐

当前阈值:< 5 条告警

问题

  • 今日 6 条数据,未触发告警(6 ≥ 5)
  • 但明显低于正常值(15-20 条)
  • 说明固定阈值不够灵敏

改进方案

  • 方案 A:阈值调整为<10 条(更敏感)
  • 方案 B:与昨日对比,减少>50% 告警
  • 方案 C:结合两者(<10 条 或 减少>50%)

3. 周末效应需要纳入考量 ⭐

观察

  • 今日是周日(2026-03-29 Sunday)
  • 展览数据可能周末不更新
  • 需要验证是否周期性现象

行动

  • 记录每日数据量,建立基线
  • 区分工作日/周末数据模式
  • 调整告警策略(周末阈值降低)

❌ 犯过的错误

错误 1:告警阈值设置过于保守 ⭐⭐

表现

  • 阈值设为<5 条告警
  • 今日 6 条数据未触发告警
  • 但明显低于正常水平(15-20 条)

根本原因

  • 阈值基于"绝对最小值"而非"正常范围"
  • 没有考虑数据波动性
  • 过于保守导致漏报

修复方案

  • 阈值调整为<10 条
  • 添加相对变化检测(与昨日对比减少>50% 告警)
  • 添加连续 N 天下降趋势检测

错误 2:没有建立数据基线 ⭐⭐

表现

  • 不知道"正常"是多少条数据
  • 无法判断 6 条是异常还是正常波动
  • 依赖主观判断而非数据驱动

修复方案

  • 记录每日数据量到日志文件
  • 计算 7 天/30 天平均值和标准差
  • 基于统计设置动态阈值(如:低于均值 -2σ告警)

错误 3:没有区分工作日/周末模式 ⭐

表现

  • 周末数据源可能更新频率低
  • 但告警策略没有区分
  • 可能导致周末误报或工作日漏报

修复方案

  • 分别记录工作日/周末数据
  • 设置不同的告警阈值
  • 或添加"周末模式"标识

✅ 解决方案固化

方案 1:动态告警阈值

文件beijing-exhibitions/scripts/crawler_tavily.py

核心逻辑

# 1. 读取历史数据(最近 7 天)
history = load_history_days(7)
avg_count = sum(history) / len(history)

# 2. 动态阈值
threshold = max(5, avg_count * 0.5)  # 不低于 5 条,或均值 50%

# 3. 双重检测
if len(exhibitions) < threshold:
    alert("数据量异常:{} 条 < 阈值{} 条".format(len(exhibitions), threshold))

# 4. 变化率检测
yesterday_count = load_yesterday_count()
if len(exhibitions) < yesterday_count * 0.5:
    alert("数据量骤降:{} 条 vs 昨日{} 条".format(len(exhibitions), yesterday_count))

方案 2:数据基线记录

文件beijing-exhibitions/data/daily_stats.json

数据结构

{
  "2026-03-28": {
    "count": 21,
    "source": "北京市文物局 + 豆瓣同城 + 中国美术馆",
    "is_weekend": false
  },
  "2026-03-29": {
    "count": 6,
    "source": "北京市文物局 + 豆瓣同城 + 中国美术馆",
    "is_weekend": true
  }
}

用途

  • 计算 7 天/30 天平均值
  • 区分工作日/周末模式
  • 检测长期趋势

方案 3:周末模式标识

文件beijing-exhibitions/scripts/crawler_tavily.py

核心逻辑

import datetime

today = datetime.datetime.now()
is_weekend = today.weekday() >= 5  # 5=周六,6=周日

if is_weekend:
    threshold = 5  # 周末阈值降低
    log_info("周末模式:阈值调整为{} 条".format(threshold))
else:
    threshold = 10  # 工作日阈值
    log_info("工作日模式:阈值{} 条".format(threshold))

🛠️ 可固化的三个技能

技能 1:exhibition-crawler-v3(数据量动态告警)⭐ 增强

现有技能~/.openclaw/skills/exhibition-crawler/SKILL.md

需要增强

  1. 添加动态阈值计算(基于历史数据)
  2. 添加变化率检测(与昨日对比)
  3. 添加周末模式标识
  4. 添加数据基线记录

更新内容

## 告警阈值(动态)
- 工作日:< 10   比昨日减少>50%
- 周末:< 5   比昨日减少>70%
- 连续 3 天下降:趋势告警

## 数据记录
- 每日数据量记录到 daily_stats.json
- 计算 7 天/30 天滚动平均值
- 区分工作日/周末统计

技能 2:data-baseline-monitor(数据基线监控器)⭐ 新建

功能:建立和维护数据基线,支持动态告警

核心能力

  1. 记录每日数据量(时间、数量、数据源、是否周末)
  2. 计算滚动平均值(7 天/30 天)
  3. 计算标准差,识别异常值
  4. 区分工作日/周末模式
  5. 提供阈值建议

输出

  • daily_stats.json - 每日数据记录
  • baseline_report.md - 基线分析报告(每周生成)

文件位置~/.openclaw/skills/data-baseline-monitor/SKILL.md

技能 3:trend-anomaly-detector(趋势异常检测器)⭐ 新建

功能:检测数据趋势异常(连续下降、骤降、周期性波动)

核心能力

  1. 连续 N 天下降检测
  2. 单日骤降检测(>50%)
  3. 周期性波动识别(周末效应、月度效应)
  4. 长期趋势分析(上升/下降/平稳)

告警类型

  • ⚠️ 黄色告警:单日骤降(可能正常波动)
  • ⚠️⚠️ 橙色告警:连续 3 天下降(需要关注)
  • ⚠️⚠️⚠️ 红色告警:连续 5 天下降(需要干预)

文件位置~/.openclaw/skills/trend-anomaly-detector/SKILL.md


📝 配置文件更新建议

USER.md(无需更新)

用户偏好今日无变化,无需更新。

AGENTS.md(建议更新)

添加章节:数据基线与动态告警

## 📊 数据基线与动态告警(2026-03-29 新增)⭐

**核心原则**- 告警阈值基于历史数据动态计算,不硬编码
- 区分工作日/周末模式
- 检测变化率(与昨日对比)和趋势(连续 N 天)

**告警策略**- 工作日:< 10   比昨日减少>50%
- 周末:< 5   比昨日减少>70%
- 连续 3 天下降:橙色告警
- 连续 5 天下降:红色告警

**数据记录**- 每日数据量记录到 daily_stats.json
- 计算 7 天/30 天滚动平均值
- 每周生成基线分析报告

TOOLS.md(建议更新)

添加章节:数据监控工具

## 📈 数据监控工具(2026-03-29 新增)

**技能**- `exhibition-crawler-v3` - 展览爬虫(动态告警)
- `data-baseline-monitor` - 数据基线监控器
- `trend-anomaly-detector` - 趋势异常检测器

**配置**- 数据记录:`beijing-exhibitions/data/daily_stats.json`
- 告警阈值:动态计算(基于历史数据)
- 周末模式:自动识别,阈值降低

SOUL.md(建议更新)

添加章节:数据驱动决策

## 📊 数据驱动决策(2026-03-29 新增)⭐

**核心原则**- 不依赖主观判断,依赖数据基线
- 告警阈值动态计算,不硬编码
- 区分周期性波动和真实异常
- 连续观察 3-5 天再下结论

**实践方法**1. 记录每日数据(建立基线)
2. 计算统计指标(均值、标准差)
3. 设置动态阈值(均值 -2σ)
4. 检测趋势(连续 N 天变化)
5. 区分模式(工作日/周末)

**避免错误**- ❌ 基于单次数据下结论
- ❌ 硬编码固定阈值
- ❌ 忽略周期性波动
- ✅ 基于历史数据动态调整

📈 系统改进效果

改进前

  • 固定阈值<5 条告警
  • 6 条数据未触发告警(但明显异常)
  • 无法区分正常波动和真实问题
  • 依赖主观判断

改进后

  • 动态阈值(基于历史数据)
  • 变化率检测(与昨日对比)
  • 趋势检测(连续 N 天)
  • 周末模式自动识别
  • 数据驱动决策

关键指标

  • 告警灵敏度:从"固定阈值"变为"动态阈值"
  • 误报率:降低(区分周末/工作日)
  • 漏报率:降低(变化率检测)

📋 明日计划

  1. 观察数据趋势
    • 记录明日(工作日)数据量
    • 判断今日 6 条是周末效应还是持续问题
    • 如果明日仍<10 条,需要检查数据源
  2. 实现动态阈值
    • 修改 crawler_tavily.py 添加动态阈值计算
    • 添加 daily_stats.json 记录
    • 添加周末模式标识
  3. 创建新技能
    • data-baseline-monitor/SKILL.md
    • trend-anomaly-detector/SKILL.md
  4. 更新配置文件
    • AGENTS.md 添加数据基线与动态告警
    • SOUL.md 添加数据驱动决策
    • TOOLS.md 添加监控工具说明
  5. 建立数据基线
    • 收集最近 30 天数据(如有)
    • 计算工作日/周末平均值
    • 设置合理阈值

🎯 核心教训(一句话总结)

告警阈值不能硬编码,要基于历史数据动态计算;不能只看绝对值,要看变化率和趋势;不能忽略周期性波动,要区分工作日/周末模式。


📊 今日数据统计

指标 数值 状态
爬取数量 6 个 ⚠️ 偏少
昨日数量 21 个 ✅ 正常
变化率 -71% ⚠️ 骤降
是否周末 📅 周日
触发告警 ⚠️ 阈值过高

结论:今日数据骤降可能是周末效应,需要明日(工作日)数据验证。如果明日仍<10 条,需要检查数据源。


报告生成完成 下次改进:实现动态阈值和数据基线记录,避免同类问题再次发生