本页目录
L07 练习
改
code.py或research_assistant/period_budget.py,运行观察变化。零联网、零等待。
练习 1:算 cap 的汇率(理解类)
自适应退避的 cap 是「省钱」和「醒得晚」的汇率。假设:基础班次 1 天 1 班,每班扫描+判断成本 ≈ 50 token(无变化日),信源平均每 30 天有一次 major 变化。
- cap=8 时:30 个安静日实际扫几班?省多少 token?major 出现时最坏晚发现几天?
- cap=2 和 cap=32 各算一遍。
- 你的盯梢场景(自选一个真实主题)选哪个 cap?依据是「晚 N 天发现的代价」和「每天 50 token」哪个更贵。
验收:三组(扫描次数, 最坏延迟)数字 + 一个带理由的 cap 选择。
练习 2:设计实验——degrade 状态该做什么(设计实验类)
本课的 degrade(80% 软线)只是「状态可见」,没有降级动作。设计并实现一个:
- 候选动作:(a) 新班次研究时注入
cost_mode=frugal(复用 agent-ops L02 的软预算降级——全走 flash);(b) 缩减焦点(增量子题只取最重要的 1 条);(c) 跳过 minor 判级的研究、只处理 major 候选。 - 实现(选 a 最顺):daemon 的预算门里,degrade 时给
run_research传一个标志,run_incremental把它并进extra_state。 - 实验:预算 10000,班次花费 3000/3000/2500(第 3 班进 degrade)——验证第 4 班带 frugal 标志跑、第 5 班被 pause 挡住。
- 思考:为什么 degrade 动作要选「降质量」而不是「降频率」?(提示:降频是自适应扫描的职权——它响应的是「世界安静」;degrade 响应的是「钱不够」。两个信号两个旋钮,混在一起就调不准了。)
验收:测试绿 + 一句话说清「省钱的两个旋钮」各自响应什么信号。
练习 3:外部 watchdog(动手类)
README 诚实标注了:自己测缺勤只能在复活后发现。写一个 20 行的独立 watchdog:
# watchdog.py:独立进程,每 N 分钟读一次心跳表
# last_beat 距今 > 阈值 → 本地通知(print/系统通知/webhook 皆可)
要点:它只读心跳表(sqlite 只读连接),与 daemon 无共享状态;它自己也可能死——谁看着 watchdog?(答案:不无限递归——watchdog 足够简单(20 行、无依赖、不调 LLM),简单到「由 OS 定时器拉起、每次跑完即退」,把「常驻会死」的问题转化成「cron 会不会丢班」——后者由 OS 保证。)
验收:kill 掉 daemon 后 watchdog 在一个周期内报警;说清「watchdog 必须比被守护者简单一个数量级」的道理。
练习 4:思考题——日报的「✅/⚠️」判定线(语义类)
build_daily_report 的健康徽章目前是:失败班次=0 且告警=0 → ✅。
- 思考:这条判定线漏了什么?逐项过一遍四本账——花费 95%(degrade 一整天)算健康吗?打扰 0立即+0摘要+心跳 0 tick(daemon 根本没跑)算健康吗?配额尽降级 3 条(三条 major 没能及时通知)算健康吗?
- 重新设计判定:⚠️ 的触发条件清单(至少 4 条),以及哪些情况该直接 🔴。
- 对照:agent-ops L07 的 run summary 阈值告警(steps/budget_ratio/degraded)是轨迹级的同一道题——把它的「阈值表」思路搬到服务级,列出你的服务级阈值表。
验收:新的判定条件清单 + 一个「今天四本账都有数、但系统其实病了」的构造用例。