3月26日, Sydney 发布了一篇长文。文中系统介绍了 LangChain 提出的 Agent Harness(代理框架;亦可理解为把各模块拴在一起的「缰绳」式架构)与 Agent Middleware(代理中间件),核心目的是:在 LangChain 已有能力之上,灵活定制自己的代理系统,而无需重写「LLM 在循环里调工具」这一核心循环。
什么是 Agent Harness? 代理 = LLM + 环境 + 数据 + 记忆 + 工具;Harness 负责把这些部分连接起来。LangChain 的 create_agent 提供了最简形式的核心循环(LLM 持续调用工具)。
为什么需要自定义 Harness? 不同业务场景需求不同:提示词与工具等浅层定制容易实现,但要改核心循环(例如在每次模型调用前后固定插入步骤)则很麻烦。Agent Middleware 正是针对这一痛点的方案。
Agent Middleware 详解 中间件提供一系列 Hook(钩子),可在代理运行的各阶段插入自定义逻辑;中间件可组合。LangChain 已内置 PII 脱敏、重试、摘要、动态工具选择、Shell 工具管理等;开发者也可继承 AgentMiddleware 自行扩展。
- before_agent / after_agent:代理启动时 / 结束时
- before_model / after_model:每次模型调用前 / 模型回复后(工具执行前)
- wrap_model_call / wrap_tool_call:完整包裹模型调用或工具执行
典型应用场景:业务合规(PII 脱敏、内容审核);动态控制(运行时切换模型或工具);上下文管理(自动摘要、将长内容卸载到文件);生产就绪(重试、人类介入、中断);工具集的初始化与清理。
Deep Agents 案例 Deep Agents 基于 create_agent 与一整套中间件栈实现「开箱即用」的代理框架(含文件系统、子代理、摘要、技能渐进披露等),你仍可在其上继续叠加自己的中间件。
LangChain 的长期判断 模型能力会持续增强,但确定性策略、生产防护栏与业务定制逻辑不会完全交给模型,而会留在 Harness 层;Middleware 是当前较干净、可复用、利于团队协作的抽象方式。
LangChain 把代理的「定制化」从偏混乱的 Prompt 工程,推进到结构化、可组合、可维护的中间件体系,使开发者既能站在既有能力之上,又能掌控自己的业务逻辑。
作者Sydney Runkle是 LangChain 的开源软件工程师,主要负责 LangChain 与 LangGraph(构建与部署 AI 代理的核心库)的开发工作。她毕业于美国威斯康星大学麦迪逊分校(University of Wisconsin–Madison)计算机科学专业,目前全职投入 LangChain 的开源生态建设。
Sydney 经常在 X、博客、YouTube 与 LinkedIn 上分享 LangChain v1、Deep Agents、多代理架构、Middleware 等前沿技术内容,是 LangChain 团队中非常活跃的开发者之一。她以清晰的技术讲解与实战案例著称,常被邀请在 AI 会议上演讲。
以下为正文翻译
Agent harness(代理框架)是构建代理的基础架构。它把大语言模型(LLM)接到运行环境(工具、数据、记忆等),让代理具备真正可执行的「做事」能力。
当你构建代理时,很可能需要针对特定应用场景定制专属的 agent harness。**Agent Middleware(代理中间件)**让你能够在 LangChain 和 Deep Agent 的坚实基础之上,根据实际需求进行灵活定制。
什么是 Agent Harness
代理是围绕模型构建的系统。模型需要连接到环境、数据、记忆和工具。Agent harness 就是帮助你实现这些连接的系统。
每个 agent harness 的核心都惊人地简单:一个 LLM,在一个循环中运行,调用工具。虽然简单,但这个核心循环蕴含着强大的能力。
LangChain 提供了 create_agent —— 一个只包含这个核心循环的抽象层。
为什么需要定制 Agent Harness
不同的代理应用场景有不同的需求,可能需要不同的 agent harness。
Agent harness 的某些部分(如指令或工具)相对容易定制。例如,LangChain 的 create_agent 允许你传入系统提示词和工具。
但其他部分就更复杂了。如果你想在模型执行前总是运行某个特定步骤?或者总是检查工具输出的特定内容?
涉及改变代理核心循环的操作更难处理。但如果处理得当,它能实现真正强大的定制化,同时让你仍然可以基于核心 harness 进行构建。
AgentMiddleware 就是我们的解决方案 —— 让人们能够定制 LangChain 代理的方式。
什么是 Agent Middleware
注意:"Middleware" 是软件工程中常用的通用术语,但下面我们要介绍的是一个不同的系统,我们称之为 agent middleware。
中间件暴露了一组钩子(hooks),让你可以在每个步骤前后运行自定义逻辑,从而控制循环每个阶段发生的事情:
- before_agent:在代理启动时运行一次(整个运行周期内通常只执行一次)。适合加载记忆、连接资源或验证初始输入。
- before_model:在每次模型调用前触发。用于修剪历史记录或在数据到达 LLM 前捕获 PII(个人身份信息)。
- wrap_model_call:端到端包裹模型调用。缓存、重试和动态模型请求(如改变可用工具)都在这里处理。
- wrap_tool_call:类似地包裹工具执行。注入上下文、拦截结果或控制哪些工具实际运行。
- after_model:在模型响应后、工具执行前运行。是实现人机协同(human-in-the-loop)最自然的位置。
- after_agent:在代理结束时运行一次。适合保存结果、发送通知、清理资源。
中间件是可组合的,你可以随心所欲地混搭使用。
LangChain 提供了一组针对最常见模式的预构建中间件,如摘要、重试和 PII 脱敏。开发者也可以继承 AgentMiddleware 类来编写适合自己业务的自定义中间件。
中间件示例
定制需求往往围绕相同的主题聚集。以下是最常见的用例:
业务逻辑与合规
有些事情不能放在提示词里,比如 PII 脱敏和内容审核。这些是每次都必须触发的确定性策略。你无法通过提示词实现 HIPAA(健康保险流通与责任法案)合规。
深度解析:PII 检测
LangChain 内置的 PIIMiddleware 实现了 before_model 和 after_model 钩子。它能够在模型输入、输出和工具输出上屏蔽/脱敏/哈希处理 PII。对于最关键的 PII 检测场景,它还可以抛出 PIIDetectionError。
动态代理控制
中间件可以在运行时重塑代理:根据当前状态注入工具、在任务中途切换模型、随着上下文演变更新系统提示词。这是对代理每一步行为的主动控制。
深度解析:动态工具选择
LangChain 的 LLMToolSelectorMiddleware 在 wrap_model_call 钩子中运行一个快速 LLM,识别工具注册表中哪些工具与给定请求相关。然后将这些工具绑定到模型请求,以最小化主模型调用中不必要工具带来的上下文膨胀。
上下文管理
模型的好坏取决于你放在它面前的内容。例如,当接近 token 限制时你可能需要摘要,并修剪嘈杂的工具输入/输出。上下文工程是一个运行时问题,不是一次性的提示词问题。
深度解析:摘要与上下文卸载
LangChain 内置的 SummarizationMiddleware 实现了 before_model 钩子。为避免上下文溢出,如果消息历史超过特定 token 阈值,其内容会在传递给模型前被摘要。该中间件的扩展实现了 wrap_tool_call 钩子,将冗长的工具调用输入和输出扩展到文件系统。
生产就绪性
中间件允许你内置模型/工具重试逻辑、模型降级策略和人机协同中断。这些功能在演示中不会出现,但对生产级代理至关重要。
深度解析:模型重试
LangChain 内置的 ModelRetryMiddleware 实现了 wrap_model_call 钩子,用重试处理器包裹模型的 API 调用。该处理器支持重试配置,如重试次数、退避因子和初始延迟(用于解决速率限制问题)。
工具集
注入需要在代理循环周围进行自定义设置和拆卸的工具,如连接到外部工具服务器、初始化 shell 或启动沙箱。
深度解析:Shell 工具中间件
LangChain 的 ShellToolMiddleware 实现了 before_agent 和 after_agent 钩子,在核心代理循环周围初始化和拆卸 shell 资源。它还将 shell 工具添加到模型的工具列表中。
Deep Agents 案例研究
Deep Agents 是一个开箱即用的 agent harness,完全基于 create_agent(LangChain 构建代理的标准入口点)构建,在其之上叠加了一套有主见的中间件栈。
以下是驱动 Deep Agents 的部分中间件:
- FilesystemMiddleware:基于文件的上下文卸载/加载和长期记忆
- SubagentMiddleware:具有上下文隔离的子代理
- SummarizationMiddleware:长任务的上下文溢出管理
- SkillsMiddleware:专业能力的渐进式披露
最重要的是 —— 你还可以在 Deep Agents 之上添加更多中间件,根据你的用例进行定制!
为什么我们要押注 Agent Middleware
模型正在变得越来越强大,这将改变中间件栈的某些部分。Deep Agents 今天所做的某些事情 —— 摘要、工具选择、输出修剪 —— 最终会被模型本身吸收。
但底层需求不会改变。构建者总是需要定制的杠杆:确定性策略执行、生产就绪性防护栏、特定用例的业务逻辑。这些都不会移入模型。Harness 仍然是它们存在的地方,而中间件仍然是暴露它们的最干净方式。
自从 LangChain v1 发布以来,我们就看到了这一点。中间件让不同团队拥有不同的关注点,将业务逻辑与核心代理代码解耦,并使逻辑在组织内易于复用。完全基于中间件构建 Deep Agents 让我们确信这是正确的抽象。
下一步
- 从基础 harness 入手:在 create_agent 里接入中间件,从最小循环开始验证钩子与业务策略(参见 LangChain 文档中的 Agents 相关章节)。
- 使用更强的开箱即用 harness:用 create_deep_agent 在 Deep Agents 之上继续叠加自己的中间件;结构与中间件列表见上文「Deep Agents 案例研究」及 Deep Agents 中间件指南。
- 贡献或扩展自定义中间件:参与贡献、提 PR 或扩展中间件时,请遵循官方文档中的贡献指南(流程与要求以文档为准)。