SOTA Sync
全部文章
部署与运行2026-09-17

Agent = 模型 + Harness,胜负在后者

LangChain 提出 agent = model + harness 的定义:harness 的职责是每一步给模型喂对上下文,middleware 是定制它的原语。

构建一个好用的 agent,本质上是定制问题:把 agent 连到正确的 context、数据和运行环境上。

最朴素的定义是:agent 就是一个模型在循环里调工具,直到完成任务返回结果。LangChain 在这篇文章里给了一个更有用的写法:

agent = model + harness

harness 是包在模型外面的脚手架,负责把模型和真实世界接起来。这篇文章建立在两个前提上:

  1. agent 有多好用,取决于提供给模型的 context 有多好
  2. harness 的职责,是在每一步把对的 context 交给模型

所以要造一个好用的 agent,你需要一个"擅长为当前任务给模型递上下文"的 harness。

#底座 harness

LangChain 的原语是 create_agent:传入模型、工具、system prompt,就得到一个能跑的 agent。

Deep Agents、Claude Agent SDK 这类 harness 走的是另一条路——预装好一整套有立场的 middleware 栈(记忆、上下文管理、沙箱等),让你快速拿到生产可用的 agent。大多数场景它们够用,但很多 agent 需要更细粒度的定制:自定义提示、业务逻辑、护栏。

create_agent 刻意保持极简,只实现核心 agent loop,把 middleware 暴露为定制原语——这个哲学接近 Pi 那种高度可配置的 coding agent harness。

#Middleware:定制 harness 的方式

middleware 钩进 agent loop 的每一步:模型调用前后、工具调用前后、agent 启动和收尾。每个 middleware 只管一件事,彼此自由组合。

它提供四种加能力的杠杆,通常配合使用:

  • 确定性逻辑 :业务规则、策略执行、动态控制——任何必须在 loop 的特定点触发的东西,包括按任务复杂度换模型、调 prompt、压缩消息历史。凡是不能(或不该)写进 prompt 的逻辑,都该放这里。
  • 工具生命周期 :工具不直接挂在 agent 上,而由 middleware 管注册、初始化、销毁,给 agent 递一套干净的工具。工具有依赖、需要初始化或清理时尤其重要。
  • 自定义状态 :middleware 可以扩展 agent 的状态字段,在多次 hook 之间持续跟踪计数器、标志位,并在 hook 之间共享数据。
  • 流处理器 :拦截并变换 agent 的输出流——过滤事件、注入元数据、把不同事件路由给不同消费者(UI 吃 token 流、审计日志吃工具调用、监控吃延迟)。

middleware 的价值在于:loop 任意点都能定制,且每块逻辑是可组合、可共享的独立单元——同一个 middleware 可以被组织内所有 agent 复用。

#能力 → middleware 对照表

harness 的工作是"在对的时间把对的 context 给模型"。原文给了一张常用能力到 middleware 的映射,生产 agent 通常会同时用好几个:

能力为什么重要对应 middleware
防上下文溢出长会话快速堆积历史,不干预就会撑爆窗口Summarization、ContextEditing
读写记忆启动时载入知识、结束时写回,让 agent 随使用变好Filesystem、Memory、Skills
在环境里行动固定工具集限制上限,文件系统和执行环境解锁更灵活、更省 token 的解法ShellTool、Filesystem、CodeInterpreter
任务委派subagent 用干净的上下文处理子任务,todo list 跨长任务记进度SubAgent、AsyncSubAgent、TodoList
处理瞬时故障模型和工具会随机失败,生产环境需要退避重试和模型降级ToolRetry、ModelRetry、ModelFallback
执行策略PII、合规、审批关口必须每次都触发,不属于 promptPII、HumanInTheLoop
接管方向盘重大动作前暂停等人批准、拒绝或改向HumanInTheLoop
控成本prompt 缓存省 token,调用上限防失控ModelCallLimit、ToolCallLimit、PromptCaching

#Task-harness fit

文章最后提出一个评价指标:task-harness fit ——harness 和任务实际需求的贴合程度,包括它需要的 context、会遇到的失败、必须执行的策略、运行的环境。客服 agent 的 harness 和长时程 coding agent 的 harness 长得完全不同。

LangChain 自己内部所有 agent——GTM agent、异步 coding agent(open-swe)、无代码 agent 构建器——都是 create_agent 加一套按任务定制的 middleware 栈。

结论:最好的 agent 不只靠强模型,靠的是 harness 严丝合缝地贴住任务。