2026 年 AI Agent 工程实战指南:Harness 与 Loop 的两层架构详解
过去这几年,AI 领域的风向标转变得很快。回望 2023 年,大家还在钻研怎么写好 Prompt(提示词);到了 2024 年,重点变成了如何编排 Agent(智能体);2025 年,我们开始给 Agent 加上运行时保护层。而站在 2026 年的视角看,当下的核心议题已经变成了:如何让这个运行时自己跑起来。
这不仅仅是技术的迭代,更是工程思维的跃迁。如果你现在还在比拼模型分数,或者仅仅满足于 Demo 演示成功一次,那么你可能已经落后了。现在的工程师们关注的是两个更具体、更硬核的问题:
-
运行时怎么不崩? 也就是所谓的 Agent Harness。模型再聪明,如果没有这层“安全气囊”,在长任务中依然会面临上下文溢出、工具调用连环出错、子代理失控等灾难。 -
怎么让运行时自己跑起来? 也就是 Loop Engineering(循环工程)。我们要从“人坐在键盘前一次次打字提示”转变为“设计一个能自主发现工作、分发任务、验证结果并决定下一步的循环系统”。
这就好比盖房子:Harness 是地基和承重墙,决定了房子稳不稳;Loop 是自动化系统,决定了房子能不能自动调节温度、开关灯光。本文将深入剖析这两层架构,为你提供一份可落地的工程笔记。
一、核心概念辨析:Framework、Harness 与 Loop
在深入技术细节之前,我们需要先理清三个经常被混淆的概念:Framework(框架)、Harness(运行时/马具)和 Loop(循环)。很多人误以为装了 LangChain 就等于有了 Harness,这其实是很大的误区。
我们可以把这三层关系定义清楚:
1. Framework(框架):提供“积木”
框架负责提供标准化的零件,比如 Tool 接口、Prompt 模板、Graph/Crew 编排原语、基础路由等。它解决的是“零件怎么拼”的问题。例如,LangChain 提供了链式调用的能力,这就是典型的积木。
2. Harness(运行时):解决“不崩”
Harness 把框架提供的积木组装成一个能长期运行、能自我纠偏、在严格安全边界内执行的完整生命周期系统。它解决的是“拼好之后怎么不崩”的问题。它负责状态持久化、沙盒隔离、分层记忆、人机交互中断恢复等。没有它,Agent 就像个没有安全绳的走钢丝者。
3. Loop(自主循环):解决“自运转”
Loop 是跑在 Harness 之上的调度逻辑。它替代了人工的“一次次手动提示”,由系统自主发现工作、分发任务、验证结果、记录状态、决定下一步。它解决的是“系统怎么自己运转起来”的问题。
一句话总结: Framework 是零件,Harness 是底盘和发动机,Loop 是自动驾驶系统。
二、为什么 80% 的生产崩溃与模型智商无关?
把一个 Agent 从“Demo 跑通一次”推到“在 SaaS 生产环境里稳定服务”,中间隔着一道巨大的工程鸿沟。在真实环境中,绝大多数的失败并不是因为模型不够聪明(比如逻辑推理能力不足),而是死在四类典型的运行时事故上。
我们可以把这四类事故看作是 Agent 的“四大死因”:
1. 上下文溢出
长对话进行到后期,Prompt 长度超过了模型窗口限制,或者关键信息被新的对话覆盖,导致 Agent “失忆”,开始胡言乱语或重复之前的工作。
2. 工具调用雪崩
Agent 在调用某个工具失败后(比如 API 超时),没有重试机制或错误处理逻辑,导致后续所有依赖该结果的步骤全部报错,甚至陷入死循环不断重试同一个错误的调用。
3. 子代理失控
在多代理协同场景中,父代理分配任务给子代理,但子代理偏离了目标,或者陷入了无限循环,父代理却无法感知或无法中止,导致资源耗尽。
4. 状态丢失
任务执行到一半,系统重启或网络波动,由于没有保存中间状态,Agent 只能从头开始,不仅浪费 Token,还可能对已完成的操作造成重复影响。
这四类问题,光靠换个更聪明的模型(比如从 GPT-4 换到 GPT-5)是解决不了的。它们需要的是工程手段——这就是 Harness 存在的意义。这就好比一辆赛车,引擎再强劲(模型智商高),如果刹车系统失灵(缺乏 Harness),在赛道上也跑不完全程。
正因如此,2026 年的头部项目已经将关注点写进了定位中:LangChain 的 DeepAgents 自称是“the batteries-included agent harness”(自带电池的智能体马具),字节的 DeerFlow 2.0 则宣称是“Super Agent Harness”。
三、Harness 的解剖:一张图看懂运行时内核
抛开框架的差异,一个生产级 Harness 的内核结构其实大同小异。我们可以通过一张解剖图来理解:
在这张图中,模型只是中间那个被反复调用的“函数”。真正决定 Agent 能否在生产环境存活下来的,是外面那一圈工程组件:
-
规划: 决定下一步做什么,拆解任务。 -
上下文工程: 管理输入给模型的上下文,决定保留什么、丢弃什么。 -
工具层: 连接外部 API、数据库、代码执行环境。 -
沙盒: 提供安全的执行环境,防止 Agent 误删文件或执行危险命令。 -
验证闭环: 检查 Agent 的输出是否符合预期,是否安全。 -
记忆与检查点: 保存状态,随时准备恢复。
核心洞察: 换框架(如从 LangChain 换到 LlamaIndex)只是换了这一圈的实现风格;换模型(如从 Claude 换到 GPT)只是换了中间那个函数。真正能沉淀下来、长期复用的工程资产,全部都在外圈。这层外圈,才是你的核心竞争力。
四、2026 年头部 Harness 框架格局与选型建议
结合 GitHub 活跃度与生产案例,目前的生态已经高度分化。我们来看看主流项目的定位与最佳适用场景(数据基准截至 2026 年 6 月):
深度对比:拒绝理论,直击痛点
1. 长时程任务可靠性
这是检验 Harness 成色的试金石。DeerFlow 和 LangGraph/DeepAgents 在这方面表现优异。
-
DeerFlow 依靠动态子代理 + 隔离沙盒文件系统 + 上下文卸载+ 持久记忆。 -
LangGraph 依靠检查点+ 状态持久化 + 隔离上下文。
它们的共同内核是:把上下文卸载到外部存储,用检查点机制对抗长对话中的幻觉与逻辑崩塌。 相比之下,CrewAI 等框架在超长 Workflow 中更容易出现委派链失控。
2. 多代理协同
-
CrewAI:最直观,像组建一个团队,定义角色。 -
LangGraph:允许手写任意复杂的层级拓扑,适合逻辑严密的控制狂。 -
DeerFlow:采用 Supervisor(监督者)+ 动态 Spawn(生成)+ 结果聚合模式。
实战经验: 在代码生成等复杂场景,给 Agent 喂“通过专门 Indexing 工具精准提取的代码片段”,远比让它自主漫游整个仓库有效。上下文的精准投喂本身就是一种编排能力。
3. 可观测性与合规
-
LangGraph + LangSmith:提供全链路 Trace(追踪)与可视化调试,是合规审计场景的首选。 -
DeerFlow:主打本地沙盒执行 + 严格权限 Hook。如果数据隐私是红线,DeerFlow 的本地优先设计更合适。
五、验证闭环:被低估的命脉
如果只能从本文带走一条实践经验,那就是:不要相信 Agent 第一次输出的“任务完成”。
很多“看起来跑通了”的案例,其实留下了一地隐患,根本原因就是缺少一个独立的校验回路。生产级 Harness 必须引入 Critic 子代理、沙盒内试运行或严格的结构化校验节点。
我们要把“自认为完成”替换成“被证据证明完成”。
这条回路的核心逻辑是:Agent(Maker)完成任务后,必须有一个独立的 Verifier(Checker)在沙盒环境中运行测试、检查文件变更或验证 API 响应。只有 Verifier 通过,任务才算真正结束。
这也是 DeepAgents 安全模型的精神内核:不要指望模型自我约束,边界必须在工具层或沙盒层强制执行。 如果你信任 LLM 的自我约束,那你离生产事故就不远了。
六、Harness 工程的两个深水区
要把 Harness 做好,有两个深水区必须趟过去:分层记忆和工具延迟绑定。
1. 分层记忆:把 Context Window 当倾倒场是头号成因
很多工程师习惯把所有对话历史、文件内容都塞进 Prompt,结果就是上下文溢出,模型“看花眼”。生产级的 Harness 必须把记忆按用途和生命周期切开,读写都走显式路由。
我们可以将记忆分为四层:
-
工作记忆: 当前任务的上下文,优先级最高,生命周期最短。 -
情景记忆: 本项目的历史摘要,维持连续性。 -
语义记忆: 长期稳定的事实知识,如项目规范、API 文档。 -
RAG 检索: 外部知识库,附带证据用于溯源。
这不仅仅是分层,关键在于路由规则。不是所有东西都进 Prompt,由 Context Engine(上下文引擎)决定每一轮从哪一层取什么。
下面是一个框架无关的最小路由示意代码,展示了如何组装上下文:
class TieredMemory:
def assemble_context(self, turn, token_budget):
parts = []
# 1. 常驻:当前任务的工作记忆(最高优先级)
parts += self.working.recent(turn.task_id)
# 2. 定向召回:与本轮相关的语义事实
parts += self.semantic.search(turn.query, k=5)
# 3. 连续性:本项目情景历史的摘要(不是原始日志)
parts += [self.episodic.summary(turn.project_id)]
# 4. 知识:RAG 检索,附证据用于溯源
parts += self.rag.retrieve(turn.query, k=8, attach_source=True)
# 5. 硬预算:在送进模型之前完成 compaction(压缩)
return compact(parts, max_tokens=token_budget)
def commit(self, turn, model_output):
self.working.update(turn.task_id, model_output.progress)
if model_output.durable_facts:
# 只有稳定事实才晋升到长期记忆
self.semantic.upsert(model_output.durable_facts)
# 写入检查点,用于崩溃恢复
self.checkpoint.write(turn.session_id)
关键 Tips: 在执行 compact() 压缩时,切忌使用破坏性的纯文本摘要,否则会抹除数据源的引用元数据。生产级做法是采用“保留骨架”的结构化压缩,确保模型生成的每一句话都能精准溯源回原始文件。
2. MCP 延迟绑定:解决 Prompt 爆炸
上下文溢出的第二大成因是工具/技能清单本身。如果你的 System Prompt 里塞了几十个工具的完整 Schema,还没开始干活,Token 就已经爆了。
解决方案是 MCP(Model Context Protocol)延迟绑定 和 on-demand skills:
-
延迟绑定: Harness 不再前置注入每个工具的完整 Schema,只注入一份轻量目录(名字 + 一行描述)。具体工具的完整 Schema,只在 Agent 决定调用它的那一刻才拉取并绑定。 -
On-demand Skills: 技能体平时只是磁盘上的索引,Agent 需要时才加载正文,用完即丢。
然而,延迟绑定带来了一笔隐形的 “规划税”。由于 Agent 初始只能看到简略目录,如果编排层没有强大的语义路由能力,Agent 可能会因为不知道工具细节而选错工具,或者陷入“不敢选工具”的死循环。因此,在编排层注入更强的语义路由提示词或轻量分类模型,是必不可少的补偿措施。
| 维度 | 传统 Monolithic Prompt | MCP 延迟绑定 + On-demand |
| :— | :— | :— |
| Token 成本 | 极高(随可用工具数线性增长) | 极低(随实际使用工具数伸缩) |
| 规划难度 | 低(模型已知所有细节) | 高(需更强的路由决策) |
| 适用场景 | 工具少、简单任务 | 工具多、复杂生态 |
七、Loop Engineering:让 Harness 自己跑起来
Harness 解决了“怎么不崩”,但谁来按下开始键?谁来决定下一步?在 2026 年,共识已经形成:不要再手动提示 Agent,去设计循环来提示它。
这就是 Loop Engineering。Anthropic Claude Code 负责人 Boris Cherny 曾表示,他已经不再直接提示 Claude,而是写循环,由循环去提示 Claude 并决定下一步。
Loop 的核心定义是:用系统取代你自己去提示 Agent。 你设计一个能自主发现工作、分发任务、验证结果、记录状态并决定下一步的循环。它可以理解为一个递归目标,你定义目的,AI 不断迭代直到完成。
数据佐证
Anthropic 内部数据显示,使用了良好循环的工程师,代码合并量提升了 8 倍以上。但前提是——循环里必须有真正的验证闭环。否则,跑得越多,产出的“垃圾代码”就越多。
八、Loop 的六大组件与退出条件
一个健壮的 Loop 可以拆分为六大支柱组件,外加一个至关重要的退出条件。
1. Automations(自动化触发器)
这是循环的心跳。它不仅仅是 cron 定时任务,更是能自主发现工作并分诊的调度器。
-
工具支持: Claude Code 支持 /loop(按节奏重跑)和/goal(跑到条件满足);Codex 有 Automations + Triage Inbox。 -
自定义实现: GitHub Actions、cron + 脚本,触发条件如“发现未解决 issue”、“CI 失败”。
2. Worktrees(工作树隔离)
这是并行 Agent 不互相踩脚的关键。每个 Agent 应该在独立的 git worktree + 分支上工作。
-
命令示例: git worktree add ../agent-wt feature/xxx -
作用: 这是规模化的前提,否则并行运行会导致文件冲突。
3. Skills(技能/持久知识)
不让 Agent 每次都从零猜项目惯例。把规则、架构决策、构建命令写进 SKILL.md 或 AGENTS.md。
-
这与 Harness 层的 on-demand skills 是呼应的,是 Loop 层的知识沉淀。
4. Plugins & Connectors(基于 MCP 的连接器)
让 Agent 触及真实世界:读 Jira、查数据库、发 Slack、开 PR。MCP 让连接器可互操作,并配合 Harness 的延迟绑定控制成本。
5. Sub-agents(子代理分工)
这是 Maker-Checker 分离的关键防线。写代码的 Agent 对自己往往太宽容,必须有独立验证者。
-
典型分工: -
Explorer: 快速、只读、负责规划。 -
Implementer: 负责执行写代码。 -
Reviewer: 强模型、高推理算力,负责安全与测试审查。
-
6. External Memory / State(外部记忆与状态)
LLM 会遗忘,但 Repo(代码仓库)不会。用 PROGRESS.md、TODO.md 或 Linear 看板记录“已尝试什么、测试结果、下一步”。
-
注意: 如果 Agent 运行在视觉画布,这里的记忆需要从“人可读 Markdown”晋升为“机可读结构化 Schema”,并强校验输出的 JSON 契合前端类型。
退出条件:最容易被忽略的致命项
不要让循环“一直跑到有人干预”。必须设置硬条件:
-
测试通过。 -
特定文件变更。 -
预算耗尽。 -
显式标记需人工介入。
九、Ralph Loops:极简主义的胜利
现代 Loop Engineering 的很多高级特性,其实源自 Ralph Huntley 提出的极简实践——Ralph Loops。其核心思想简单到令人发指:
-
一次只做一个任务。 -
每轮全新上下文: 极大缓解上下文腐烂。 -
Backpressure(背压): 改动后只对受影响单元跑测试,不做全量构建。 -
单体优先: 先在一个 repo 里跑通,再考虑复杂通信。
核心代码甚至可以简单到一个 bash 循环:
while :; do
cat PROMPT.md | claude-code --worktree agent-wt || true
# 验证、提交或更新计划
sleep 30
done
Ralph 的结论非常反直觉但极其深刻:循环本身比模型更重要。 好模型配差循环,得到的是昂贵的垃圾;普通模型配上优秀循环和强验证,才能稳定出货。
十、动手搭建:从 MVP 到进阶模式
1. MVP 结构
在项目根目录创建以下文件结构,这是最小可行起点:
-
CLAUDE.md/AGENTS.md:核心规则 + 技能。 -
PROGRESS.md:状态记录。 -
skills/:具体技能文件。 -
.claude/agents/:子代理定义。
2. 典型设计流程
-
设置触发: 配置 /goal或 automation,设定每晚或 CI 失败时触发。 -
下发指令: “扫描最近失败的测试,优先修复高影响 bug;更新 PROGRESS.md,创建 PR,只在验证通过后提交。” -
结合 Skills: 自动调用“测试修复技能”和“PR 描述生成技能”。 -
明确退出: “所有测试通过 + Lint 干净,或预算耗尽。”
3. 脚本化实现
如果你不用 Claude Code,通用脚本也能实现:
#!/bin/bash
# daily-triage-loop.sh
while true; do
echo "=== $(date) starting triage loop ===" >> loop.log
# 1. 发现工作(gh CLI / Linear API / grep 等)
# 2. 为每个任务生成带上下文的 prompt
# 3. 调用你的 Agent(claude-code / local-llm / 编排器)
# 4. 验证(跑测试、lint、安全扫描)
# 5. 更新 memory / state 文件
# 6. 决定是否继续或休眠
sleep 3600
done
4. 进阶模式
-
Plan-Execute-Verify Loop: 规划子代理输出计划 -> 执行子代理实现 -> 验证子代理审查。 -
Self-Improving Loop: 运行后让 Agent 分析自身失败模式,提案更新 SKILL.md。
十一、避坑清单:实战中的血泪教训
在实施过程中,以下清单必须时刻对照:
必须做的:
-
明确终止条件: 绝不运行到人工干预为止。 -
Maker-Checker 分离: 必须有独立的验证环节。 -
严格上下文管理: 每轮总结,注入记忆,丢弃噪音。用外部文件代替无限聊天历史。 -
成本监控: 设置 Token 预算。无 Guardrail 的循环是烧钱机器。 -
从小入手: 先做“修复特定 bug”,再做“构建完整 feature”。 -
人类在环: 生产变更、架构决策保留人工 Checkpoint。
常见失败模式: -
目标模糊: 导致 Agent 反复猜测,Token 爆炸。 -
缺少退出条件: 导致死循环。 -
验证太弱: 导致低质量代码进主分支。 -
忽略隔离: 导致并行冲突。 -
过度 Loop 化: 把需要人类创造力的事也吞掉了。一个好的实践是:循环负责把任务推到 90%,最后 10% 留给人工精炼。
十二、总结:构建你的工程护城河
回顾过去三年,AI 工程的演化脉络清晰可见:
-
2023 年: 学怎么写 Prompt。 -
2024 年: 学怎么编排 Agent。 -
2025 年: 学怎么加运行时。 -
2026 年: 学怎么让运行时自己跑起来。
每一次跃迁,都是把“人需要亲自做的事”往外推一层。
在这个过程中,模型固然重要,但它是最不属于你的部分(它在云端,由大厂训练)。真正属于你的,是你给模型套上的那个 Harness——它决定了系统在长任务、并发面前会不会崩;以及架在 Harness 之上的那个 Loop——它决定了你是否需要 24 小时盯着屏幕。
这两层加起来,才是一支团队真正可以累积、可以交接、可以变成护城河的工程资产。模型每周都在变强,但能让强模型变成可靠产出的,从来都不是模型本身,而是你构建的这一套工程骨架。
常见问题解答(FAQ)
Q1:Framework 和 Harness 到底有什么本质区别?
A: Framework 提供的是积木和胶水,解决的是“怎么拼”的问题,比如 LangChain 提供了链式调用的工具。而 Harness 提供的是保护壳和运行环境,解决的是“拼好后怎么稳定跑”的问题。简单来说,Framework 是造车工具,Harness 是车身底盘和安全系统。光有工具,车跑不远;有了 Harness,车才能上路。
Q2:为什么不能直接把所有对话历史都塞给模型?
A: 这会导致两个问题:一是上下文溢出,超过模型窗口限制;二是噪音干扰,大量无关历史会降低模型推理质量。生产级做法是使用分层记忆,只提取当前任务相关的“工作记忆”和必要的“长期记忆”,并在送入模型前进行压缩。
Q3:什么是 MCP 延迟绑定,为什么它能省钱?
A: 传统做法是把所有工具的定义都写在 System Prompt 里,这非常占 Token。MCP 延迟绑定是只给模型看工具目录,等模型真正决定要用哪个工具时,再临时加载该工具的详细定义。这样 Token 成本只随“实际用量”增长,而不是随“工具总量”增长。
Q4:我的 Agent 总是陷入死循环,怎么办?
A: 通常是因为缺少“退出条件”或“验证闭环”。你必须在 Loop 中设定硬性的停止指标(如预算耗尽、测试通过、重试次数上限)。同时,引入独立的 Critic 子代理进行验证,防止 Agent 在错误的道路上越跑越偏。
Q5:Loop Engineering 适合所有任务吗?
A: 不适合。Loop 适合边界清晰、可验证、重复性高的任务(如代码重构、Bug 修复、数据分析)。对于需要高度创造性、模糊决策或复杂人际沟通的任务,完全交给 Loop 可能会产生平庸甚至错误的结果。最佳实践是:Loop 推进到 90%,人工做最后的 10%。

