本页目录
Lesson 04 — 打扰决策:值得说吗、现在说吗
本课目标:给 Agent 装「开口的判断力」——每班的产出先判级(major/minor/none,LLM judge + 宁攒勿丢降级),再按政策与每日配额决定
notify_now / add_to_digest / stay_silent。这是全课程的价值观核心:常驻 Agent 的难点不在定时跑,在何时开口。学完你能回答面试官那句:「主动式 Agent 怎么避免变成骚扰机器人?」
0. 起点:L00 基线的第④环
基线 5 天推送 5 次全量报告,包括毫无新意的 Day2——打扰列全是「是」,没有「不说话」的选项。通知疲劳的终局是用户把通知关掉,系统白跑:一个不被信任的通知渠道,价值为零。
业界共识也在这里:OpenAI 的 scheduled tasks / Pulse、LangChain 的 ambient agents、Claude Code 的后台任务,产品分岔各不相同,但都把资源砸在同一个问题上——推送策略。LangChain 把 ambient agent 的人机交互总结为 notify / question / review 三姿势,本课实现的是第一姿势的决策层(question/review 在 L05 的收件箱与审批里)。
L03 增量简报
│
classify_change(brief, llm) ← 第①层:判级(内容理解,LLM 的活)
│ major / minor / none(+degraded 标志)
▼
decide(judgement, policy, quota) ← 第②层:决策(确定性纪律,代码的活)
│
┌──┴──────────────┬────────────────┐
▼ ▼ ▼
notify_now add_to_digest stay_silent
(立即打扰, (攒进每日摘要, (什么都不发生——
消耗当日配额) L05 收件箱) 这是最常见的正确结局)
🎯 核心认知:判断交给模型,纪律交给代码。「这条变化重不重要」是内容理解问题,规则只能兜底、LLM 才有判断力;「今天还剩几次打扰」是确定性记账问题,LLM 不该碰。两层各用各的工具——这个分工模式(LLM 判断 + 代码执法)会在你所有的 Agent 治理设计里反复出现。
1. 判级:major / minor / none
「通知管家」prompt 让 LLM 站在用户注意力的立场上判级:
- major:重大进展 / 结论反转 / 直接影响决策 → 值得立即打扰(Day4 的 AGUI 撤回)
- minor:有信息量但不紧急 → 攒进摘要(Day3 的补丁版本)
- none:无实质内容 → 不占注意力(Day2 的「确认无变化」;以及 L02 哈希法漏给语义层的「措辞改写」在这里被过滤)
宁攒勿丢(判级的故障纪律)
LLM 输出解析不出级别 → 降级 minor 进摘要,绝不 stay_silent;LLM 调用失败 → 退回关键词规则(更正/撤回/反转→major)。两条路径都带 degraded=True 诚实标注。
💡 为什么降级是 minor 不是 major?错误方向的代价不对称:误打扰一次消耗的是信任(配额也被白吃),漏进摘要的代价只是晚几个小时被看到(摘要每天必达)。所以判不准时宁可攒着——除非你的场景里「晚知道」代价极高(安全告警类),那时降级方向该反过来(练习 3)。
2. 决策:政策 × 配额
2.1 三种政策(proactivity_policy)
| 政策 | 行为 | 适用 |
|---|---|---|
all |
非 none 全部立即通知(不查配额) | 基线对照 / 极少数「每条都要」的盯法 |
threshold(默认) |
major→立即(配额内);minor→摘要;none→沉默 | 绝大多数盯梢场景 |
digest_only |
非 none 全部进摘要,绝不打扰 | 「只想看日报」的用户 |
code.py Part 3 用 5 日时间线量化三者(mock judge):
政策 立即打扰 进摘要 沉默 打扰精确率
all 3 0 1 33%
threshold 1 2 1 100%
digest_only 0 3 1 —(零打扰)
threshold 的 1 次打扰正中 Day4 重大反转——打扰精确率(值得的打扰/总打扰)从 33% 到 100%。它与增量召回率(该说的说了没)构成打扰决策的查准/查全,都是 L08 收益矩阵的核心指标。
2.2 每日打扰配额(daily_interrupt_quota,默认 2)
即使判级全对,一天 8 个 major 也等于骚扰。配额是「自主-控制」主线在本课的闸门:
notify_now消耗当日配额(sqlite 持久——daemon 重启不清零,不然崩一次就白嫖配额);- 配额尽了 major 也降 digest,带
quota_exhausted=True记档——「今天有 2 条 major 没能立即通知你」本身是重要信息,进 L07 日报可审计; - 次日自动恢复(按本地日期
day_key)。
💡 紧还是松? 配额=0 等于 digest_only(失去紧急性);配额=∞ 等于没有闸(回到疲劳)。判断依据是用户的中断承受力:知识工作者一天被打断 2 次是「有价值的提醒」,8 次是「这个东西烦死了」。配额也保护判级器的失误——judge 发疯连判 major 时,用户最多被扰 N 次。
3. 流派对比:何时开口,有几种做法?
| 流派 | 做法 | 取舍 |
|---|---|---|
| ① 全推(现状/all) | 有产出就通知 | ✅ 零漏报;🚫 精确率 33%,信任耗尽后等效于零通知 |
| ② 阈值判级 + 配额(本课) | LLM 判级,major 才打扰,配额兜底 | ✅ 精确率高、可审计、参数可调;🚫 判级会错(宁攒勿丢兜方向)、LLM 判级每班多一次小成本 |
| ③ 固定摘要时间(digest_only) | 每天固定时刻一封摘要 | ✅ 零打扰、习惯友好(像晨报);🚫 紧急性没了——重大反转也要等到明早 |
| ④ 学习用户反馈(讲概念不实现) | 用户对每条通知点「有用/没用」,在线调阈值/配额(bandit 或微调 judge) | ✅ 个性化天花板最高;🚫 要反馈回路+数据量,冷启动仍需 ②③ 打底 |
| ⑤ 规则关键词 | 命中「撤回/重磅」才推 | ✅ 零 LLM 成本、确定;🚫 没有内容理解(换个措辞就漏)——本课把它降级为兜底而非主路线 |
选 ② 的理由:③ 是 ② 的子集(digest_only 政策一行配置就是它);⑤ 是 ② 的降级路径;④ 是 ② 的进化方向(先有判级产生的决策日志,才有反馈可学)。② 是那个「其他流派都能从它出发」的位置。
4. 跑起来
cd ambient-agent-lessons/04_proactivity
python code.py # 零 API、零联网、零等待
5. 落地清单
| 文件 | 改动 | 如何验证 |
|---|---|---|
src/research_assistant/proactivity.py |
新增:classify_change(LLM judge + 宁攒勿丢降级)/ decide(政策+配额)/ 配额 sqlite 记账 |
见下 |
src/research_assistant/config.py |
新增:enable_proactivity / proactivity_policy / daily_interrupt_quota(默认关) |
.env 设 ENABLE_PROACTIVITY=true |
tests/test_proactivity.py |
新增:15 个测试(判级三级/解析失败降级/LLM 崩溃退规则/配额消耗与耗尽/次日恢复/持久化/三政策) | pytest tests/test_proactivity.py -q |
研究图 / service 零改动——判级消费的是 L03 简报文本,daemon(L06)负责把 decide 的结果投递到收件箱(L05)。
验收
cd portfolio-projects/research-assistant
python -m pytest -q # 259 + 15 = 274 passed
python -m pytest tests/test_proactivity.py -q # 15 passed
6. 本课在两条主线上的位置
- 倒置主线:第④环——「有产出就推」倒置为「Agent 自己判断值不值得说」。人从通知的清洗工变成只看被筛过的信号。
- 注意力经济主线:本课就是这条主线的主场——打扰精确率是注意力的 ROI 度量,配额是注意力的预算硬顶。L00 量化了「不管理注意力」的代价(5 推 1 值),本课把它管起来(1 推 1 值 + 摘要兜底)。
🎯 面试话术
「主动式 Agent 防骚扰我做两层:判断交给模型,纪律交给代码。判级层用 LLM 站在用户注意力立场打 major/minor/none——重大反转才值得立即打扰,例行更新攒进每日摘要,无实质内容保持沉默;解析失败降级 minor 宁攒勿丢,因为误打扰烧的是信任、晚看到只是延迟,代价不对称。
决策层是确定性的:每日打扰配额 sqlite 记账,配额尽了 major 也降摘要并记 quota_exhausted 供日报审计——这同时兜住判级器发疯的情况,judge 连判 8 个 major 用户也最多被扰 2 次。我用 5 日模拟时间线量化过:全推政策打扰精确率 33%,阈值+配额做到 100%,代价只是 minor 晚几小时进摘要。」