2026 年 AI Agent 工程实战指南:Harness 与 Loop 的两层架构详解

过去这几年,AI 领域的风向标转变得很快。回望 2023 年,大家还在钻研怎么写好 Prompt(提示词);到了 2024 年,重点变成了如何编排 Agent(智能体);2025 年,我们开始给 Agent 加上运行时保护层。而站在 2026 年的视角看,当下的核心议题已经变成了:如何让这个运行时自己跑起来
这不仅仅是技术的迭代,更是工程思维的跃迁。如果你现在还在比拼模型分数,或者仅仅满足于 Demo 演示成功一次,那么你可能已经落后了。现在的工程师们关注的是两个更具体、更硬核的问题:

  1. 运行时怎么不崩? 也就是所谓的 Agent Harness。模型再聪明,如果没有这层“安全气囊”,在长任务中依然会面临上下文溢出、工具调用连环出错、子代理失控等灾难。
  2. 怎么让运行时自己跑起来? 也就是 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 月):

框架名称 核心定位 最佳适用场景 特点简述
LangGraph 图运行时基底 需要自定义复杂拓扑、企业级合规审计 灵活性极高,配合 LangSmith 提供全链路追踪,适合构建复杂工作流。
DeepAgents 开箱即用的完整 Harness 快速落地、不想从头搭建基础设施 基于 LangGraph 构建,内置了电池,适合想要“拿来主义”的团队。
DeerFlow 2.0 Super Agent Harness 长时程任务、本地沙盒执行、IM 运营通道 强调动态子代理生成与隔离沙盒,适合需要长时间自主运行的任务。
CrewAI 团队角色扮演 模拟团队协作、简单多代理演示 提供直观的角色定义,上手快,但在超长流程控制上较弱。
图像

深度对比:拒绝理论,直击痛点

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 必须把记忆按用途和生命周期切开,读写都走显式路由。
我们可以将记忆分为四层:

  1. 工作记忆: 当前任务的上下文,优先级最高,生命周期最短。
  2. 情景记忆: 本项目的历史摘要,维持连续性。
  3. 语义记忆: 长期稳定的事实知识,如项目规范、API 文档。
  4. 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.mdAGENTS.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.mdTODO.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. 典型设计流程

  1. 设置触发: 配置 /goal 或 automation,设定每晚或 CI 失败时触发。
  2. 下发指令: “扫描最近失败的测试,优先修复高影响 bug;更新 PROGRESS.md,创建 PR,只在验证通过后提交。”
  3. 结合 Skills: 自动调用“测试修复技能”和“PR 描述生成技能”。
  4. 明确退出: “所有测试通过 + 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%。