今天拆的是一个 Agent 工程范式:Harness Engineering。
如果你用过 Claude Code、Cursor、Devin 或者任何一个"能自己写代码的 Agent",你可能已经直觉感受到一件事:决定这些 Agent 好不好用的,往往不是底层模型是哪一家,而是模型外面那一层"胶水代码"——它怎么管理对话历史、怎么把工具结果喂回去、怎么让 Agent 记住昨天做了什么、怎么在出错时回滚。
LangChain 在一篇题为"The Anatomy of an Agent Harness"的文章里给了一个极简定义:如果你不是模型,你就是 Harness。
这个说法很锋利,但它抓住了一个正在发生的行业转向。
今天的主角:Agent Harness 是什么
Agent Harness 是指围绕 LLM 模型构建的所有代码、配置和执行逻辑的总和。一个原始 LLM 不等于 Agent——Harness 赋予它状态持久化、工具调用接口、文件系统访问、沙箱隔离、记忆检索和评估回路。
用公式表达就是:Agent = Model + Harness。
这个概念之所以值得专门拆,是因为 2025-2026 年 Agent 工程的实践正在证明:模型之间的差距在缩小,但 Harness 之间的差距在拉大。同一个 Claude Opus,套在不同的 Harness 上,表现天差地别。
一手来源包括 LangChain 官方博客文章、LangGraph 文档和 Anthropic 的 Claude Code 技术分享。

为什么现在值得拆
模型厂商的竞赛越来越集中在参数规模和基准分数上,但在生产环境里,Agent 的行为取决于模型之外的系统。一个 Agent 能不能在长任务中不"失忆"、能不能在出错时自动重试而不是崩溃、能不能把中间结果保存到文件系统而不是只塞在对话窗口里——这些全部由 Harness 决定。
LangChain 提出的 Harness 框架不是要造一个新模型,而是给已经存在的模型穿上合适的"盔甲",让它能长时间、可靠地执行复杂任务。这背后的工程哲学是:不要指望模型自己解决所有问题,用外部系统给它补上它天生做不到的事情。
机制拆解:Harness 的分层架构
Harness 不是一个大杂烩,它有清晰的分层结构。从外到内可以分为四层:

外层:工具与执行沙箱。 这是 Agent 的手。Bash shell、代码解释器、浏览器自动化工具、文件读写接口——所有让 Agent 碰到真实世界的东西都属于这一层。关键设计不是"给 Agent 多少工具",而是"怎么安全地给"。沙箱隔离、网络策略、超时控制、权限管理,这些决定了 Agent 能不能在生产环境里安全运行。
中层(上):规划与编排引擎。 这是 Agent 的大脑前额叶。任务分解、并行调度、进度追踪、自适应策略——Agent 遇到复杂任务时不能一股脑儿往前冲,需要先拆解、排序、分配、监控。好的 Harness 会让 Agent 学会"先做什么后做什么",而不是在第一步就耗光所有上下文。
中层(下):状态与记忆系统。 这是 Agent 的海马体。对话历史、工具结果缓存、跨会话持久化、搜索索引——Agent 做完的每件事都需要被记录下来,而且在下一次启动时能被找到。Harness 需要解决的核心问题是:当上下文窗口满了怎么办?答案是文件持久化 + 摘要压缩 + 检索增强。
核心层:LLM 模型。 这是 Agent 的推理引擎。模型负责理解、规划、代码生成、工具选择——但它只负责"想",不负责"做"。做这件事由 Harness 的其他三层完成。
架构拆解
从 Agent 架构的全流程来看,Harness 在每个环节都有关键职责:
输入处理: Harness 负责格式化输入——组装系统提示、注入工具定义、管理上下文窗口。在长对话场景中,Harness 决定哪些历史保留、哪些摘要压缩、哪些归档到文件。
规划执行: Harness 提供任务分解的工具(如 LangGraph 的 state graph),让 Agent 把大任务拆成可执行的子步骤。并行执行时,Harness 负责调度多个子任务、收集结果、处理冲突。
工具调用: Harness 管理工具的全生命周期——注册、路由、执行、超时、重试、结果格式化。Claude Code 中 Agent 能直接操作文件系统,靠的就是 Harness 提供的安全沙箱和文件接口。
记忆与状态: 这是 Harness 与模型的最大分工点。模型的上下文是易失的,Harness 的文件系统是持久的。一个好的 Harness 会让 Agent 把关键中间结果写到文件里,而不是一股脑塞进对话窗口。
评估与回滚: Harness 需要提供验证机制——Agent 做完事后代码能不能跑?测试能不能过?如果不能,Harness 应该触发回滚或重试,而不是把半成品交给用户。
人类介入: Harness 控制 human-in-the-loop 的介入点——何时请求用户确认、何时展示中间结果、何时等待人工审批。这些决策直接影响 Agent 的可用性和安全性。
输出交付: Harness 负责最终输出的格式化和交付——是生成代码补丁?还是写一份报告?还是直接部署?不同的交付方式需要 Harness 提供不同的输出接口。

关键设计取舍
Workflow vs Autonomous Loop: Harness 可以设计成严格的工作流(每一步人工确认)或自主循环(Agent 自己决定步骤数)。Claude Code 选择的是一个混合模式——在安全操作(如读文件)上自主循环,在危险操作(如部署)上请求确认。
Prompt vs State Machine: 早期 Agent 靠提示词驱动一切,但长任务中提示词容易漂移。新一代 Harness 用状态机显式管理 Agent 的行为状态,把"Agent 现在该做什么"从提示词中提取到代码逻辑中。
Context vs Memory: 上下文窗口是短期记忆,文件系统是长期记忆。Harness 的设计取舍在于:哪些信息值得放到上下文里(占用 token 但访问快),哪些信息归档到文件(节省 token 但需要检索)。
Function Calling vs MCP: 工具调用的协议正在从 OpenAI function calling 格式向 MCP(Model Context Protocol)演进。MCP 的优势是标准化资源访问和工具发现,但在简单场景下 function calling 更轻量。
Harness 如何解决 Context Rot
一个长对话 Agent 面临的核心问题是上下文腐烂(Context Rot):对话开始时系统提示和工具定义清晰明了,但随着几十轮工具调用的结果涌入,上下文被大量中间数据淹没,模型逐渐遗忘初始指令。

Harness 的解法是分层管理:关键状态持久化到文件系统、定期做上下文摘要压缩、工具定义置顶不被挤出去、用检索机制按需加载历史信息。这些策略加在一起,让 Agent 在长达几百轮的对话中保持"不"。
实践启发

1. 文件系统是第一类存储。 让 Agent 写文件而不是只记在对话历史里。文件跨会话持久化,是 Agent 从"聊天机器人"进化为"工作引擎"的关键一步。
2. Bash 是通用工具接口。 与其封装几十个 API,不如给 Agent 一个安全沙箱里的 shell。Bash 能调一切命令行工具,Agent 的边界就是 shell 的边界。
3. 评估回路不能省略。 Agent 做完事后必须有自动验证——代码能不能编译、测试能不能过、输出是否符合格式。没有验证的 Agent 就是盲飞。
4. 并行委派比串行快。 让 Agent 学会拆分子任务并行执行,而非一步步等。Harness 需要提供并行调度和结果合并的能力。
5. Harness 与模型训练正走向耦合。 下一代模型将针对特定 Harness 做对齐训练,而不是做一个通用聊天模型再套 Harness。Claude Code 的训练数据很可能就包含了它在文件系统和 shell 中的操作轨迹。
风险与局限
Harness 工程也不是没有坑:
复杂度失控: 随着 Harness 层越来越厚,调试和维护成本指数级上升。一个 Agent 出错,可能是模型的问题、工具的问题、状态管理的问题,或者三者叠加。
安全边界: 给 Agent 文件系统和 shell 访问权限等于给它一把双刃剑。权限过大会导致数据泄露和意外删除,权限过小会让 Agent 束手束脚。
评估困难: Harness 工程的效果很难用单一 benchmark 衡量。不同的 Harness 适用于不同场景,横评需要大量定制化测试。
供应商锁定: 深度定制的 Harness 可能只适用于特定模型。如果换模型需要重写大量 Harness 代码,迁移成本会很高。
写在最后
Harness 工程的核心判断只有一个:模型在进步,但模型不会自己变成 Agent。是 Harness 给了模型状态、工具、记忆和评估,让它从"能说会道"变成"能干活"。
下一个 Agent 时代的赢家,可能不是参数最多的模型,而是 Harness 设计最合理的系统。
关注科言 Lab,获取最新资讯。
参考来源
LangChain 官方博客 "The Anatomy of an Agent Harness":https://blog.langchain.dev/the-anatomy-of-an-agent-harness/ LangGraph 文档(Harness 工程实践):https://langchain-ai.github.io/langgraph/ Anthropic Claude Code 技术分享:https://www.anthropic.com/claude-code MCP(Model Context Protocol)文档:https://modelcontextprotocol.io/
夜雨聆风