
第4节 四层范式演进史:Prompt工程→Context工程→Harness工程→Loop工程
一句话总结:四代范式不是相互取代,而是层层包裹——你写的每一个循环,内部都跑着Prompt工程、Context工程和Harness工程。看懂这四层,你才知道自己现在站在哪,下一步往哪爬。
本文导航
- 一、为什么需要"演进史"视角
- 二、第一代:Prompt Engineering
- 三、第二代:Context Engineering
- 四、第三代:Harness Engineering
- 五、第四代:Loop Engineering
- 六、四代对照总表与跃迁规律
- 七、实操:定位你的层级并往上爬
- 小结
- 下节预告
一、为什么需要"演进史"视角
2023年,所有人都在谈Prompt Engineering。 2024年底,“Context Engineering”(上下文工程)开始流行。 2025年,“Harness Engineering”(环境/脚手架工程)被反复提及。 2026年6月,"Loop Engineering"一夜爆火。
很多人困惑:这些词是不是同一件事换了三个马甲?营销词?我后台收到过不下二十条这样的私信,最狠的一条说:“每年造个新词,卖课的又要收智商税了。”
我理解这种愤怒——过去三年被新词割过韭菜的人太多了。但这一次真不一样。答案是:不是马甲,是工程对象的四次跃迁。 每一代解决的核心问题不同,工作单元不同,可复用资产不同。你把四代的工作日志摆在一起看,会发现连"一天在干什么"都长得完全不一样。
#mermaid-svg-xLUo3f9Pk9rul2qD{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xLUo3f9Pk9rul2qD .error-icon{fill:#552222;}#mermaid-svg-xLUo3f9Pk9rul2qD .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xLUo3f9Pk9rul2qD .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xLUo3f9Pk9rul2qD .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xLUo3f9Pk9rul2qD .marker.cross{stroke:#333333;}#mermaid-svg-xLUo3f9Pk9rul2qD svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xLUo3f9Pk9rul2qD p{margin:0;}#mermaid-svg-xLUo3f9Pk9rul2qD .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD .cluster-label text{fill:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD .cluster-label span{color:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD .cluster-label span p{background-color:transparent;}#mermaid-svg-xLUo3f9Pk9rul2qD .label text,#mermaid-svg-xLUo3f9Pk9rul2qD span{fill:#333;color:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD .node rect,#mermaid-svg-xLUo3f9Pk9rul2qD .node circle,#mermaid-svg-xLUo3f9Pk9rul2qD .node ellipse,#mermaid-svg-xLUo3f9Pk9rul2qD .node polygon,#mermaid-svg-xLUo3f9Pk9rul2qD .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xLUo3f9Pk9rul2qD .rough-node .label text,#mermaid-svg-xLUo3f9Pk9rul2qD .node .label text,#mermaid-svg-xLUo3f9Pk9rul2qD .image-shape .label,#mermaid-svg-xLUo3f9Pk9rul2qD .icon-shape .label{text-anchor:middle;}#mermaid-svg-xLUo3f9Pk9rul2qD .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xLUo3f9Pk9rul2qD .rough-node .label,#mermaid-svg-xLUo3f9Pk9rul2qD .node .label,#mermaid-svg-xLUo3f9Pk9rul2qD .image-shape .label,#mermaid-svg-xLUo3f9Pk9rul2qD .icon-shape .label{text-align:center;}#mermaid-svg-xLUo3f9Pk9rul2qD .node.clickable{cursor:pointer;}#mermaid-svg-xLUo3f9Pk9rul2qD .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xLUo3f9Pk9rul2qD .arrowheadPath{fill:#333333;}#mermaid-svg-xLUo3f9Pk9rul2qD .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xLUo3f9Pk9rul2qD .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xLUo3f9Pk9rul2qD .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xLUo3f9Pk9rul2qD .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xLUo3f9Pk9rul2qD .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xLUo3f9Pk9rul2qD .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xLUo3f9Pk9rul2qD .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xLUo3f9Pk9rul2qD .cluster text{fill:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD .cluster span{color:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xLUo3f9Pk9rul2qD .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xLUo3f9Pk9rul2qD rect.text{fill:none;stroke-width:0;}#mermaid-svg-xLUo3f9Pk9rul2qD .icon-shape,#mermaid-svg-xLUo3f9Pk9rul2qD .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xLUo3f9Pk9rul2qD .icon-shape p,#mermaid-svg-xLUo3f9Pk9rul2qD .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xLUo3f9Pk9rul2qD .icon-shape .label rect,#mermaid-svg-xLUo3f9Pk9rul2qD .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xLUo3f9Pk9rul2qD .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xLUo3f9Pk9rul2qD .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xLUo3f9Pk9rul2qD :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
2023Prompt Engineering工程对象:一段文本
2024Context Engineering工程对象:一个上下文窗口
2025Harness Engineering工程对象:一整套环境
2026Loop Engineering工程对象:一个控制系统
我自己的演进史就是这四段的活标本:2023年我攒了400多条提示词模板,自认提示词大师;2024年开始天天跟上下文长度搏斗;2025年折腾MCP服务器和AGENTS.md折腾到半夜;2026年回头看,前三段攒下的东西一个都没浪费——它们全变成了循环的零件。这个"全都没浪费"很关键,后面会反复出现。
二、第一代:Prompt Engineering(提示词工程)
核心问题
如何用一段文字,让模型输出我想要的结果?
工程对象
单次输入的那段文本(prompt)。
典型技术
| Few-shot | 给几个例子让模型模仿 | 对格式类任务立竿见影 |
| Chain-of-Thought | 让模型"一步步想" | 数学逻辑类提升明显 |
| Role-play | 设定角色身份 | 玄学成分居多,慎用 |
| 输出格式约束 | “只输出JSON,不要解释” | 配合pydantic校验才是完全体 |
工作单元
一次对话 = 一条精心雕琢的提示词
局限性
- 单发上限:无论提示词多完美,一次生成的质量天花板是固定的
- 无法反馈:模型写完就完了,没有"检查-修正"的过程
- 脆弱:换个模型、换个版本,提示词效果可能骤降
脆弱这一条我吃过血亏。2024年我给团队维护了一套"咒语级"提示词库,某个模型小版本升级后,三分之一的咒语直接失灵——输出格式跑偏、角色扮演失效。把工程能力建立在措辞上,就像把房子盖在沙子上:模型一换代,地基就塌。
遗留资产
Prompt Engineering 没有死亡。它变成了 Loop Engineering 内部的一个原子步骤——你在循环的每一轮里,仍然需要写好提示词。事实上循环工程对提示词的要求更高了,因为循环里的提示词要能被机器组装、被版本管理、被反复运行,而不是靠你现场的手感。
踩坑提示:别信"提示词工程已死"的论调就放弃积累提示词库。正确的姿势是把提示词从"聊天框里的口癖"升级成"仓库里的文件"——放进 Skills、写进模板、纳入代码评审。手艺变成资产,才不会随模型升级蒸发。
三、第二代:Context Engineering(上下文工程)
核心问题
模型面前的上下文窗口是有限的,如何决定"放什么进去、拿走什么"?
触发事件
2024年底到2025年,几个关键人物的表态让这个词出圈:
- Tobi Lütke(Shopify CEO):把Context Engineering定义为"为模型组装恰到好处的信息集,让它完成下一步"的艺术
- Andrej Karpathy 转发背书,指出"人们应该少谈Prompt,多谈Context"
工程对象
整个上下文窗口——不只是当前那条提示词,还包括历史对话、工具返回结果、检索到的文档、系统提示词。
核心心智模型:注意力预算
#mermaid-svg-DKz6uLvGEK12jr64{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DKz6uLvGEK12jr64 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DKz6uLvGEK12jr64 .error-icon{fill:#552222;}#mermaid-svg-DKz6uLvGEK12jr64 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DKz6uLvGEK12jr64 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DKz6uLvGEK12jr64 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DKz6uLvGEK12jr64 .marker.cross{stroke:#333333;}#mermaid-svg-DKz6uLvGEK12jr64 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DKz6uLvGEK12jr64 p{margin:0;}#mermaid-svg-DKz6uLvGEK12jr64 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DKz6uLvGEK12jr64 .cluster-label text{fill:#333;}#mermaid-svg-DKz6uLvGEK12jr64 .cluster-label span{color:#333;}#mermaid-svg-DKz6uLvGEK12jr64 .cluster-label span p{background-color:transparent;}#mermaid-svg-DKz6uLvGEK12jr64 .label text,#mermaid-svg-DKz6uLvGEK12jr64 span{fill:#333;color:#333;}#mermaid-svg-DKz6uLvGEK12jr64 .node rect,#mermaid-svg-DKz6uLvGEK12jr64 .node circle,#mermaid-svg-DKz6uLvGEK12jr64 .node ellipse,#mermaid-svg-DKz6uLvGEK12jr64 .node polygon,#mermaid-svg-DKz6uLvGEK12jr64 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DKz6uLvGEK12jr64 .rough-node .label text,#mermaid-svg-DKz6uLvGEK12jr64 .node .label text,#mermaid-svg-DKz6uLvGEK12jr64 .image-shape .label,#mermaid-svg-DKz6uLvGEK12jr64 .icon-shape .label{text-anchor:middle;}#mermaid-svg-DKz6uLvGEK12jr64 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DKz6uLvGEK12jr64 .rough-node .label,#mermaid-svg-DKz6uLvGEK12jr64 .node .label,#mermaid-svg-DKz6uLvGEK12jr64 .image-shape .label,#mermaid-svg-DKz6uLvGEK12jr64 .icon-shape .label{text-align:center;}#mermaid-svg-DKz6uLvGEK12jr64 .node.clickable{cursor:pointer;}#mermaid-svg-DKz6uLvGEK12jr64 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DKz6uLvGEK12jr64 .arrowheadPath{fill:#333333;}#mermaid-svg-DKz6uLvGEK12jr64 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DKz6uLvGEK12jr64 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DKz6uLvGEK12jr64 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DKz6uLvGEK12jr64 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DKz6uLvGEK12jr64 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DKz6uLvGEK12jr64 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DKz6uLvGEK12jr64 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DKz6uLvGEK12jr64 .cluster text{fill:#333;}#mermaid-svg-DKz6uLvGEK12jr64 .cluster span{color:#333;}#mermaid-svg-DKz6uLvGEK12jr64 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DKz6uLvGEK12jr64 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DKz6uLvGEK12jr64 rect.text{fill:none;stroke-width:0;}#mermaid-svg-DKz6uLvGEK12jr64 .icon-shape,#mermaid-svg-DKz6uLvGEK12jr64 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DKz6uLvGEK12jr64 .icon-shape p,#mermaid-svg-DKz6uLvGEK12jr64 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DKz6uLvGEK12jr64 .icon-shape .label rect,#mermaid-svg-DKz6uLvGEK12jr64 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DKz6uLvGEK12jr64 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DKz6uLvGEK12jr64 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DKz6uLvGEK12jr64 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
塞得越多,反而越笨
上下文窗口例如 200K tokens
注意力预算
系统提示词
历史对话
工具结果
检索文档
当前任务
Context Rot上下文腐烂
关键洞察:上下文不是免费的RAM。塞满100K token的历史,模型反而会:
- 忽略中间部分(“lost in the middle”)
- 被无关信息干扰
- 推理能力下降
我做过一次很土但很有说服力的实验:同一个Bug修复任务,一份上下文里塞了完整对话历史(约90K token),另一份只保留剪枝后的高信号内容(约12K token)。结果精简版一轮就修对了,全量版跑了五轮还在原地绕。上下文工程的本质不是"塞得多",是"每一token都值得被模型看一眼"。
典型技术
| Compaction | 历史太长时压缩成摘要 | 对话超过窗口一半时 |
| Tool-result clearing | 清除旧的工具返回结果 | 工具输出巨大时 |
| JIT检索 | 按需拉取,而非提前全量装载 | 代码库大、相关性稀疏时 |
| 外部记忆 | 状态存磁盘,不占上下文 | 跨会话任务 |
| 上下文剪枝 | 只保留高信号token | 任何长任务的每一轮 |
工作单元
一个任务周期 = 一组上下文管理策略
遗留资产
Context Engineering 同样没有死亡。它是 Loop Engineering 内部的燃料管理系统——循环每一轮都要重新组装上下文。循环跑得越久,这层越值钱:一个跑20轮的循环,如果没有Compaction,第15轮的上下文必然腐烂成一锅粥。
本课程第4章《上下文工程:循环的燃料管理系统》会用8篇深度解剖这一层。
四、第三代:Harness Engineering(环境工程)
核心问题
模型再聪明,如果它看不见文件、跑不了命令、拿不到反馈,它什么都干不了。如何为它搭建"能干活的环境"?
工程对象
模型所处的整个工作环境(harness):
- 有哪些工具可调用(文件读写、Shell执行、搜索)
- 有哪些文件可见(代码库、文档、配置)
- 有哪些规范约束(AGENTS.md、编码约定)
- 有哪些反馈信号(编译错误、测试结果、lint)
核心比喻
如果说模型是"引擎",那harness就是"整台车"——引擎再好,没有方向盘、轮子、仪表盘也开不动。
#mermaid-svg-u0nxJlzsRFyOiIEI{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-u0nxJlzsRFyOiIEI .error-icon{fill:#552222;}#mermaid-svg-u0nxJlzsRFyOiIEI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-u0nxJlzsRFyOiIEI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-u0nxJlzsRFyOiIEI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-u0nxJlzsRFyOiIEI .marker.cross{stroke:#333333;}#mermaid-svg-u0nxJlzsRFyOiIEI svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-u0nxJlzsRFyOiIEI p{margin:0;}#mermaid-svg-u0nxJlzsRFyOiIEI .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI .cluster-label text{fill:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI .cluster-label span{color:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI .cluster-label span p{background-color:transparent;}#mermaid-svg-u0nxJlzsRFyOiIEI .label text,#mermaid-svg-u0nxJlzsRFyOiIEI span{fill:#333;color:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI .node rect,#mermaid-svg-u0nxJlzsRFyOiIEI .node circle,#mermaid-svg-u0nxJlzsRFyOiIEI .node ellipse,#mermaid-svg-u0nxJlzsRFyOiIEI .node polygon,#mermaid-svg-u0nxJlzsRFyOiIEI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-u0nxJlzsRFyOiIEI .rough-node .label text,#mermaid-svg-u0nxJlzsRFyOiIEI .node .label text,#mermaid-svg-u0nxJlzsRFyOiIEI .image-shape .label,#mermaid-svg-u0nxJlzsRFyOiIEI .icon-shape .label{text-anchor:middle;}#mermaid-svg-u0nxJlzsRFyOiIEI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-u0nxJlzsRFyOiIEI .rough-node .label,#mermaid-svg-u0nxJlzsRFyOiIEI .node .label,#mermaid-svg-u0nxJlzsRFyOiIEI .image-shape .label,#mermaid-svg-u0nxJlzsRFyOiIEI .icon-shape .label{text-align:center;}#mermaid-svg-u0nxJlzsRFyOiIEI .node.clickable{cursor:pointer;}#mermaid-svg-u0nxJlzsRFyOiIEI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-u0nxJlzsRFyOiIEI .arrowheadPath{fill:#333333;}#mermaid-svg-u0nxJlzsRFyOiIEI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-u0nxJlzsRFyOiIEI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-u0nxJlzsRFyOiIEI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u0nxJlzsRFyOiIEI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-u0nxJlzsRFyOiIEI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u0nxJlzsRFyOiIEI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-u0nxJlzsRFyOiIEI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-u0nxJlzsRFyOiIEI .cluster text{fill:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI .cluster span{color:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-u0nxJlzsRFyOiIEI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-u0nxJlzsRFyOiIEI rect.text{fill:none;stroke-width:0;}#mermaid-svg-u0nxJlzsRFyOiIEI .icon-shape,#mermaid-svg-u0nxJlzsRFyOiIEI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-u0nxJlzsRFyOiIEI .icon-shape p,#mermaid-svg-u0nxJlzsRFyOiIEI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-u0nxJlzsRFyOiIEI .icon-shape .label rect,#mermaid-svg-u0nxJlzsRFyOiIEI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-u0nxJlzsRFyOiIEI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-u0nxJlzsRFyOiIEI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-u0nxJlzsRFyOiIEI :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
环境 Harness
结构化喂回
模型 Model
工具箱 Tools
文件系统 Files
反馈信号 Feedback
规范约定 Conventions
典型技术
| 工具注册表 | 定义模型可调用的函数 | 工具描述写得含糊,模型就乱调 |
| MCP协议 | 标准化连接外部系统 | 52%的端点已停维护,选型看维护者 |
| AGENTS.md | 把项目意图写在智能体外面 | 写成小说没人读,要写成条令 |
| 确定性验证器 | 编译/lint/测试三件套 | 别用模型自评冒充验证器 |
| 沙箱隔离 | 安全的命令执行环境 | 没沙箱跑rm的事故我见过一次就够 |
工作单元
一个智能体 = 模型 + 环境设施
遗留资产
Harness Engineering 是 Loop Engineering 内部的执行层。循环每一轮"采取行动"时,用的就是这套环境。工具翻车一次,循环就多绕一圈——环境质量直接决定循环的单轮成功率。
本课程第5章《循环的五大原语与生态》、第8章《工具与MCP生态实战》、第7章《验证工程》都在讲这一层。
五、第四代:Loop Engineering(循环工程)
核心问题
模型能干活了,但谁来决定"下一步干什么"?谁来检查"干得对不对"?谁来记住"已经干过什么"?如何让整个过程自主运行起来?
工程对象
整个控制系统——不只是单次任务的环境,而是:
- 提示的自动生成(谁来写下一轮的prompt)
- 结果的自动检查(谁来判定成功与否)
- 状态的自动记忆(跨轮次、跨会话保留什么)
- 流程的自动重跑(失败后如何自我修正)
核心比喻
如果:
- Prompt Engineering 是"写一封好邮件"
- Context Engineering 是"整理好办公桌"
- Harness Engineering 是"给员工配齐工具和电脑"
- 那 Loop Engineering 就是"设计整个公司的工作流"——谁派活、谁验收、谁存档
#mermaid-svg-SH9sZB28G6cAasIb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SH9sZB28G6cAasIb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SH9sZB28G6cAasIb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SH9sZB28G6cAasIb .error-icon{fill:#552222;}#mermaid-svg-SH9sZB28G6cAasIb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SH9sZB28G6cAasIb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SH9sZB28G6cAasIb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SH9sZB28G6cAasIb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SH9sZB28G6cAasIb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SH9sZB28G6cAasIb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SH9sZB28G6cAasIb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SH9sZB28G6cAasIb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SH9sZB28G6cAasIb .marker.cross{stroke:#333333;}#mermaid-svg-SH9sZB28G6cAasIb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SH9sZB28G6cAasIb p{margin:0;}#mermaid-svg-SH9sZB28G6cAasIb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-SH9sZB28G6cAasIb .cluster-label text{fill:#333;}#mermaid-svg-SH9sZB28G6cAasIb .cluster-label span{color:#333;}#mermaid-svg-SH9sZB28G6cAasIb .cluster-label span p{background-color:transparent;}#mermaid-svg-SH9sZB28G6cAasIb .label text,#mermaid-svg-SH9sZB28G6cAasIb span{fill:#333;color:#333;}#mermaid-svg-SH9sZB28G6cAasIb .node rect,#mermaid-svg-SH9sZB28G6cAasIb .node circle,#mermaid-svg-SH9sZB28G6cAasIb .node ellipse,#mermaid-svg-SH9sZB28G6cAasIb .node polygon,#mermaid-svg-SH9sZB28G6cAasIb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SH9sZB28G6cAasIb .rough-node .label text,#mermaid-svg-SH9sZB28G6cAasIb .node .label text,#mermaid-svg-SH9sZB28G6cAasIb .image-shape .label,#mermaid-svg-SH9sZB28G6cAasIb .icon-shape .label{text-anchor:middle;}#mermaid-svg-SH9sZB28G6cAasIb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SH9sZB28G6cAasIb .rough-node .label,#mermaid-svg-SH9sZB28G6cAasIb .node .label,#mermaid-svg-SH9sZB28G6cAasIb .image-shape .label,#mermaid-svg-SH9sZB28G6cAasIb .icon-shape .label{text-align:center;}#mermaid-svg-SH9sZB28G6cAasIb .node.clickable{cursor:pointer;}#mermaid-svg-SH9sZB28G6cAasIb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SH9sZB28G6cAasIb .arrowheadPath{fill:#333333;}#mermaid-svg-SH9sZB28G6cAasIb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SH9sZB28G6cAasIb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SH9sZB28G6cAasIb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SH9sZB28G6cAasIb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SH9sZB28G6cAasIb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SH9sZB28G6cAasIb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SH9sZB28G6cAasIb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SH9sZB28G6cAasIb .cluster text{fill:#333;}#mermaid-svg-SH9sZB28G6cAasIb .cluster span{color:#333;}#mermaid-svg-SH9sZB28G6cAasIb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SH9sZB28G6cAasIb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SH9sZB28G6cAasIb rect.text{fill:none;stroke-width:0;}#mermaid-svg-SH9sZB28G6cAasIb .icon-shape,#mermaid-svg-SH9sZB28G6cAasIb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SH9sZB28G6cAasIb .icon-shape p,#mermaid-svg-SH9sZB28G6cAasIb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SH9sZB28G6cAasIb .icon-shape .label rect,#mermaid-svg-SH9sZB28G6cAasIb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SH9sZB28G6cAasIb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SH9sZB28G6cAasIb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SH9sZB28G6cAasIb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
循环 Loop
未达成
更新状态
达成
Prompt工程写本轮指令
Context工程组装燃料
Harness工程提供工具环境
验证器检查结果
记忆外置状态
交付
典型技术
| /goal | 可验证终止条件 |
| Sub-agents | Maker/Checker分离 |
| Worktrees | 并行循环隔离 |
| Automations | 定时心跳 |
| Hooks | 生命周期拦截 |
| 轨迹落盘 | 可回放日志 |
工作单元
一个可交付成果 = 一个自主运行的循环
到这里四代讲完了。注意一个规律:每一代都在回答"下一代才敢问的问题"。没有Prompt层的质量打底,Context层无从优化;没有Harness层的反馈信号,Loop层的验证器根本无米下锅。
六、四代对照总表与跃迁规律
| 诞生年份 | 2023 | 2024 | 2025 | 2026 |
| 核心问题 | 怎么措辞 | 放什么进去 | 配什么环境 | 怎么自主跑 |
| 工程对象 | 一段文本 | 一个上下文窗口 | 一整套环境 | 一个控制系统 |
| 工作单元 | 一条提示词 | 一组上下文策略 | 一个智能体环境 | 一个可交付循环 |
| 关键指标 | 输出质量 | 注意力效率 | 工具成功率 | 无人值守成功率 |
| 代表技术 | CoT/Few-shot | Compaction/剪枝 | MCP/AGENTS.md | /goal/Sub-agents |
| 失败模式 | 措辞不当 | 上下文腐烂 | 工具翻车 | doom loop |
| 可复用资产 | 提示词模板 | 上下文策略库 | 工具/技能包 | 循环架构 |
用一张图理解"包裹"关系
#mermaid-svg-sDDJjSxKLkGsRdv5{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sDDJjSxKLkGsRdv5 .error-icon{fill:#552222;}#mermaid-svg-sDDJjSxKLkGsRdv5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sDDJjSxKLkGsRdv5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .marker.cross{stroke:#333333;}#mermaid-svg-sDDJjSxKLkGsRdv5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sDDJjSxKLkGsRdv5 p{margin:0;}#mermaid-svg-sDDJjSxKLkGsRdv5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .cluster-label text{fill:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .cluster-label span{color:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .cluster-label span p{background-color:transparent;}#mermaid-svg-sDDJjSxKLkGsRdv5 .label text,#mermaid-svg-sDDJjSxKLkGsRdv5 span{fill:#333;color:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .node rect,#mermaid-svg-sDDJjSxKLkGsRdv5 .node circle,#mermaid-svg-sDDJjSxKLkGsRdv5 .node ellipse,#mermaid-svg-sDDJjSxKLkGsRdv5 .node polygon,#mermaid-svg-sDDJjSxKLkGsRdv5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .rough-node .label text,#mermaid-svg-sDDJjSxKLkGsRdv5 .node .label text,#mermaid-svg-sDDJjSxKLkGsRdv5 .image-shape .label,#mermaid-svg-sDDJjSxKLkGsRdv5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-sDDJjSxKLkGsRdv5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .rough-node .label,#mermaid-svg-sDDJjSxKLkGsRdv5 .node .label,#mermaid-svg-sDDJjSxKLkGsRdv5 .image-shape .label,#mermaid-svg-sDDJjSxKLkGsRdv5 .icon-shape .label{text-align:center;}#mermaid-svg-sDDJjSxKLkGsRdv5 .node.clickable{cursor:pointer;}#mermaid-svg-sDDJjSxKLkGsRdv5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .arrowheadPath{fill:#333333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sDDJjSxKLkGsRdv5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sDDJjSxKLkGsRdv5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sDDJjSxKLkGsRdv5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sDDJjSxKLkGsRdv5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .cluster text{fill:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 .cluster span{color:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sDDJjSxKLkGsRdv5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sDDJjSxKLkGsRdv5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-sDDJjSxKLkGsRdv5 .icon-shape,#mermaid-svg-sDDJjSxKLkGsRdv5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sDDJjSxKLkGsRdv5 .icon-shape p,#mermaid-svg-sDDJjSxKLkGsRdv5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sDDJjSxKLkGsRdv5 .icon-shape .label rect,#mermaid-svg-sDDJjSxKLkGsRdv5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sDDJjSxKLkGsRdv5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sDDJjSxKLkGsRdv5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sDDJjSxKLkGsRdv5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Loop 循环工程
Harness 环境工程
Context 上下文工程
包含
包含
包含
Prompt 提示词工程
提示词
关键洞察:高一层不是抛弃低一层,而是把低一层作为组件封装进来。
- 你设计一个循环(Loop),循环的每一轮还是要写好提示词(Prompt)
- 你管理上下文(Context),但上下文里装的还是提示词组装的结果
- 你搭建环境(Harness),环境里的模型依然需要好的上下文和提示词
为什么是"包裹"而非"取代"
三类关系辨析
| 取代 | 汽车取代马车 | 马车真的消失了 | 旧事物退出使用 |
| 并列 | 前端 vs 后端 | 各管各的领域 | 边界清晰不重叠 |
| 包裹 | 函数调用嵌套 | 高层每次运行都调用低层 | 旧事物成为内部组件 |
四代范式是包裹关系:
Loop Engineering
└── 依赖 Harness Engineering(执行环境)
└── 依赖 Context Engineering(上下文管理)
└── 依赖 Prompt Engineering(提示词组装)
判断"取代还是包裹"有个很实用的检验法:把高层拆开,看低层还在不在里面干活。拆开任何一个循环,你都能看到每一轮的提示词组装、上下文剪枝、工具调用——低层活得好好的,只是不再由你亲手干了。这就叫包裹。
一个具体例子:一个Bug的四层旅行
假设你要实现"夜间自动修Bug循环",拆开看每一层的贡献:
# Loop层:定义整个控制系统
while not goal_achieved():
# Context层:组装本轮上下文(不是全量历史,而是剪枝后的高信号集)
context = build_context(
recent_turns=last_3,
summary=compacted_summary,
relevant_files=jit_retrieve(bug_keywords)
)
# Prompt层:组装本轮具体指令
prompt = f"""
当前目标:{goal}
最近失败信息:{context.last_error}
约束:{context.conventions}
"""
# Harness层:提供工具并有能力执行
response = model.chat(prompt, tools=[read_file, edit_file, run_test])
# 执行动作(Harness层)
result = dispatch_tool(response.tool_call)
# 验证(Loop层的核心动作)
if validate(result): # 确定性验证器
break
# 记忆外置(Loop层)
save_trace(result)
一篇文章里,四层同时在场。这就是"包裹"的含义。
我再给你讲个更具体的案例故事。去年我接手过一个跑了半年的"依赖升级循环",它状态很差:成功率只有41%,团队想推倒重来。我拆开看,问题根本不在循环——是第13轮左右上下文开始腐烂(Context层没做Compaction),模型在被污染的上下文里越修越错。我只加了一个"每8轮压缩历史为摘要"的策略,其他一行没动,成功率回到78%。高层的病,病根在低层——这是包裹关系最实用的推论:排查问题时四层都要看,别只会重启循环。
踩坑提示:包裹关系的反面教材是"跳层"。我见过有人连提示词都写不利索就上多Agent编排,结果15个并行循环每个都产出垃圾——循环只是把垃圾的生产效率提高了15倍。高层放大的是低层的水平,无论好坏。
范式跃迁的驱动力
为什么会出现这四次跃迁?背后有共同规律:
#mermaid-svg-RPsXACZgXPKzY26w{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RPsXACZgXPKzY26w .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RPsXACZgXPKzY26w .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RPsXACZgXPKzY26w .error-icon{fill:#552222;}#mermaid-svg-RPsXACZgXPKzY26w .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RPsXACZgXPKzY26w .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RPsXACZgXPKzY26w .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RPsXACZgXPKzY26w .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RPsXACZgXPKzY26w .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RPsXACZgXPKzY26w .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RPsXACZgXPKzY26w .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RPsXACZgXPKzY26w .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RPsXACZgXPKzY26w .marker.cross{stroke:#333333;}#mermaid-svg-RPsXACZgXPKzY26w svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RPsXACZgXPKzY26w p{margin:0;}#mermaid-svg-RPsXACZgXPKzY26w .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-RPsXACZgXPKzY26w .cluster-label text{fill:#333;}#mermaid-svg-RPsXACZgXPKzY26w .cluster-label span{color:#333;}#mermaid-svg-RPsXACZgXPKzY26w .cluster-label span p{background-color:transparent;}#mermaid-svg-RPsXACZgXPKzY26w .label text,#mermaid-svg-RPsXACZgXPKzY26w span{fill:#333;color:#333;}#mermaid-svg-RPsXACZgXPKzY26w .node rect,#mermaid-svg-RPsXACZgXPKzY26w .node circle,#mermaid-svg-RPsXACZgXPKzY26w .node ellipse,#mermaid-svg-RPsXACZgXPKzY26w .node polygon,#mermaid-svg-RPsXACZgXPKzY26w .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RPsXACZgXPKzY26w .rough-node .label text,#mermaid-svg-RPsXACZgXPKzY26w .node .label text,#mermaid-svg-RPsXACZgXPKzY26w .image-shape .label,#mermaid-svg-RPsXACZgXPKzY26w .icon-shape .label{text-anchor:middle;}#mermaid-svg-RPsXACZgXPKzY26w .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RPsXACZgXPKzY26w .rough-node .label,#mermaid-svg-RPsXACZgXPKzY26w .node .label,#mermaid-svg-RPsXACZgXPKzY26w .image-shape .label,#mermaid-svg-RPsXACZgXPKzY26w .icon-shape .label{text-align:center;}#mermaid-svg-RPsXACZgXPKzY26w .node.clickable{cursor:pointer;}#mermaid-svg-RPsXACZgXPKzY26w .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RPsXACZgXPKzY26w .arrowheadPath{fill:#333333;}#mermaid-svg-RPsXACZgXPKzY26w .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RPsXACZgXPKzY26w .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RPsXACZgXPKzY26w .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RPsXACZgXPKzY26w .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RPsXACZgXPKzY26w .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RPsXACZgXPKzY26w .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RPsXACZgXPKzY26w .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RPsXACZgXPKzY26w .cluster text{fill:#333;}#mermaid-svg-RPsXACZgXPKzY26w .cluster span{color:#333;}#mermaid-svg-RPsXACZgXPKzY26w div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RPsXACZgXPKzY26w .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RPsXACZgXPKzY26w rect.text{fill:none;stroke-width:0;}#mermaid-svg-RPsXACZgXPKzY26w .icon-shape,#mermaid-svg-RPsXACZgXPKzY26w .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RPsXACZgXPKzY26w .icon-shape p,#mermaid-svg-RPsXACZgXPKzY26w .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RPsXACZgXPKzY26w .icon-shape .label rect,#mermaid-svg-RPsXACZgXPKzY26w .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RPsXACZgXPKzY26w .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RPsXACZgXPKzY26w .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RPsXACZgXPKzY26w :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
触发
转向
能力天花板暴露
工程重心上移
新范式诞生
旧范式降级为子步骤
提示词写不出更好结果
从优化输入,到优化系统
| Prompt→Context | 提示词再精妙也无法突破上下文限制 | 从"一条文本"到"整个窗口" |
| Context→Harness | 上下文再好模型也无手无脚 | 从"看"到"做" |
| Harness→Loop | 环境再好也需人按按钮 | 从"工具"到"自主" |
一个有用的判断法则
当你在某一层反复调优却收效甚微时,说明瓶颈已经转移到更高一层。
- 提示词怎么写都不满意 → 检查上下文是否被污染
- 上下文管得很好还是不行 → 检查工具体系是否缺失
- 环境齐全了还是要人盯着 → 该上循环工程了
这个法则我叫它"层间止损"。人最容易犯的错,是在自己熟悉的那层死磕——提示词大师愿意花三天调措辞,也不肯花三十分钟看一眼上下文里是不是混进了三页无关日志。熟悉的锤子,会让人把所有问题都看成钉子。
七、实操:定位你的层级并往上爬
阶段1:确认你的当前层级
自测清单:
– [ ] 我是否还在纠结"换个措辞试试"?→ 你停在 Prompt 层
– [ ] 我是否开始关注"该给模型看什么文件"?→ 你到了 Context 层
– [ ] 我是否在搭建工具/配置MCP/写AGENTS.md?→ 你到了 Harness 层
– [ ] 我是否在设计循环、验证器、停止条件?→ 你到了 Loop 层
阶段2:用代码度量你的层级
自测清单是主观的,我更喜欢能跑出数字的度量。下面这个小工具扫描你的项目目录,按四层资产的存在性给出量化评分——工程规范照旧:pydantic 校验配置,日志控制台+文件双输出、按月滚动保留12个月,退出打印总结:
"""layer_scout.py — 四层范式成熟度度量器
用法: uv run python layer_scout.py –path .
依赖: uv add pydantic
"""
import logging, logging.handlers
from pathlib import Path
from pydantic import BaseModel
# 日志:控制台+文件双输出,按月分割,保留12个月
log = logging.getLogger("scout")
log.setLevel(logging.INFO)
log.addHandler(logging.StreamHandler())
fh = logging.handlers.TimedRotatingFileHandler(
"logs/scout.log", when="MIDNIGHT", interval=30, backupCount=12, encoding="utf-8")
fh.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
log.addHandler(fh)
class LayerScore(BaseModel):
"""四层评分结果,pydantic保证字段类型正确"""
prompt: int = 0 # 提示词模板文件数
context: int = 0 # 上下文策略痕迹(compaction/memory)
harness: int = 0 # 工具/MCP/AGENTS.md
loop: int = 0 # 循环配置/验证器/CI门禁
def level(self) –> str:
total = self.prompt + self.context + self.harness + self.loop
return ("Loop架构师" if total >= 12 else "Harness层"
if total >= 8 else "Context层" if total >= 4 else "Prompt层")
def scan(root: Path) –> LayerScore:
files = [p for p in root.rglob("*") if p.is_file()]
return LayerScore(
prompt=sum("prompt" in p.name.lower() or "template" in p.name.lower() for p in files),
context=sum(any(k in p.name.lower() for k in ("memory", "compact", "summary")) for p in files),
harness=sum(any(k in p.name.lower() for k in ("agents", "mcp", "tool")) for p in files),
loop=sum(any(k in p.name.lower() for k in ("loop", "goal", "validator", "workflow")) for p in files),
)
if __name__ == "__main__":
score = scan(Path("."))
log.info("Prompt层=%d Context层=%d Harness层=%d Loop层=%d",
score.prompt, score.context, score.harness, score.loop)
log.info("当前定位=%s", score.level())
log.info("========== 度量总结 ==========")
log.info("短板层=%s", min(score.model_dump(), key=score.model_dump().get))
跑完的控制台输出长这样:
$ uv run python layer_scout.py –path .
2026-09-15 20:11:03 [INFO] Prompt层=6 Context层=1 Harness层=2 Loop层=0
2026-09-15 20:11:03 [INFO] 当前定位=Context层
2026-09-15 20:11:03 [INFO] ========== 度量总结 ==========
2026-09-15 20:11:03 [INFO] 短板层=loop
这个输出的含义很直白:提示词资产不少、环境刚起步、循环还没影——典型的"上层地基没打好就想跳楼"。别急着上多Agent,先把 loop 字段从0变1:写一个带停止条件的最小循环。
阶段3:不要跳过任何一层
很多人想直接上循环工程,但底层不牢,循环一定跑不稳:
| 跳过Prompt | 每轮输出质量差,循环在垃圾上迭代 | 先沉淀5个高频任务的提示词模板 |
| 跳过Context | 几轮后上下文爆炸或腐烂,循环失智 | 先上Compaction+外部记忆 |
| 跳过Harness | 模型无反馈信号,只能靠自我评估(不可信) | 先接通编译/测试/lint三件套 |
阶段4:按"包裹"思路建设资产
#mermaid-svg-J2zX9fTFuVQuS6uS{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-J2zX9fTFuVQuS6uS .error-icon{fill:#552222;}#mermaid-svg-J2zX9fTFuVQuS6uS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-J2zX9fTFuVQuS6uS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-J2zX9fTFuVQuS6uS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-J2zX9fTFuVQuS6uS .marker.cross{stroke:#333333;}#mermaid-svg-J2zX9fTFuVQuS6uS svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-J2zX9fTFuVQuS6uS p{margin:0;}#mermaid-svg-J2zX9fTFuVQuS6uS .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS .cluster-label text{fill:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS .cluster-label span{color:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS .cluster-label span p{background-color:transparent;}#mermaid-svg-J2zX9fTFuVQuS6uS .label text,#mermaid-svg-J2zX9fTFuVQuS6uS span{fill:#333;color:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS .node rect,#mermaid-svg-J2zX9fTFuVQuS6uS .node circle,#mermaid-svg-J2zX9fTFuVQuS6uS .node ellipse,#mermaid-svg-J2zX9fTFuVQuS6uS .node polygon,#mermaid-svg-J2zX9fTFuVQuS6uS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-J2zX9fTFuVQuS6uS .rough-node .label text,#mermaid-svg-J2zX9fTFuVQuS6uS .node .label text,#mermaid-svg-J2zX9fTFuVQuS6uS .image-shape .label,#mermaid-svg-J2zX9fTFuVQuS6uS .icon-shape .label{text-anchor:middle;}#mermaid-svg-J2zX9fTFuVQuS6uS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-J2zX9fTFuVQuS6uS .rough-node .label,#mermaid-svg-J2zX9fTFuVQuS6uS .node .label,#mermaid-svg-J2zX9fTFuVQuS6uS .image-shape .label,#mermaid-svg-J2zX9fTFuVQuS6uS .icon-shape .label{text-align:center;}#mermaid-svg-J2zX9fTFuVQuS6uS .node.clickable{cursor:pointer;}#mermaid-svg-J2zX9fTFuVQuS6uS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-J2zX9fTFuVQuS6uS .arrowheadPath{fill:#333333;}#mermaid-svg-J2zX9fTFuVQuS6uS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-J2zX9fTFuVQuS6uS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-J2zX9fTFuVQuS6uS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J2zX9fTFuVQuS6uS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-J2zX9fTFuVQuS6uS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J2zX9fTFuVQuS6uS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-J2zX9fTFuVQuS6uS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-J2zX9fTFuVQuS6uS .cluster text{fill:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS .cluster span{color:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-J2zX9fTFuVQuS6uS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-J2zX9fTFuVQuS6uS rect.text{fill:none;stroke-width:0;}#mermaid-svg-J2zX9fTFuVQuS6uS .icon-shape,#mermaid-svg-J2zX9fTFuVQuS6uS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J2zX9fTFuVQuS6uS .icon-shape p,#mermaid-svg-J2zX9fTFuVQuS6uS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-J2zX9fTFuVQuS6uS .icon-shape .label rect,#mermaid-svg-J2zX9fTFuVQuS6uS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J2zX9fTFuVQuS6uS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-J2zX9fTFuVQuS6uS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-J2zX9fTFuVQuS6uS :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
资产体系
提示词库
上下文策略库
环境资产
循环资产
代码审查模板
修复指令模板
压缩提示词
剪枝规则
工具包与MCP服务器
AGENTS.md模板
验证器组件
编排模式与看板
一句话记住资产建设的顺序:先攒零件,再装整机。四层资产是四个零件盒,循环是整机——零件盒越满,整机组装越快。
小结
下节预告
四层范式给了你地图,但地图上有个巨大的坑还没填:为什么84%的人在用AI,却只有29%的人敢信AI输出的代码?下一节我用Stack Overflow和JetBrains的调查数据、METR那个"AI让你慢19%"的扎心实验,把信任危机的三重根源拆开——然后给你看清楚:这条信任鸿沟,恰恰是验证工程最大的机会窗口。
如果觉得本文对你有帮助,欢迎点赞、收藏、关注三连! 本系列持续更新中,120篇循环工程实战通关,关注不迷路~
网硕互联帮助中心



评论前必须登录!
注册