跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言Agent RuntimeMCPAgent LoopHarnessLangGraph

《Agent Runtime 工程化》Agent Loop、Harness、Runtime 到底是什么关系?

Agent Loop、Harness、Runtime 到底是什么关系? 这几年 Agent 讨论里,有几个词特别容易搅在一起:Agent Loop、Harness、Runtime。 很多文章会这么写: 或者反过来: 再或者: 我不太赞同。

Neo发布于 —68 浏览
《Agent Runtime 工程化》Agent Loop、Harness、Runtime 到底是什么关系?

Agent Loop、Harness、Runtime 到底是什么关系?

这几年 Agent 讨论里,有几个词特别容易搅在一起:Agent Loop、Harness、Runtime。

很多文章会这么写:

Agent Runtime = 一个 while loop + tools

或者反过来:

Harness 就是 Runtime。

再或者:

有了 MCP,再接一个 agent framework,就差不多是生产级 Agent 了。

我不太赞同。

不是因为这些说法完全错,而是它们都只说中了某一层。工程上最怕这种'局部正确'。局部正确的词一旦进了架构图,后面权限、trace、checkpoint、eval、上下文预算都不知道该挂在哪里。项目越做越大,大家开始用同一个词吵不同的事。

先给我的划分:

Agent Loop 负责让模型一轮轮地想和做。

Harness 负责给这个循环加约束、工具、上下文和评测。

Runtime 负责把一次 Agent 执行变成可恢复、可观测、可治理的系统过程。

这三个词不是同义词。它们像三层不同厚度的系统边界。

为什么现在必须把词讲清楚

以前做 LLM 应用,很多系统就是一次请求、一次回答。最多加 RAG、加函数调用、加缓存。边界相对简单。

Agent 不一样。

它会反复调用模型。会拿工具结果继续决策。会读文件、写文件、执行命令、访问外部系统。长一点的任务可能跑十几步、几十步,中途经历超时、权限确认、上下文压缩、模型降级、工具失败和用户打断。

这时候,如果你把所有东西都叫 'agent',设计会很快失焦。

Anthropic 在 "Building effective agents" 里把 workflow 和 agent 区分得比较清楚:workflow 是预先编排 LLM 和工具的系统;agent 是模型自己动态决定流程和工具使用的系统。这个划分有帮助,但它还没解决工程实现里的另一层问题:当 agent 真要运行起来,谁来管理状态、权限、预算、恢复和观测?

LangChain 生态现在也开始把层次拆得更细。LangGraph 文档里,Deep Agents 被放在 harness 层,LangChain 是 framework,LangGraph 是 runtime,LangSmith 是 platform。这套分层很有意思,至少说明社区已经意识到:光说 agent framework 不够了。

OpenAI Agents SDK 也有类似信号。文档里会区分 'agent loop 由 SDK 管理' 和 'Responses API 让你自己管理每一轮'。这其实就是在提醒开发者:tool call roundtrip 不是一行 API 调用结束的事,循环控制本身是系统责任。

所以今天讲 Loop、Harness、Runtime,不是术语洁癖。是为了让架构能落地。

Agent Loop:最小控制结构

Agent Loop 是最小骨架。

它解决一个问题:模型不是一次性给最终答案,而是可以在多轮中决定下一步。

一个简化版 loop 长这样:

for (let step = 0; step < maxSteps; step++) {
  const response = await model.generate({ messages, tools });

  if (response.type === "final") {
    return response.text;
  }

  const results = await runTools(response.toolCalls);
  messages.push(response, ...results);
}

这段代码已经能演示很多东西。模型可以先读文件,再搜索,再执行测试,最后回答。ReAct 的味道也在这里:reasoning 和 acting 交替出现,工具 observation 会影响下一步。

但它太裸。

裸 loop 通常缺这些东西:

  • 工具参数校验。
  • 权限判断。
  • 工具失败分类。
  • 输出截断策略。
  • 重复调用检测。
  • token budget。
  • trace。
  • checkpoint。

所以我更愿意把 Agent Loop 定义成:

Agent Loop 是模型、工具和观察结果之间的回合控制结构。

它不天然等于生产系统。它只是生产系统里最中间的那根轴。

Harness:让模型更能干,也更受控

Harness 这个词有点别扭,中文不好翻。直接叫'套件''缰绳''增强层'都差点意思。

我会这样理解:

Harness 是围绕 Agent Loop 的能力和约束层。

它给 loop 提供:

  • 工具集合。
  • system prompt 和任务约束。
  • 上下文装载策略。
  • memory。
  • planner。
  • verifier。
  • eval case。
  • guardrail。

如果 Loop 是发动机转起来,Harness 就是让发动机能接上车架、仪表、刹车和测试台。

举个 coding agent 的例子。一个裸 loop 只知道模型想调用 read_file。Harness 会决定:

  • 当前任务应该暴露哪些工具。
  • 文件系统范围是不是限制在 workspace 内。
  • read_file 的输出最多给模型多少字符。
  • 是否先用 repo map 帮模型找入口。
  • 模型最终回答前是否必须引用观察结果。
  • 这类任务在 eval 里怎么判定成功。

Harness 往往是体验差异最大的地方。两个系统都用了同一个模型、同样有 tool calling,但一个会像实习生一样乱翻文件,另一个能像熟悉项目的工程师那样先找入口、再读局部、最后改最小 diff。差别通常不只在模型,而在 harness。

不过 Harness 仍然不是完整 Runtime。

Harness 可以让 Agent 更聪明、更稳一点,但它未必负责持久化状态、崩溃恢复、跨 run 审计、成本账单、权限记录、trace 归档和 CI 回归门禁。这些是 Runtime 的地盘。

Runtime:系统责任的边界

Runtime 这个词最容易被说薄。

很多人说 runtime,其实只是在说 loop runner。我的定义更重:

Agent Runtime 是承载用户意图、模型、工具、状态、权限、预算、观测和恢复的运行系统。

它至少要回答这些问题:

  • 这次用户请求对应哪个 run?
  • 当前 run 到了第几个 step?
  • 模型本轮看到了哪些上下文?
  • 工具调用经过了哪些校验?
  • 用户是否批准了高风险动作?
  • 工具失败后是重试、降级、停止,还是让模型重新规划?
  • 输出是否被截断,artifact 存在哪里?
  • 任务中断后从哪个 checkpoint 恢复?
  • 这次失败是模型错、工具错、上下文错,还是策略错?
  • 这个改动是否通过 eval harness 回归?

这些问题很无聊。也正因为无聊,demo 里经常没有。

生产系统偏偏就死在这些无聊问题上。

三层放在一张图里

我会把它们画成这样:

Agent Runtime
│
├─ Run / Session / State
├─ Budget / Policy / Permission
├─ Trace / Checkpoint / Eval
│
└─ Harness
   │
   ├─ Context Builder
   ├─ Memory
   ├─ Tool Selection
   ├─ Guardrails
   ├─ Verifier
   │
   └─ Agent Loop
      │
      ├─ Model Call
      ├─ Tool Call
      ├─ Observation
      └─ Stop Reason

也可以换成一句更工程化的话:

Loop 是控制流。
Harness 是能力边界。
Runtime 是执行系统。

这个分法有个好处:出了问题更容易归因。

看到问题时,应该查哪一层

比如 Agent 一直调用同一个工具。

你可以先查 Loop:有没有 max steps?有没有 repeated tool call stop reason?有没有 same error detection?

再查 Harness:工具描述是不是诱导模型反复调用?observation 有没有告诉模型'这个路径不存在'?工具选择是不是每一轮都暴露太多无关工具?

最后查 Runtime:trace 里能不能看到每次调用的 input hash?是否记录了停止原因?eval 里有没有覆盖'重复调用同一工具'的回归用例?

再比如 Agent 读错文件。

Loop 层只能看到它调用了 read_file。Harness 层要看 repo map、文件摘要、context builder 和 tool selection。Runtime 层要看这次 run 的 context debug report:模型到底有没有看见正确文件?有没有被旧摘要误导?有没有因为 token budget 丢掉用户约束?

再比如 MCP 工具越权。

这就不是 Loop 能解决的。MCP Server 负责暴露工具,MCP Client 负责通信,但工具什么时候进入模型上下文、调用前是否审批、调用结果如何脱敏、风险等级如何覆盖远端描述,这些都要回到 Runtime 和 Harness 的边界里。

MCP 不是 Runtime,框架也不是全部

MCP 很重要。我也认为它会长期存在。

但 MCP 解决的是外部能力如何标准化接入,不是这些能力如何安全运行。一个 MCP Server 可以暴露读文件、查数据库、发请求、执行命令。它的工具列表可以动态变化,schema 也可能变化。模型看到这些工具之后,真正的风险才开始。

Runtime 需要把 MCP 工具包进自己的 Tool Registry:

type RuntimeTool = {
  name: string;
  source: "local" | "mcp";
  inputSchema: unknown;
  riskLevel: "read" | "write" | "network" | "destructive";
  timeoutMs: number;
  outputPolicy: ToolOutputPolicy;
  approvalPolicy: ApprovalPolicy;
};

这一步不能省。不要因为工具来自某个'标准协议',就默认它安全。协议让连接更顺,治理还是你的责任。

框架也是一样。

LangGraph、OpenAI Agents SDK、Vercel AI SDK、AutoGen、CrewAI,各有自己的抽象。选框架当然重要,但你不能把框架名当架构设计。更实在的问题是:

  • 它的 loop 控制在哪里?
  • harness 能不能定制?
  • runtime 状态能不能持久化?
  • trace 能不能还原一次 run?
  • 权限系统能不能接你自己的业务策略?
  • checkpoint 和 resume 是框架能力,还是要你自己补?
  • eval 能不能进 CI?

这些问题问清楚,比'这个框架是不是最火'有用。

我建议团队内部统一一套说法

如果你们正在做 Agent 产品,建议直接把下面这套词写进设计文档。

Agent
  面向目标的决策体。它根据上下文选择下一步。

Workflow
  预先编排的流程。确定性强的业务路径优先走 workflow。

Tool
  Runtime 暴露给模型或 workflow 的外部能力,带 schema、权限、审计和失败语义。

Agent Loop
  模型、工具调用和 observation 的多轮控制结构。

Harness
  围绕 loop 的增强和约束层,包括上下文、工具选择、memory、guardrail、verifier、eval case。

Agent Runtime
  承载 run、state、permission、budget、trace、checkpoint、eval 和 recovery 的执行系统。

然后在设计会上强制多问一句:

这个问题应该在哪一层解决?

模型传错参数?Tool schema 和本地校验。

模型一直重试?Loop stop reason 加 Harness observation。

工具太多导致误调用?Harness tool selection。

超时后副作用不确定?Runtime tool ledger 和 idempotency。

上线后难以复盘?Runtime trace。

长任务中断后重来?Runtime checkpoint。

这样的讨论才会变清楚。

最后

很多 Agent 项目一开始都想做'更聪明的 Agent'。我现在越来越觉得,第一阶段应该先做'更诚实的 Runtime'。

它不需要假装模型永远正确。它承认模型会传错参数、会误解工具、会循环、会忘记约束,也承认工具会超时、会截断、会产生副作用。

承认这些以后,系统设计反而简单了。

Agent Loop 让 Agent 动起来。

Harness 让它有能力,也有边界。

Runtime 让它能被运行、审计、恢复和改进。

参考资料

  • Anthropic Engineering: Building effective agents
  • LangChain Docs: Deep Agents overview
  • LangGraph Docs: Overview
  • OpenAI Agents SDK Docs: Agents
  • OpenAI API Docs: Function calling
  • Model Context Protocol Docs: Architecture
  • Model Context Protocol Docs: Tools

推荐阅读

  • Agent 生产事故 #001:Retry 为什么会导致重复下单?
  • 一次 Agent 任务为什么能烧掉几十次 LLM 调用?
  • 一个 Production Agent Runtime 到底需要什么?

目录

  1. Agent Loop、Harness、Runtime 到底是什么关系?
  2. 为什么现在必须把词讲清楚
  3. Agent Loop:最小控制结构
  4. Harness:让模型更能干,也更受控
  5. Runtime:系统责任的边界
  6. 三层放在一张图里
  7. 看到问题时,应该查哪一层
  8. MCP 不是 Runtime,框架也不是全部
  9. 我建议团队内部统一一套说法
  10. 最后
  11. 参考资料
  12. 推荐阅读

更多推荐文章

查看全部
  • 把 Clawdbot 连上飞书:从配置到踩坑的实操笔记
  • Serper Google Search API 接入指南与大模型联网实战
  • 国家数据局官宣:AI 核心术语 Token 中文译名为「词元」
  • 人工智能与深度学习技术发展趋势及核心原理详解
  • LobsterAI:网易有道开源的 24/7 全天候个人 AI 工作助理
  • Flutter 三方库 arcade 的鸿蒙化适配指南
  • Vector 底层实现:三个指针、内存与迭代器失效
  • Eino 框架 Embedding 组件详解与使用
  • VS Code 关闭 Copilot 代码补全
  • 数据结构初阶:详解线性表之双链表
  • 快速幂算法详解:高效计算 x 的 n 次幂
  • 基于 Java 的校园二手物品在线交易平台设计与实现
  • 6 种 Python 脚本打包成可执行文件的主流方法
  • OpenClaw 多 Agent 架构与飞书机器人对接实战
  • ERNIE-4.5 系列模型单卡部署与心理健康机器人实战
  • Ubuntu 环境下 AMD AI MAX 395 使用 ROCm 加速部署 Qwen 模型
  • Java 常用设计模式与 WebSocket 集成实践
  • Vibe Coding 中文指南:用自然语言驱动 AI 编程
  • GitHub Copilot 接入第三方 OpenAI 兼容模型方案
  • Git 安装状态检查方法汇总

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online