名称: causal-inference
描述: 为智能体行为添加因果推理能力。适用于任何具有可观测结果的高层操作——邮件、消息、日历变更、文件操作、API调用、通知、提醒、购买、部署等。可用于规划干预措施、调试失败、预测结果、回填历史数据进行分析,或回答“如果我做X会怎样?”等问题。在回顾过去行为以了解成功/失败原因时也应触发。
一个轻量级的因果推理层,用于预测行为结果。其核心不是通过模式匹配相关性,而是通过建模干预和反事实来实现。
每个行为都必须能表示为对因果模型的明确干预,并包含预测效果、不确定性以及可证伪的审计追踪。
计划必须是因果上有效的,而不仅仅是看似合理的。
在任何高层行为上触发此技能,包括但不限于:
| 领域 | 需要记录的行为 |
|---|---|
| 沟通 | 发送邮件、发送消息、回复、跟进、通知、提及 |
| 日历 | 创建/移动/取消会议、设置提醒、回复邀请 |
| 任务 | 创建/完成/推迟任务、设置优先级、分配任务 |
| 文件 | 创建/编辑/共享文档、提交代码、部署 |
| 社交 | 发布、反应、评论、分享、私信 |
| 购买 | 下单、订阅、取消、退款 |
| 系统 | 配置变更、权限授予、集成设置 |
在以下情况也应触发:
- 回顾结果 — “那封邮件收到回复了吗?” → 记录结果,更新估计
- 调试失败 — “为什么这个没成功?” → 追踪因果图
- 回填历史 — “分析我过去的邮件/日历” → 解析日志,重建行为
- 规划 — “我应该现在发送还是稍后发送?” → 查询因果模型
不要从零开始。解析现有日志以重建过去的行为和结果。
# 提取已发送邮件及其回复状态
gog gmail list --sent --after 2024-01-01 --format json > /tmp/sent_emails.json
# 针对每封已发送邮件,检查是否存在回复
python3 scripts/backfill_email.py /tmp/sent_emails.json
# 提取历史事件及其参与情况
gog calendar list --after 2024-01-01 --format json > /tmp/events.json
# 重建:会议是否发生?是否被移动?参与者数量?
python3 scripts/backfill_calendar.py /tmp/events.json
# 解析消息历史以获取发送/回复模式
wacli search --after 2024-01-01 --from me --format json > /tmp/wa_sent.json
python3 scripts/backfill_messages.py /tmp/wa_sent.json
# 适用于任何历史数据源:
for record in historical_data:
action_event = {
"action": infer_action_type(record), # 推断行为类型
"context": extract_context(record), # 提取上下文
"time": record["timestamp"], # 时间戳
"pre_state": reconstruct_pre_state(record), # 重建前置状态
"post_state": extract_post_state(record), # 提取后置状态
"outcome": determine_outcome(record), # 确定结果
"backfilled": True # 标记为重建数据
}
append_to_log(action_event)
每个执行的行为都会发出一个结构化事件:
{
"action": "send_followup",
"domain": "email",
"context": {"recipient_type": "warm_lead", "prior_touches": 2},
"time": "2025-01-26T10:00:00Z",
"pre_state": {"days_since_last_contact": 7},
"post_state": {"reply_received": true, "reply_delay_hours": 4},
"outcome": "positive_reply",
"outcome_observed_at": "2025-01-26T14:00:00Z",
"backfilled": false
}
存储于 memory/causal/action_log.jsonl。
每个领域从 10-30 个可观测变量开始。
邮件领域:
发送时间 → 回复概率
主题风格 → 打开率
收件人类型 → 回复概率
跟进次数 → 回复概率 (递减效应)
距上次联系时间 → 回复概率
日历领域:
会议时间 → 出席率
参与者数量 → 延期风险
冲突程度 → 重新安排概率
缓冲时间 → 专注质量
消息领域:
回复延迟 → 对话延续性
消息长度 → 回复长度
一天中的时间 → 回复概率
平台 → 回复延迟
任务领域:
截止日期临近度 → 完成概率
优先级 → 完成速度
任务规模 → 推迟风险
上下文切换 → 错误率
图定义存储于 memory/causal/graphs/。
对于每个“旋钮”(干预变量),估计处理效应:
# 伪代码:早晨发送与晚上发送的效果对比
effect = mean(reply_prob | send_time=morning) - mean(reply_prob | send_time=evening)
uncertainty = std_error(effect)
首先使用简单回归或倾向得分匹配。当图明确且需要识别时,可升级到do-演算。
在执行行为前:
执行前:
1. 记录前置状态
2. 如果有足够的历史数据:查询模型以获取预期结果
3. 如果存在高不确定性或高风险:向用户确认
执行后:
1. 记录行为、上下文和时间
2. 设置提醒以检查结果(如果不是即时结果)
当结果被观测到时:
1. 用后置状态和结果更新行为日志
2. 如果有足够的新数据,重新估计处理效应
1. 用户请求 → 识别候选行为
2. 针对每个行为:
a. 映射到因果图上的干预点
b. 预测 P(结果 | do(行为))
c. 估计不确定性
d. 计算期望效用
3. 按期望效用排序,按安全性过滤
4. 执行最佳行为,记录预测
5. 观察结果,更新模型
1. 识别失败的结果
2. 通过因果图反向追踪
3. 针对每个上游节点:
a. 其值是否符合预期?
b. 因果链接是否成立?
4. 识别断裂的链接
5. 计算能够防止失败的最小干预集
6. 记录反事实以供学习
# 1. 创建基础设施
mkdir -p memory/causal/graphs memory/causal/estimates
# 2. 初始化配置
cat > memory/causal/config.yaml << 'EOF'
domains:
- email
- calendar
- messaging
- tasks
thresholds:
max_uncertainty: 0.3
min_expected_utility: 0.1
protected_actions:
- delete_email
- cancel_meeting
- send_to_new_contact
- financial_transaction
EOF
# 3. 回填一个领域(从邮件开始)
python3 scripts/backfill_email.py
# 4. 估计初始效应
python3 scripts/estimate_effect.py --treatment send_time --outcome reply_received --values morning,evening
定义需要用户明确批准的“受保护变量”:
protected:
- delete_email
- cancel_meeting
- send_to_new_contact
- financial_transaction
thresholds:
max_uncertainty: 0.3 # 如果 P(结果) 的不确定性 > 30%,则不采取行动
min_expected_utility: 0.1 # 如果预期收益 < 10%,则不采取行动
memory/causal/action_log.jsonl — 所有记录的行为及其结果memory/causal/graphs/ — 领域特定的因果图定义memory/causal/estimates/ — 学习到的处理效应memory/causal/config.yaml — 安全阈值和受保护变量references/do-calculus.md 了解形式化的干预语义references/estimation.md 了解处理效应估计方法