Files
wiki/AI Agent 驾驭工程/报告/loop-engineering-guide.html
zdh cc6e012903
Deploy Wiki to Production / deploy (push) Has been cancelled
feat: Loop 工程完全指南 [开发者向] — 新报告页入库
- 四阶段演进:Agent原语→Ralph Loop→调度收敛→系统化
- 16项关键技术理念,标注首创来源
- 六层架构+七大核心原则
- 三大产品对比(Claude Code/Codex/LangChain)
- 五步实战路线图+6种Loop模式速查+避坑指南
- 9项一手资料源链接
2026-06-21 18:45:34 +08:00

919 lines
44 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Loop 工程完全指南 — 从 Prompt 到 Loop 的范式跃迁 [开发者向]</title>
<style>
:root {
--color-primary: #0078D4;
--color-primary-hover: #106EBE;
--color-primary-active: #005A9E;
--color-primary-bg: #DEECF9;
--color-success: #107C10;
--color-success-bg: #DFF6DD;
--color-success-border: #A7E3A1;
--color-warning: #FF8C00;
--color-warning-bg: #FFF4CE;
--color-warning-border: #FFD335;
--color-error: #FF4D4F;
--color-error-bg: #FDE7E9;
--color-error-border: #EEACB2;
--bg: #F5F5F5;
--bg-container: #FFFFFF;
--bg-elevated: #FAFAFA;
--border: #D9D9D9;
--border-light: #F0F0F0;
--text-primary: #141414;
--text-secondary: #595959;
--text-tertiary: #767676;
--radius-sm: 6px;
--radius-md: 8px;
--radius-lg: 12px;
--shadow-sm: 0 1px 2px rgba(0,0,0,0.03), 0 1px 6px -1px rgba(0,0,0,0.02);
--shadow-md: 0 2px 4px rgba(0,0,0,0.04), 0 4px 12px -2px rgba(0,0,0,0.04);
--shadow-lg: 0 4px 8px rgba(0,0,0,0.06), 0 8px 24px -4px rgba(0,0,0,0.08);
--sidebar-w: 260px;
--header-h: 64px;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei',
'Helvetica Neue', Helvetica, Arial, sans-serif;
background: var(--bg);
color: var(--text-primary);
line-height: 1.57;
font-size: 15px;
}
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-tertiary); }
/* ===== HEADER ===== */
.header {
position: fixed;
top: 0; left: 0; right: 0;
height: var(--header-h);
background: rgba(255,255,255,0.88);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border-light);
display: flex;
align-items: center;
padding: 0 2rem;
z-index: 100;
}
.header h1 {
font-size: 18px;
font-weight: 700;
background: linear-gradient(135deg, var(--color-primary), #722ED1);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
color: transparent;
}
.header .back-link {
margin-right: 16px;
font-size: 13px;
color: var(--color-primary);
text-decoration: none;
flex-shrink: 0;
}
.header .back-link:hover { text-decoration: underline; }
.header .version {
margin-left: auto;
font-size: 12px;
color: var(--text-tertiary);
font-family: 'SF Mono', Monaco, monospace;
}
/* ===== SIDEBAR ===== */
.sidebar {
position: fixed;
top: var(--header-h); left: 0; bottom: 0;
width: var(--sidebar-w);
background: var(--bg-container);
border-right: 1px solid var(--border);
overflow-y: auto;
padding: 1.25rem 0;
z-index: 90;
}
.sidebar .toc-label {
font-size: 12px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-tertiary);
padding: 0 1.25rem;
margin-bottom: 0.75rem;
}
.sidebar nav ol { list-style: none; padding: 0; counter-reset: toc; }
.sidebar nav li { counter-increment: toc; padding: 0; }
.sidebar nav a {
display: block;
padding: 0.5rem 1.25rem;
color: var(--text-secondary);
text-decoration: none;
font-size: 13px;
line-height: 1.4;
border-left: 2px solid transparent;
transition: all 0.15s;
}
.sidebar nav a::before {
content: counter(toc) ". ";
color: var(--color-primary);
font-weight: 600;
font-size: 12px;
margin-right: 0.4rem;
}
.sidebar nav a:hover {
color: var(--color-primary);
background: var(--color-primary-bg);
}
.sidebar nav a.active {
color: var(--color-primary);
border-left-color: var(--color-primary);
background: var(--color-primary-bg);
font-weight: 600;
}
/* ===== MAIN ===== */
.main {
margin-left: var(--sidebar-w);
margin-top: var(--header-h);
padding: 32px 40px 64px;
min-height: calc(100vh - var(--header-h));
max-width: 1100px;
}
/* ===== KPI BAR ===== */
.kpi-bar {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-bottom: 32px;
}
.kpi {
flex: 1; min-width: 130px;
background: var(--bg-container);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: 16px 14px;
text-align: center;
box-shadow: var(--shadow-sm);
}
.kpi .num { font-size: 22px; font-weight: 800; color: var(--color-primary); line-height: 1.2; }
.kpi .label { font-size: 11px; color: var(--text-tertiary); margin-top: 4px; }
/* ===== SECTIONS ===== */
section {
margin: 48px 0;
scroll-margin-top: calc(var(--header-h) + 1rem);
}
section h2 { font-size:24px;line-height:32px;padding-bottom:8px;border-bottom:1px solid var(--border);margin-bottom:20px;color:var(--color-primary); }
section h3 { font-size:20px;line-height:28px;margin:24px 0 12px;color:#722ED1; }
section h4 { font-size:16px;line-height:24px;margin:16px 0 8px;color:var(--color-success); }
/* ===== PARAGRAPH ===== */
p {
color: var(--text-secondary);
font-size: 14px;
margin: 10px 0;
text-align: justify;
}
p.lead {
font-size: 16px;
color: var(--text-primary);
line-height: 1.9;
}
strong { color: var(--text-primary); }
/* ===== TABLES ===== */
table {
width: 100%;
border-collapse: collapse;
margin: 16px 0 24px;
font-size: 13px;
background: var(--bg-container);
border-radius: var(--radius-md);
overflow: hidden;
box-shadow: var(--shadow-sm);
}
thead th {
background: var(--color-primary);
color: #fff;
padding: 10px 14px;
text-align: left;
font-weight: 600;
font-size: 12px;
letter-spacing: 0.02em;
}
tbody td, tbody th {
padding: 10px 14px;
border-bottom: 1px solid var(--border-light);
vertical-align: top;
}
tbody tr:last-child td { border-bottom: none; }
tbody tr:nth-child(even) { background: var(--bg-elevated); }
tbody td:first-child {
font-weight: 600;
color: var(--text-primary);
white-space: nowrap;
}
/* ===== CODE / INLINE ===== */
code {
font-family: 'Cascadia Code', 'Fira Code', 'SF Mono', Monaco, monospace;
font-size: 12px;
background: var(--bg-elevated);
padding: 2px 6px;
border-radius: var(--radius-sm);
border: 1px solid var(--border-light);
color: var(--color-primary-active);
}
pre {
background: #1E1E1E;
color: #D4D4D4;
padding: 18px 20px;
border-radius: var(--radius-md);
overflow-x: auto;
margin: 16px 0;
font-size: 12px;
line-height: 1.65;
}
pre code {
background: none;
border: none;
padding: 0;
color: inherit;
}
/* ===== QUOTES ===== */
blockquote {
border-left: 3px solid var(--color-primary);
background: var(--color-primary-bg);
margin: 16px 0;
padding: 14px 18px;
border-radius: 0 var(--radius-md) var(--radius-md) 0;
font-size: 14px;
color: var(--text-secondary);
}
blockquote strong { color: var(--color-primary); }
/* ===== LISTS ===== */
ul, ol {
margin: 10px 0;
padding-left: 24px;
color: var(--text-secondary);
font-size: 14px;
line-height: 1.8;
}
/* ===== EVOLUTION TIMELINE ===== */
.timeline { position: relative; padding-left: 28px; margin: 20px 0; }
.timeline::before {
content: '';
position: absolute; left: 8px; top: 0; bottom: 0;
width: 2px;
background: linear-gradient(to bottom, var(--color-primary), #722ED1);
}
.tl-item {
position: relative;
margin-bottom: 28px;
background: var(--bg-container);
border: 1px solid var(--border-light);
border-radius: var(--radius-md);
padding: 18px 20px;
box-shadow: var(--shadow-sm);
}
.tl-item::before {
content: '';
position: absolute;
left: -24px; top: 22px;
width: 10px; height: 10px;
background: var(--color-primary);
border-radius: 50%;
border: 2px solid #fff;
box-shadow: var(--shadow-sm);
}
.tl-date {
font-size: 11px;
color: var(--text-tertiary);
font-family: 'SF Mono', Monaco, monospace;
margin-bottom: 6px;
}
.tl-item h4 { margin: 0 0 6px; font-size: 15px; color: var(--text-primary); }
/* ===== LAYER DIAGRAM ===== */
.layer-stack {
margin: 24px 0;
font-family: 'SF Mono', Monaco, monospace;
font-size: 12px;
line-height: 1.6;
background: var(--bg-container);
border: 1px solid var(--border);
border-radius: var(--radius-md);
padding: 20px 24px;
overflow-x: auto;
box-shadow: var(--shadow-sm);
}
.layer-stack .l { display: block; padding: 2px 0; }
.layer-stack .l6 { color: var(--color-primary); }
.layer-stack .l5 { color: #722ED1; }
.layer-stack .l4 { color: var(--color-success); }
.layer-stack .l3 { color: var(--color-warning); }
.layer-stack .l2 { color: #E04000; }
.layer-stack .l1 { color: var(--text-secondary); }
/* ===== RESPONSIVE ===== */
@media (max-width: 768px) {
.sidebar { display: none; }
.main { margin-left: 0; padding: 20px 16px 48px; max-width: 100%; }
.header { padding: 0 1rem; }
.header h1 { font-size: 15px; }
.kpi-bar { gap: 8px; }
.kpi { min-width: 80px; padding: 12px 8px; }
.kpi .num { font-size: 18px; }
table { font-size: 11px; }
thead th, tbody td { padding: 8px 10px; }
pre { font-size: 11px; padding: 12px 14px; }
blockquote { font-size: 13px; padding: 10px 14px; }
}
</style>
</head>
<body>
<!-- ===== HEADER ===== -->
<header class="header">
<a class="back-link" href="../index.html">← 返回知识库</a>
<h1>🔄 Loop 工程完全指南 [开发者向]</h1>
<span class="version">v1.0 · 2026-06-21</span>
</header>
<!-- ===== SIDEBAR ===== -->
<aside class="sidebar">
<div class="toc-label">目录</div>
<nav>
<ol>
<li><a href="#s1">核心定义:什么是 Loop 工程</a></li>
<li><a href="#s2">演进历程:四个阶段的范式跃迁</a></li>
<li><a href="#s3">关键技术 / 理念清单</a></li>
<li><a href="#s4">核心方法论:六层架构</a></li>
<li><a href="#s5">三大产品对比</a></li>
<li><a href="#s6">实战指南:从零搭建 Loop 系统</a></li>
<li><a href="#s7">原始资料来源</a></li>
</ol>
</nav>
</aside>
<!-- ===== MAIN CONTENT ===== -->
<main class="main">
<!-- 关键数据条 -->
<div class="kpi-bar">
<div class="kpi"><div class="num">6</div><div class="label">层架构</div></div>
<div class="kpi"><div class="num">4</div><div class="label">演进阶段</div></div>
<div class="kpi"><div class="num">16</div><div class="label">关键技术/理念</div></div>
<div class="kpi"><div class="num">7</div><div class="label">核心原则</div></div>
<div class="kpi"><div class="num">2026.06</div><div class="label">概念正式命名</div></div>
</div>
<!-- ===== 一、核心定义 ===== -->
<section id="s1">
<h2>一、核心定义:什么是 Loop 工程</h2>
<p class="lead">
<strong>Loop Engineering(循环工程)</strong>是 2026 年 6 月正式命名的 AI 编程新范式。其核心主张:<strong>不再手动为编程 Agent 写提示词,而是设计一套自主循环系统,让系统去发现任务、分派工作、验证结果、记录进度、决定下一步。</strong>
</p>
<p>这一范式由三位关键人物共同推动:</p>
<table>
<thead><tr><th>人物</th><th>身份</th><th>核心贡献</th></tr></thead>
<tbody>
<tr>
<td>Boris Cherny</td>
<td>Anthropic · Claude Code 创建者</td>
<td>2026 年 5 月 Sequoia AI Ascent 大会首次公开阐述 Loop 理念<br>自述每天管理"数千个"AI Agent 并行工作,一个月 259 个 PR 全由 Claude Code 生成<br>核心引用:<em>"我的工作是写 Loop,不再是写 Prompt"</em></td>
</tr>
<tr>
<td>Peter Steinberger</td>
<td>OpenAI · OpenClaw 创始人</td>
<td>2026 年 6 月 7 日推文引爆舆论(800 万+ 浏览)<br>原话:<em>"你不再应该为编程 Agent 写提示词了,你应该设计循环,让循环去提示你的 Agent"</em></td>
</tr>
<tr>
<td>Addy Osmani</td>
<td>Google Cloud · AI 总监</td>
<td>2026 年 6 月 7 日发表同名博客,<strong>正式将范式命名为 Loop Engineering</strong><br>提出"五种积木 + 一层记忆"六模块框架<br>同时提出三大人类职责警告</td>
</tr>
</tbody>
</table>
<blockquote>
<strong>一句话总结</strong>Prompt Engineering 是你给 Agent 写指令;Loop Engineering 是你设计一个系统,让系统自动给 Agent 写指令、检查结果、决定下一步。开发者角色从"执行者"变为<strong>"系统设计者与仲裁者"</strong>
</blockquote>
</section>
<!-- ===== 二、演进历程 ===== -->
<section id="s2">
<h2>二、演进历程:四个阶段的范式跃迁</h2>
<div class="timeline">
<div class="tl-item">
<div class="tl-date">2024 Q4 2025 Q1</div>
<h4>阶段一 · Agent 原语期 — 单次会话内的 Tool Calling Loop</h4>
<p><strong>核心突破</strong>:LLM 不只是单次问答,而能在一次会话中反复调用工具——读文件、执行命令、根据结果修正——形成 <code>Model → Tool → Result → Model</code> 的基础闭环。Claude Code 和 Codex CLI 作为"Agent Harness"(运行时外壳)出现。</p>
<p><strong>关键洞察</strong>Michael Bolin, OpenAI):无状态请求设计(不使用 <code>previous_response_id</code>)、Prompt Caching 最大化(每次新 Prompt 是前一次的精确前缀扩展)、<code>/responses/compact</code> 自动压缩防止 Context 溢出。</p>
<p><strong>局限</strong>:会话结束 = Agent 停止。人必须手动开启新会话、重新描述上下文。</p>
</div>
<div class="tl-item">
<div class="tl-date">2025 年中</div>
<h4>阶段二 · Ralph Loop — Context Reset + 状态外置</h4>
<p><strong>创造者</strong>Geoffrey Huntley,澳大利亚开源开发者。原始实现仅 <strong>5 行 Bash</strong></p>
<pre><code>while :; do
cat PROMPT.md | claude-code
done</code></pre>
<p><strong>两个核心洞察</strong></p>
<ul>
<li><strong>Context Reset 即能力</strong>:每轮迭代用全新 Context Window,避免"上下文腐烂"——越后期推理质量越差</li>
<li><strong>状态外置到磁盘</strong>Agent 的"记忆"不在 Context 里,而在文件系统、git history、测试结果中。每轮从磁盘重建理解</li>
</ul>
<p><strong>停止条件</strong>:Stop Hook 检测完成信号(如文件中出现 <code>COMPLETE</code> 标记)。</p>
<p><strong>影响</strong>Boris Cherny 公开承认这直接启发了 Claude Code <code>/loop</code>。Anthropic 后续将其纳入官方插件系统。</p>
</div>
<div class="tl-item">
<div class="tl-date">2026 Q1 Q2</div>
<h4>阶段三 · 定时调度 + 条件收敛 — Loop 产品化</h4>
<p><strong>两大产品答案</strong></p>
<ul>
<li><strong><code>/loop</code>(时间驱动)</strong>Claude Code v2.1.72+。Cron 定时唤醒,固定间隔或动态自选间隔。<br>支持项目级默认行为(<code>.claude/loop.md</code>),限制单会话 50 个任务、7 天自动过期。</li>
<li><strong><code>/goal</code>(条件驱动)</strong>Claude Code v2.1.1392026-05-14)。设置完成条件,每轮结束后<strong>独立 Evaluator 模型</strong>(Haiku)判断是否满足,不满足则自动继续。<br>核心创新——<strong>Generator-Evaluator Split</strong>:生成和验证用不同模型,禁止自评。Cherny 称此架构源于 GAN 的启发。</li>
</ul>
<p>Codex 同期发布 <code>/goal</code>(v0.128.0),一次记录为连续 25 小时、1,300 万 token、产出 3 万行代码。</p>
</div>
<div class="tl-item">
<div class="tl-date">2026 年 6 月</div>
<h4>阶段四 · Loop Engineering 系统化 — 多 Agent 编排 + 自优化</h4>
<p><strong>三件事引爆</strong></p>
<ul>
<li>6 月 2 日:Cherny @ Acquired Unplugged 重申"我的工作是写 Loop"</li>
<li>6 月 7 日:Steinberger 推文(800 万浏览)→ Addy Osmani <strong>正式命名 Loop Engineering</strong></li>
<li>6 月 16 日:LangChain 发表 "The Art of Loop Engineering",提出 <strong>四层 Loop 栈</strong>Agent → Verification → Event-driven → Hill-climbing</li>
</ul>
<p><strong>当前前沿</strong>Cherny 自述 Anthropic 内部已做到 Agent 之间通过 Slack 互相通信;LangChain 的 Hill-climbing Loop 实现了 Agent 分析自身 Trace → 自动改写 Prompt/Tool/Grader 配置的自优化闭环。</p>
</div>
</div>
<h3>演进速查表</h3>
<table>
<thead><tr><th>阶段</th><th>时间</th><th>核心突破</th><th>代表技术</th><th>局限</th></tr></thead>
<tbody>
<tr>
<td>一 · Agent 原语</td>
<td>2024 Q4</td>
<td>单次会话内 Tool Calling Loop</td>
<td>Claude Code, Codex CLI</td>
<td>会话结束 = Agent 停</td>
</tr>
<tr>
<td>二 · Ralph Loop</td>
<td>2025 中</td>
<td>Context Reset + 状态外置</td>
<td>5 行 Bash, Stop Hook</td>
<td>粗暴 <code>while true</code></td>
</tr>
<tr>
<td>三 · 调度 + 收敛</td>
<td>2026 Q1</td>
<td>定时触发 + Evaluator 判断停止</td>
<td>/loop, /goal</td>
<td>单 Agent 模式</td>
</tr>
<tr>
<td>四 · 系统化</td>
<td>2026.06</td>
<td>多 Agent 编排 + 自优化</td>
<td>LangChain Engine, Agent Slack</td>
<td>高 Token 成本</td>
</tr>
</tbody>
</table>
</section>
<!-- ===== 三、关键技术/理念清单 ===== -->
<section id="s3">
<h2>三、关键技术 / 理念清单(16 项)</h2>
<p>按出现时间排列,标注首创来源。每一项都是 Loop 工程的构成要件。</p>
<table>
<thead><tr><th style="width:4%">#</th><th style="width:24%">技术/理念</th><th style="width:42%">含义</th><th style="width:30%">来源</th></tr></thead>
<tbody>
<tr><td>1</td><td><strong>Agent Harness</strong></td><td>协调 User / Model / Tool 的运行时外壳,管理会话生命周期</td><td>Claude Code / Codex CLI2024 Q4</td></tr>
<tr><td>2</td><td><strong>Stateless Requests</strong></td><td>每次 API 请求完全独立,不使用 <code>previous_response_id</code>,支持 ZDR</td><td>Codex · Michael Bolin2026-01</td></tr>
<tr><td>3</td><td><strong>Prefix Caching</strong></td><td>每次新 Prompt 是前一次的精确前缀扩展,最大化缓存命中率</td><td>Codex / Claude Code 共同演进</td></tr>
<tr><td>4</td><td><strong>Context Compaction</strong></td><td>Token 超限时自动压缩对话历史,保留"潜在理解"</td><td>Codex <code>/responses/compact</code>2026-01</td></tr>
<tr><td>5</td><td><strong>Context Reset</strong></td><td>每轮迭代用全新 Context Window,状态留磁盘。防止"上下文腐烂"</td><td>Ralph Loop · Huntley2025 中)</td></tr>
<tr><td>6</td><td><strong>State Externalization</strong></td><td>Agent 记忆 = 文件系统 + Git History + 测试结果 + 看板。不在 Context 里</td><td>Ralph Loop2025 中)</td></tr>
<tr><td>7</td><td><strong>Time-driven Trigger</strong></td><td>Cron 定时唤醒 Agent,无需人工触发</td><td>Claude Code <code>/loop</code>v2.1.72</td></tr>
<tr><td>8</td><td><strong>Condition-driven Convergence</strong></td><td>条件满足时停止,非计时结束就停。由独立 Evaluator 判断</td><td>Claude Code <code>/goal</code>2026-05-14</td></tr>
<tr><td>9</td><td><strong>Generator-Evaluator Split</strong></td><td>生成和验证用不同模型、不同 Context Window。禁止自评。GAN 启发</td><td>Anthropic 内部 → <code>/goal</code> 产品化</td></tr>
<tr><td>10</td><td><strong>Worktree Isolation</strong></td><td><code>git worktree</code> 隔离并行 Agent 的工作目录,避免文件冲突</td><td>Claude Code <code>--worktree</code> / Codex 内置</td></tr>
<tr><td>11</td><td><strong>Skill Codification</strong></td><td>项目知识编码为 <code>SKILL.md</code> 文件,Agent 每轮自动加载,不重新推导</td><td>Claude Code / Codex</td></tr>
<tr><td>12</td><td><strong>MCP Connectors</strong></td><td>标准化协议连接外部工具:Issue Tracker、数据库、Slack</td><td>Anthropic MCP 协议</td></tr>
<tr><td>13</td><td><strong>Multi-Agent Delegation</strong></td><td>Agent 把子任务派给独立子 Agent,平行执行后汇总</td><td>Claude Code Sub-agents</td></tr>
<tr><td>14</td><td><strong>Event-driven Trigger</strong></td><td>外部事件(Webhook、Slack 消息、CI Failure)触发 Agent 运行</td><td>LangChain Fleet2026-06</td></tr>
<tr><td>15</td><td><strong>Hill-climbing Self-improvement</strong></td><td>Agent 分析自身 Trace → 自动改写 Prompt / Tool / Grader 配置</td><td>LangChain Engine2026-06</td></tr>
<tr><td>16</td><td><strong>Inter-Agent Communication</strong></td><td>Agent 之间通过 Slack 等渠道直接通信、协作、传递不确定性</td><td>Boris Cherny 实际工作流</td></tr>
</tbody>
</table>
<p>这 16 项并非独立存在——它们构成一条清晰的演进链:<strong>先有单 Agent 的 Harness#1-4),再用 Context Reset 和状态外置解决跨会话问题(#5-6),然后加上触发和收敛机制让 Agent 自主运行(#7-9),最后扩展到多 Agent 隔离、编排、通信、自优化(#10-16)。</strong></p>
</section>
<!-- ===== 四、核心方法论 ===== -->
<section id="s4">
<h2>四、核心方法论:六层架构 + 七大原则</h2>
<h3>(一)六层架构</h3>
<p>综合所有一手资料(Claude Code 官方文档、Codex Agent Loop 技术文章、Addy Osmani 六模块、LangChain 四层栈),当前 Loop 工程可归纳为以下统一架构:</p>
<div class="layer-stack">
<span class="l l6">┌─────────────────────────────────────────────────────────────────┐</span>
<span class="l l6">│ L6 · 自优化层 &nbsp; Hill-climbing:分析生产 Trace → 自动改写配置 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l6">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来源:LangChain Engine2026-06 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l6">├─────────────────────────────────────────────────────────────────┤</span>
<span class="l l5">│ L5 · 编排层 &nbsp; Multi-Agent:派发 → 子 Agent 并行执行 → 汇总 → 校验 &nbsp;&nbsp;&nbsp;</span>
<span class="l l5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来源:Claude Code Sub-agents + /batch &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l5">├─────────────────────────────────────────────────────────────────┤</span>
<span class="l l4">│ L4 · 验证层 &nbsp; Evaluator Split:独立模型(Haiku)判断完成 / 质量 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来源:Anthropic GAN 架构 → Claude Code /goal &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l4">├─────────────────────────────────────────────────────────────────┤</span>
<span class="l l3">│ L3 · 触发层 &nbsp; TriggersCron/loop)│ Condition/goal)│ EventWebhook)│</span>
<span class="l l3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来源:Claude Code /loop + /goal + LangChain Fleet &nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l3">├─────────────────────────────────────────────────────────────────┤</span>
<span class="l l2">│ L2 · 隔离层 &nbsp; Worktreegit worktree + 独立 Context Window &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来源:Ralph Loop + Claude Code --worktree &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l2">├─────────────────────────────────────────────────────────────────┤</span>
<span class="l l1">│ L1 · 基础 Agent LoopModel → Tool Call → Result → Model → ... │</span>
<span class="l l1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来源:Claude Code / Codex CLI2024 Q4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="l l1">├─────────────────────────────────────────────────────────────────┤</span>
<span class="l l1">│ 基础设施层 &nbsp; Skills │ MCP Connectors │ State Files │ Git │ KANBAN &nbsp;</span>
<span class="l l1">└─────────────────────────────────────────────────────────────────┘</span>
</div>
<h3>(二)七大核心原则</h3>
<table>
<thead><tr><th style="width:4%">#</th><th style="width:18%">原则</th><th style="width:58%">内容</th><th style="width:20%">原始出处</th></tr></thead>
<tbody>
<tr>
<td>1</td>
<td><strong>生成与验证分离</strong></td>
<td>Generator 永远不能给自己的作业打分。用独立 Evaluator(更小模型、独立 Context Window)判断完成条件和质量。这是 Loop 工程最底层的架构约束。</td>
<td>Anthropic 工程实践<br>产品化于 <code>/goal</code></td>
</tr>
<tr>
<td>2</td>
<td><strong>状态外置</strong></td>
<td>Agent 的"记忆"不在 Context Window 里。状态持久化于文件系统、Git Log、看板(KANBAN.md / Linear)、测试结果中。每轮从磁盘重建理解。Context Window 只管"当下这一轮"。</td>
<td>Ralph Loop<br>Huntley2025 中)</td>
</tr>
<tr>
<td>3</td>
<td><strong>Context 即成本</strong></td>
<td>Context 越少越新鲜越好。两种策略按任务选择:① Ralph-style 每轮全新窗口(适合重复执行模式化任务)② Prefix Caching 最大化复用(适合持续改进同一目标)。选错策略的代价是 Token 浪费或推理退化。</td>
<td>Ralph Loop + Codex<br>Michael Bolin2026-01</td>
</tr>
<tr>
<td>4</td>
<td><strong>隔离并行</strong></td>
<td>多个 Agent 同时工作 → 必须用 Git Worktree 隔离。共享工作区是 Loop 工程的头号故障源。每个 Agent 有自己的分支、自己的工作目录、自己的 Context Window。</td>
<td>Claude Code <code>--worktree</code><br>Addy Osmani 六模块</td>
</tr>
<tr>
<td>5</td>
<td><strong>触发多样化</strong></td>
<td>不再只有"人按回车"一个触发源。成熟的 Loop 系统应同时支持:<br>· 时间触发(Cron <code>/loop</code><br>· 条件触发(<code>/goal</code> 直到条件满足)<br>· 事件触发(Webhook、Slack、CI Failure</td>
<td>Claude Code +<br>LangChain Fleet</td>
</tr>
<tr>
<td>6</td>
<td><strong>人是最终仲裁者</strong></td>
<td>Loop 越自动,越需要人在关键节点介入。三大风险:验证责任在人("Done"是声明不是证明)、理解债务在积累(Agent 产出越快你的差距越大)、认知投降在蔓延(Loop 越顺畅人越不思考)。</td>
<td>Addy Osmani<br>"Loop Engineering"2026-06-07</td>
</tr>
<tr>
<td>7</td>
<td><strong>自优化闭环</strong></td>
<td>最高的 Loop 形态:Agent 分析自身生产 Trace → 发现模式 → 改写自身 Prompt / Tool / Grader 配置。从"人设计 Loop"进化到"Loop 设计 Loop"。</td>
<td>LangChain<br>Hill-climbing Loop2026-06-16</td>
</tr>
</tbody>
</table>
</section>
<!-- ===== 五、三大产品对比 ===== -->
<section id="s5">
<h2>五、三大产品对比</h2>
<table>
<thead><tr><th style="width:16%">功能</th><th style="width:28%">Claude CodeAnthropic</th><th style="width:28%">Codex CLIOpenAI</th><th style="width:28%">LangChain</th></tr></thead>
<tbody>
<tr>
<td><strong>定时循环</strong></td>
<td><code>/loop</code> Cron 调度<br>动态间隔或固定间隔<br><code>/loop</code> 运行内置维护 Prompt</td>
<td>✅ Automations 标签页<br><code>/goal</code> 长期目标模式</td>
<td>✅ Fleet Channels / Schedules<br>事件驱动触发</td>
</tr>
<tr>
<td><strong>条件收敛</strong></td>
<td><code>/goal</code>v2.1.139+<br>独立 Haiku Evaluator<br>最多 4,000 字符条件</td>
<td><code>/goal</code>v0.128.0+<br>一次记录连续 25h / 13M tokens</td>
<td>✅ Verification Loop<br>RubricMiddleware<br><code>after_agent</code> hooks</td>
</tr>
<tr>
<td><strong>工作隔离</strong></td>
<td><code>--worktree</code><br>Git Worktree</td>
<td>✅ 内置 Worktree</td>
<td>— (编排层,非执行层)</td>
</tr>
<tr>
<td><strong>技能文件</strong></td>
<td><code>.claude/agents/SKILL.md</code></td>
<td><code>.codex/agents/</code> TOML</td>
<td>— (使用 LangGraph 定义)</td>
</tr>
<tr>
<td><strong>子代理</strong></td>
<td>✅ Sub-agents<br>Agent Teams</td>
<td>✅ Sub-agentsTOML 定义)</td>
<td>✅ Multi-Agent via LangGraph</td>
</tr>
<tr>
<td><strong>连接器</strong></td>
<td>✅ MCP Servers + Plugins</td>
<td>✅ MCP Connectors</td>
<td>✅ LangChain Integrations</td>
</tr>
<tr>
<td><strong>记忆/状态</strong></td>
<td>✅ Memory 文件系统<br><code>.claude/loop.md</code></td>
<td>✅ State Files</td>
<td>✅ LangGraph Persistence<br>LangSmith Traces</td>
</tr>
<tr>
<td><strong>自优化</strong></td>
<td>— (尚未产品化)</td>
<td>— (尚未产品化)</td>
<td>✅ Hill-climbing Loop<br>LangSmith Engine</td>
</tr>
<tr>
<td><strong>Agent 间通信</strong></td>
<td>🔶 内部使用(Slack<br>未对外发布</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
</section>
<!-- ===== 六、实战指南 ===== -->
<section id="s6">
<h2>六、实战指南:从零搭建 Loop 系统</h2>
<h3>(一)搭建路线图(五步递进)</h3>
<table>
<thead><tr><th>步骤</th><th>做什么</th><th>Claude Code 命令</th><th>预计收获</th></tr></thead>
<tbody>
<tr>
<td><strong>Step 1</strong></td>
<td><strong>状态化项目</strong>:将任务管理从大脑/聊天记录迁移到 Markdown 看板<br>Agent 每轮自动读取看板,知道"已完成什么 / 下一步做什么"</td>
<td>—(创建 <code>KANBAN.md</code> + <code>CLAUDE.md</code></td>
<td>Agent 不再"失忆"</td>
</tr>
<tr>
<td><strong>Step 2</strong></td>
<td><strong>配置定时循环</strong>:将重复性维护任务交给 <code>/loop</code><br>例:每小时检查 CI / 每天整理 Issue / 每 30 分钟抓反馈</td>
<td><code>/loop 1h 检查 CI 状态,有失败就修复</code><br><code>/loop 24h 整理未关闭的 Issue 并归类</code></td>
<td>重复劳动自动化</td>
</tr>
<tr>
<td><strong>Step 3</strong></td>
<td><strong>启用目标驱动</strong>:对明确知道"完成条件"的任务用 <code>/goal</code><br>例:所有测试通过才停 / CHANGELOG 更新完毕才停</td>
<td><code>/goal all tests in test/ pass and lint is clean</code><br><code>/goal CHANGELOG.md has entry for every merged PR</code></td>
<td>无人值守跑到底</td>
</tr>
<tr>
<td><strong>Step 4</strong></td>
<td><strong>引入验证分离</strong>:不让同一个 Agent 审自己的代码<br>Generator Agent 写代码 → 提交 PR → Evaluator Agent 独立审查</td>
<td>Agent 1: <code>claude --worktree feat-xxx "实现功能"</code><br>Agent 2: <code>claude --worktree review-xxx "/goal PR 审查通过"</code></td>
<td>质量门禁自动化</td>
</tr>
<tr>
<td><strong>Step 5</strong></td>
<td><strong>建设技能库</strong>:将反复教 Agent 的知识写成 <code>SKILL.md</code><br>每新增一个 Loop,检查是否有可复用的知识需要固化</td>
<td>编写 <code>.claude/agents/skill-xxx/SKILL.md</code></td>
<td>Token 成本持续下降</td>
</tr>
</tbody>
</table>
<h3>(二)常用 Loop 模式速查</h3>
<table>
<thead><tr><th>模式</th><th>典型场景</th><th>示例命令</th><th>来源</th></tr></thead>
<tbody>
<tr>
<td>🔧 <strong>CI 修复</strong></td>
<td>PR 合并后 CI 失败,自动分析并修复</td>
<td><code>/loop 30m 检查 CI 失败项,分析原因并修复</code></td>
<td>Boris Cherny 实际使用</td>
</tr>
<tr>
<td>📋 <strong>看板推动</strong></td>
<td>按看板优先级自动推进 Backlog 任务</td>
<td><code>/loop 2h 读取 KANBAN.md,选最高优先级待办推进</code></td>
<td>Addy Osmani 示例</td>
</tr>
<tr>
<td>📊 <strong>反馈聚合</strong></td>
<td>定时抓取外部反馈,聚类汇总</td>
<td><code>/loop 30m 抓取反馈并聚类为三类问题</code></td>
<td>Boris Cherny 实际使用</td>
</tr>
<tr>
<td><strong>Deploy 验证</strong></td>
<td>部署后持续检查,直到健康检查通过</td>
<td><code>/goal deploy health check returns 200 and all pods are ready</code></td>
<td>Claude Code 官方文档</td>
</tr>
<tr>
<td>🔍 <strong>代码审查</strong></td>
<td>独立 Agent 审查所有未 review 的 PR</td>
<td><code>/loop 4h 审查所有待 review 的 PR,在代码行级添加评论</code></td>
<td>Generator-Evaluator 模式</td>
</tr>
<tr>
<td>📝 <strong>文档同步</strong></td>
<td>代码变更后自动更新相关文档</td>
<td><code>/loop 1h 检查 git diff,更新受影响的 .md 文件</code></td>
<td>LoopFlow 预设模式</td>
</tr>
</tbody>
</table>
<h3>(三)避坑指南</h3>
<table>
<thead><tr><th></th><th>症状</th><th>对策</th></tr></thead>
<tbody>
<tr>
<td><strong>无限循环</strong></td>
<td>Agent 在模糊任务上不停转圈,烧 Token</td>
<td>始终设硬上限(最大迭代次数、最大 Token、最大时长)。用 <code>/goal</code> 而非裸 <code>/loop</code></td>
</tr>
<tr>
<td><strong>Context 腐烂</strong></td>
<td>第 N 轮后推理质量显著下降</td>
<td>启用 Context Reset(每轮全新窗口 + 磁盘状态),或用 Prefix Caching 控制窗口增长</td>
</tr>
<tr>
<td><strong>文件冲突</strong></td>
<td>多个 Agent 同时修改同一文件导致 Git 冲突</td>
<td>每个 Agent 用 <code>--worktree</code> 隔离。不要共享工作目录</td>
</tr>
<tr>
<td><strong>Token 爆炸</strong></td>
<td>Loop 间隔过密,月度账单失控</td>
<td>对非紧急的周期性检查用 1h+ 间隔;能事件驱动就不要轮询(Monitor 优于高频 Loop</td>
</tr>
<tr>
<td><strong>认知投降</strong></td>
<td>Loop 跑顺后不再审查输出,直接合并</td>
<td>强制人工 Review 步骤:Evaluator 通过 → 打 Tag → 人工确认 → 才合并</td>
</tr>
</tbody>
</table>
</section>
<!-- ===== 七、原始资料来源 ===== -->
<section id="s7">
<h2>七、原始资料来源</h2>
<p>本文所有技术事实均源自以下一手资料,未使用自媒体转述。</p>
<table>
<thead><tr><th>#</th><th>标题</th><th>作者/来源</th><th>日期</th><th>URL</th></tr></thead>
<tbody>
<tr>
<td>1</td>
<td>Boris Cherny: Why Coding Is SolvedSequoia AI Ascent 2026 访谈)</td>
<td>Boris Cherny × Lauren ReederSequoia</td>
<td>2026-05-04</td>
<td><a href="https://podscan.fm/podcasts/training-data/episodes/anthropics-boris-cherny-codings-printing-press-moment" target="_blank">Training Data 播客</a></td>
</tr>
<tr>
<td>2</td>
<td>Loop Engineering(正式命名文章)</td>
<td>Addy OsmaniGoogle Cloud</td>
<td>2026-06-07</td>
<td><a href="https://addyosmani.com/blog/loop-engineering/" target="_blank">addyosmani.com</a></td>
</tr>
<tr>
<td>3</td>
<td>原推文:"shouldn't be prompting coding agents anymore"</td>
<td>Peter Steinberger @steipeteOpenAI</td>
<td>2026-06-07</td>
<td><a href="https://x.com/steipete" target="_blank">X @steipete</a></td>
</tr>
<tr>
<td>4</td>
<td>Claude Code 官方文档:Keep Claude working toward a goal/goal</td>
<td>Anthropic</td>
<td>2026-05-14</td>
<td><a href="https://code.claude.com/docs/en/goal" target="_blank">code.claude.com/docs</a></td>
</tr>
<tr>
<td>5</td>
<td>Claude Code 官方文档:Run prompts on a schedule/loop</td>
<td>Anthropic</td>
<td>v2.1.72+</td>
<td><a href="https://code.claude.com/docs/en/scheduled-tasks" target="_blank">code.claude.com/docs</a></td>
</tr>
<tr>
<td>6</td>
<td>Unrolling the Codex Agent Loop</td>
<td>Michael BolinOpenAI Technical Staff</td>
<td>2026-01-23</td>
<td><a href="https://openai.com/index/unrolling-the-codex-agent-loop/" target="_blank">openai.com</a></td>
</tr>
<tr>
<td>7</td>
<td>Build Iterative Repair Loops with CodexCookbook</td>
<td>OpenAI</td>
<td>2026-05-11</td>
<td><a href="https://developers.openai.com/cookbook/examples/codex/build_iterative_repair_loops_with_codex" target="_blank">developers.openai.com</a></td>
</tr>
<tr>
<td>8</td>
<td>The Art of Loop Engineering(四层 Loop 栈)</td>
<td>Sydney RunkleLangChain</td>
<td>2026-06-16</td>
<td><a href="https://www.langchain.com/blog/the-art-of-loop-engineering" target="_blank">langchain.com</a></td>
</tr>
<tr>
<td>9</td>
<td>Ralph Wiggum Loop 官方插件</td>
<td>Anthropic / Geoffrey Huntley</td>
<td>2025</td>
<td><a href="https://github.com/anthropics/claude-code/blob/main/plugins/ralph-wiggum/" target="_blank">GitHub anthropics/claude-code</a></td>
</tr>
</tbody>
</table>
</section>
</main>
<!-- Active sidebar link tracking -->
<script>
(function() {
const navLinks = document.querySelectorAll('.sidebar nav a');
const sections = [];
navLinks.forEach(function(a) {
const id = a.getAttribute('href').replace('#','');
const el = document.getElementById(id);
if (el) sections.push({ el: el, link: a });
});
function update() {
let current = sections[0];
for (let i = 0; i < sections.length; i++) {
if (sections[i].el.getBoundingClientRect().top <= 200) {
current = sections[i];
}
}
navLinks.forEach(function(a) { a.classList.remove('active'); });
if (current) current.link.classList.add('active');
}
window.addEventListener('scroll', update, { passive: true });
update();
})();
</script>
</body>
</html>