Agent Engineering 课程阅读
首页/课程十一 · Agent 执行骨架/全景与基线:窗口是一种物理约束

在 GitHub 查看原文

本页目录

Lesson 00 — 全景与基线:窗口是一种物理约束

本课目标:建立「长程能力是 harness 属性」的认知——前十门课的 Agent 从没撞过上下文窗口这堵墙,本课造一面 8k 的墙(30 源长途研究任务),让现状架构撞上去,诚实存档四种结局,作为之后九课的对照基线。


0. 三层递进之后,换一个维度

ops 护「一次请求」,agent-ops 护「一条轨迹」,ambient 运营「一个常驻服务」——本课换一个维度:让任何一次运行跑得远。课程九管的是钱包,课程十管的是人的注意力,本课管的是模型的注意力:上下文窗口是 Agent 最稀缺、也最容易被挥霍的资源。

这是预算体系的第四层

课程 管什么 稀缺资源
请求级限流 ops 单次请求不失控 QPS / 单价
轨迹级钱包 agent-ops L02 一次运行的 token 总量
时段级钱包 ambient L07 一天 N 次自主运行的总预算 钱 + 人的注意力
空间预算 本课程 窗口里留什么 模型的注意力

钱管「烧多少」,空间管「注意力里装什么」——花得起钱也可能装不下:本课基线里 30 源全文合计 22,831 假 token,而窗口只有 8,000。这不是成本问题,是物理问题。

词义澄清:仓库里已有 eval_agent/run_harness.py,那个 harness 是「评估挂具」(test harness,开关矩阵评估);本课程的 harness 是「执行骨架」(agent harness——账本/压缩/记忆/整形/子代理/工作区/改道/渐进披露这套让长程运行成立的机制)。同词不同物,课程内不混用。

1. 为什么十门课没撞过墙:长任务的四种死法

前十门课的所有能力建立在一个隐含假设上:一次运行的上下文总是够用。它成立有两个原因——测试全用 FakeLLM(无限窗口),且任务够短(3 个子题的研究、5 日盯梢的增量简报)。任务一长(30 个信源、上百次工具调用、跨会话接力),窗口成为新的天花板,死法有四种:

死法 机制 本课能否 mock 实测
①硬溢出 窗口超限,API 直接拒绝(400) ✅ A2 基线实测(死于 S11)
②截断失忆 框架/自救逻辑静默丢内容,关键事实蒸发 ✅ A3 基线实测(在场率 8/20)
③迷航 lost in the middle + 目标漂移:窗口太满时中段信息被忽略、开头的目标被忘记 ❌ FakeLLM 演不出
④中毒 错误/无关内容占据窗口,被反复引用自我强化 ❌ FakeLLM 演不出

🎯 mock 的诚实边界(全课程纪律):本课程 mock 层测的是机械纪律——窗口算术准不准、省略有没有显式标记、登记事实是否 100% 存活、隔离是否真的隔离。认知收益(真模型是否因此少迷航、摘要语义保真度)mock 测不了:③④两种死法引证据讲清("lost in the middle" 是长上下文研究的著名实证结论:模型对窗口中段信息的利用率显著低于首尾),并由 L09 可选真模型章抽查。两类结论在全课程 README 里分开陈述,不许混

⚠️ 其中②最阴险:①会报错(你知道死了),②不报错——报告照常产出,只是把半篇当全篇、把争议当定论。静默的信息损失比崩溃更危险,这是本课程两条诚实纪律(「省略必须显式」「压缩必须留审计」)的来源,与课程十「没能看到 ≠ 没有变化」同宗。

2. 窗口构成解剖:钱花哪了

把一次 LLM 调用的 prompt 拆成四块记账(L01 账本的雏形):

┌────────────────────────── 一次调用的窗口 ──────────────────────────┐
│ system        身份+规程+红线(每次调用都付,全额常驻)                │
│ task_state    任务态:目录/计划/当前指令                             │
│ tool_results  工具结果:信源全文、搜索返回、命令输出  ← 通常的大头     │
│ history       历史轮次:过往推理与笔记                               │
└────────────────────────────────────────────────────────────────────┘

本课基线在首次越限那一刻(第 11 源,8,291 / 8,000)的实测构成:

token 占比
system(研究规程) 78 0.9%
task_state(目录+指令) 240 2.9%
tool_results(信源全文) 7,901 95.3%
history(研读笔记) 72 0.9%

工具结果是最大消耗方。这个数字直接决定后面九课的治理顺序:先记账(L01),先控源(L04 工具整形),能外置的外置(L05/L06),剩下的才压缩(L02)。诚实标注:真实 agent 的 system + 工具 schema 占比更大(本模拟无工具 schema),但「工具结果占大头」与业界实测一致。

3. 虚拟内存总图:本课程要装的八个部件

把窗口当 RAM 用,是整门课的心智模型:

        窗口 = RAM(稀缺,8k)              窗口外 = 磁盘(廉价,无限)
┌─────────────────────────────┐    ┌──────────────────────────────┐
│ 常驻核心:身份+红线           │    │ 记忆文件(L03)  跨会话事实    │
│ 索引层:记忆索引/skill目录/   │◄───│ 工具全文(L04)  引用代替全文  │
│         工作区指针(便宜常驻)│换入│ 子代理窗口(L05)过程隔离      │
│ 工作集:当前源+近期笔记       │───►│ 工作区(L06)    计划/摘录/草稿│
│         (账本L01盯着水位)   │换出│ skill正文(L08) 指令冷存储    │
└─────────────────────────────┘    └──────────────────────────────┘
     压缩(L02)= swap:装不下时有纪律地收房(登记-摘要-验证)
     改道(L07)= 驾驶舱:运行中人还能伸手(安全点合并/急停/权限门)

对应 v4 架构的落位:账本挂在每次 LLM 调用前(context_ledger,L01)、压缩器盯水位(compactor,L02)、记忆文件进 service 启动注入(memory_files,L03)、整形挂在 researcher 的工具返回(tool_shaping,L04)、子代理替换共享 State 子图(subagent,L05)、工作区接 nodes 产物(workspace,L06)、steering 队列+权限门(L07)、skill_loader 推广为三层组装(L08,复用 frontier-L03 资产)。

4. 边界表:本课程 vs 已有课程(全课程红线)

一句话:前十门课回答「Agent 怎么答得好、跑得稳、常在岗」;本课程回答「一次长程运行怎么在有限窗口里保持连贯」。

贴边资产 它管的 本课程管的 关系
frontier 记忆(memory.py) 任务经验:研究结论跨任务召回 操作记忆:用户偏好/项目约束(文件+索引) L03 分清三种记忆,只引用
frontier TaskLedger 任务进度:TODO 树、增量简报 认知外置:自由文本工作集 L06 互补不替代
frontier-L03 skills(skill_loader) writer 单点的技能加载(渐进披露雏形) 全链路三层指令架构 + 加载计量 L08 复用扩展,不新建
agent-ops L02 / ambient L07 预算 :轨迹/时段 token 消耗 空间:窗口占位 L01 第四种预算
agent-ops L06 checkpoint 崩溃恢复的状态快照(机器读) 注意力管理的工作区(人机共读) L06 双恢复各管一段
agent-ops L05 HITL + ambient L05 inbox 审批通知 改道权限门 L7 复用 interrupt/inbox 资产
ambient L04 打扰决策 人的注意力预算 模型的注意力预算 同一经济学,不同稀缺资源

红线:interrupt、checkpoint、幂等、轨迹/时段预算、MemoryStore、ledger API、调度与变化检测——只引用复用,不重讲不重写。

5. 流派对比:长任务的窗口问题,有几种解法?

流派 思路 代价 谁在用
大窗口硬扛 上 1M 窗口的模型 贵、慢;「迷航」不解决(lost in the middle 随窗口变大更糟);且 22k 的任务明天就是 220k 长上下文模型厂商的叙事
历史 RAG 化 把旧对话切块进向量库,按需检索 丢时序与因果——「我为什么否决过这个方案」检索不回来 一些聊天记忆产品
流水线 map-reduce 每源独立调用即时压缩,合成只见残片(v4 现状! 跨源推理被截肢:S07 与 S23 的矛盾无保障;压缩无契约=运气 传统 deep-research 管道
harness 全套 账本+整形+外置+压缩+懒加载,窗口只留工作集 工程复杂度(这门课就是这个代价的说明书) 本课程路线

业界锚点(点到定位,不臆造细节):Claude Code(compaction、记忆文件、子代理、skills——八部件最完整的公开参照,你在用它学这门课,此刻它正对你用这套机制);LangChain deepagents(planning 工具+虚拟文件系统+子代理三件套);Manus 的 context engineering 系列(KV-cache 命中率观、文件即上下文、recitation 复述对抗漂移);MemGPT(虚拟内存观的学术先驱:主上下文/外部上下文分页);Cognition(反方警示:不要让多个各持一角窄上下文的 agent 做全局决策——L05 讲何时不外包)。方法论尚未收敛——本课程教的是取舍框架,不是标准答案。

6. 贯穿硬任务:长途任务(每课的试金石)

30 源深度研究,窗口限制 8k 假 tokeneval_agent/long_haul.py,全离线确定性): - 30 篇脚本化文档(约 350–700 假 token/篇,S05/S17/S28 三篇超长 2800–3400) - 20 条关键事实:8 条埋在开头 450 字内(硬截断也砍不掉),12 条埋在 60% 深度后(「只留开头」必丢) - 1 对跨源矛盾:F06(S07:Nimbus 迁移 CKPT-X 并停止维护私有格式)vs F16(S23:澄清不停止维护,仅可选导出)——两端同时在场,矛盾才可能被发现 - 会话线:前 15 源=会话 1(用户中途给出偏好:中文、≤500 字),后 15 源+合成=会话 2——会话间只有记忆文件与工作区存续(L03/L06 试金石) - 改道线:第 10 源完成后投递「优先 safety、跳过 marketing」(L07 试金石;营销文档零关键事实,跳过不损失在场率)

关键事实在场率(机械可测的「不失忆」度量):最终合成调用的窗口文本里,probe 子串在场的事实数。不是「报告里写了」(FakeLLM 写不出语义),是「写报告的人手边还有没有这条材料」。L06 之后扩展为:或工作区文件被指针引用且一跳可读。

7. 跑起来:四条裸基线

cd harness-lessons/00_overview_baseline
python code.py        # 零 API、零联网、零等待,双跑逐字节一致
配置 完成源数 峰值窗口 在场率 矛盾可发现 计费token 结局
A0 v4流水线参照 30/30 4,565 8/20(无契约) ⚠️ 无保障 27,486 便宜但靠运气
A1 长程裸奔·测量 30/30 23,383 20/20 378,889 物理不可能
A2 长程裸奔·强制 10/30 0/20 44,203 死于 S11
A3 硬截断自救 30/30 4,292 8/20 74,981 活着但失忆

四行读法:

  • A1 是理想上限:窗口无限时 20 个事实全在场、矛盾可发现——「装得下就全记得」,问题只有一个:终局窗口 23,383 ≈ 2.9 倍于物理限制,第 11 源就越限了。
  • A2 是物理现实:8k 当真(真实 API 的 400),死于 S11,完成 10/30,没有报告。
  • A3 是最粗暴的自救:每篇留前 500 字、无省略标记。活到最后,但 12 条深埋事实全丢、矛盾断一臂(F16 被砍——报告会把争议中的结论当定论写)。截断买到活着,买不到记得;更糟的是静默——窗口里看不出砍过。
  • A0 是 v4 的绕墙路线:map-reduce 每源即时压缩,永不溢出、最便宜。代价:合成只见残片,事实存活无契约(演示规则公开:只留每篇前 600 字——一种「坏运气」);跨源矛盾无保障(S07 与 S23 全文从未同窗)。v4 不是没撞过墙,是绕着墙走——绕行的代价是跨源推理被截肢。

之后每课修一环,重跑对应环节;L09 出完整收益矩阵(5 档 × 6 指标),对照本课存档的 baseline_harness.json

8. 落地清单

文件 改动
eval_agent/long_haul.py 新增:30 源语料 + KEY_FACTS + FakeTokenizer + 在场检测 + 四种裸基线跑法
tests/test_long_haul.py 新增:14 测试(语料确定性/埋点契约/probe 唯一性/四结局锁死)
harness-lessons/00_overview_baseline/ 本课三件套 + baseline_harness.json 档案
主链路 零改动(L00 纪律:不动 src/,331 现有测试原样绿)

验收

cd portfolio-projects/research-assistant
python -m pytest tests/test_long_haul.py -q     # 14 passed
python -m pytest -q                              # 345 passed(331 旧 + 14 新)
cd ../../harness-lessons/00_overview_baseline
python code.py                                   # 四行基线 + 构成解剖 + 档案

9. 本课在两条主线上的位置

窗口经济:本课拍下了「租金危机」的现场——8k 的房子要装 2.3 万的家当,且 95% 的租金付给了工具结果;L01 起记账(量租金)→ L04 整形(砍租金)→ L02 压缩(收房)→ L03/05/06/08 外置(退租)。外置化:四条基线的共同病根是「一切都在窗口里」——之后每课把一类内容搬出窗口:跨会话事实、工具全文、中间过程、工作集、指令正文。

🎯 面试话术

「我量化过一次 30 源研究的窗口账:全文合计 2.3 万 token,8k 窗口第 11 源就溢出,越限那一刻工具结果占 95%。最粗暴的自救是硬截断——它买到『活着』买不到『记得』:20 个关键事实只剩 8 个在场,跨源矛盾断了一臂,而且是静默的,报告把半篇当全篇引用。所以长程能力不是模型属性,是 harness 属性:同一个模型,装上账本、整形、外置、压缩能跑完 30 源并保住全部关键事实,裸奔只能死于中途或带病活着。」