返回 FEED
AGENT1749018840000

agent = model + harness:LangChain 怎么造一个能改的 Harness

Sydney Runkle 是 LangChain 的核心贡献者之一。这篇短文的目的不是介绍新功能,是给"agent 怎么造"一个干净到不能再干净的定义。

核心公式

agent = model + harness

harness 是把模型接进现实世界的脚手架。

而 Sydney 给 harness 的工作下了个非常具体的定义:harness 的全部工作,是在 agent loop 的每一步把"对"的上下文送给模型。

两个前提:

  1. agent 的好坏只取决于送给模型的上下文
  2. harness 的工作就是按时、按需把上下文送进去

所以造一个有用的 agent,等价于造一个擅长"在对的时候给对上下文"的 harness。

create_agent:极简到底

LangChain 推出了一个新原语 create_agent:传一个 model、tools、system prompt 进去,你就得到一个能跑的 agent。

市面上不缺 harness——DeepAgents、Claude Agent SDK 都已经预装了一整套 opinionated 的 middleware 栈:memory、context management、sandboxing……好处是开箱即用,坏处是它们锁死了抽象层。当你的 agent 需要更细粒度的定制(自定义 prompt、业务逻辑、guardrails),这些大而全的 harness 反而不灵活。

create_agent 反着来——故意做小。它的哲学和 Claude Code 一脉相承:高度可配置的 coding agent harness。

它只做一件事:实现 agent 主循环。其他所有能力都通过 middleware 暴露 出来。

middleware:在 agent loop 里的钩子

middleware 钩进 agent loop 的每一步:

  • 模型调用之前 / 之后
  • 工具调用之前 / 之后
  • agent 启动 / 关闭

每段 middleware 只管一件事,互相自由组合

Sydney 把 middleware 能干的事分成四类:

1. 确定性逻辑

业务逻辑、策略执行、动态 agent 控制——任何需要在 loop 的某个具体节点触发的事。包括对 agent 本身的运行时控制:根据任务复杂度换模型、调 prompt、压缩消息历史。

所有"不能(或不该)塞进 prompt 的东西"都该在这里。

2. 工具

不是把 tools 直接注册在 agent 上,middleware 接管工具的完整生命周期——setup、teardown、registration,最后递给 agent 一组干净的工具可用。

这在工具有依赖、需要初始化、跑完要清干净的场景下特别有用。而且它让工具配置靠近管理它的逻辑,不散在 agent 定义里。

3. Custom state

如果你的 middleware 需要跨钩子跟踪状态,middleware 可以扩展 agent 的 state 加上自定义属性。在整个执行过程中持续维护计数器、flags、跨钩子共享数据。

4. Stream handlers

middleware 可以拦截和改造 agent 的输出流——过滤事件、注入 metadata、把不同事件类型路由到不同消费者。当栈的不同部分需要对 agent 的不同行为做反应时很有用:UI 消费 token delta、审计日志记 tool call、监控系统追 latency。

middleware 的真正价值

一句话:它把"agent 行为"从"绑死的配置"变成"可组合的代码单元"。

具体两层好处:

  1. 任何点都能定制——agent loop 里任何一个步骤都可以插入中间件
  2. 相关逻辑打包成可组合、可分享的代码单元——同一段 middleware 可以在整个组织的所有 agent 上复用,新 agent 自动继承经过验证的行为

LangChain 已经为最常见 pattern 准备了预置 middleware。任何定制需求就只是一个 hook 的距离。

harness 的活儿:按时按需送对上下文

Sydney 用一张映射表把常见能力对应到支持它们的 middleware:

  • 长期运行?→ state middleware
  • 任务复杂度高?→ routing / model-swap middleware
  • 敏感操作?→ guardrail middleware
  • 需要可审计?→ log / stream middleware

生产环境的 agent 通常会同时组合几个

她特别提了一个概念:task-harness fit——harness 匹配任务实际需求的程度。客服 agent 的 harness 跟长跑 coding agent 的 harness 是两个物种。

LangChain 内部造的每个 agent——DeepAgents、Claude Agent SDK 集成、内部 agent——全跑在 create_agent 之上,各自叠不同的 middleware 栈。

核心 takeaway

  • 不要再问"用什么模型造 agent"——先问"你的 harness 在第几步、什么时机、把什么上下文送进模型"
  • 好的 harness 是个按时按需送对上下文的工程系统,不是 prompt 模板
  • middleware 作为原语的价值是让 harness 可演化、可复用——同一段逻辑能在新 agent 上继承
  • 最后那句最锋利:最佳 agent 不是用最强模型造的,是用最贴合任务的 harness 造的