从LangChain到DeepAgent:理解Harness是企业级AI Agent的分水岭
最近好几个读者问同一个问题:我已经把 LangChain 的链式调用跑通了,也照着 LangGraph 画过状态图,为什么做一个企业级 AI Agent 还是感觉手里缺东西?
这个问题很真实。单独跑一个“调用模型 → 解析输出 → 执行工具”的 demo,一两百行代码就能完成。可一旦进入企业场景,你要面对的不只是“让模型回答正确”,而是任务的编排、状态的持久化、工具权限、日志追踪、失败恢复、多人协作、灰度发布。这里缺的那块东西,很多人叫它 Agent 的 Harness,而社区里也开始把这类带 Harness 机制的框架统称为 DeepAgent。
我越来越倾向于一个判断:了解 LangChain 和 LangGraph 只是第一步,理解 Harness 才是从 demo 走向企业级的分水岭。这篇文章就按“三小时学习路径”来拆解:先讲概念,再拆机制,然后给一个最小可用的落地流程,最后把底层原理、常见坑点和工程化边界说清楚。
1. 先搞清楚 DeepAgent 真正解决的是哪一层问题
1.1 单独使用 LangChain 时的“缺东西感”
很多人最开始接触 LangChain,会被它的链式抽象吸引。一个 Prompt 模板、一个模型调用、一个输出解析器,拼在一起就是一条链。这条链对固定流程很好用,比如“读 PDF → 做摘要 → 提取关键词”。但企业级 Agent 不是固定顺序的链,它更像一个带条件的循环:模型决定调用哪个工具、看工具结果、再决定下一步。
当你把 LangChain 用在这种场景时,会陆续遇到几个很现实的问题:
- 模型这一步调用了工具 A,工具 A 返回之后,模型可能又决定调用工具 B,整个流程的走向很难提前写死。
- 中间任何一步失败,你怎么恢复?重试整个任务?还是从某个节点继续?
- 用户看到的不只是最终答案,还要看到“当前进行到哪一步了”“这个数字是哪来的”“为什么卡住了”。
- 工具可能涉及权限,不是所有工具都允许模型直接执行,需要人工审批。
这些问题不是 LangChain 本身设计错了,而是“链”这个抽象粒度太粗。链适合描述顺序流程,不适合描述有分支、回退、循环的 agent 执行过程。所以很多人设计完链式代码后,会自己再加一堆 if/else、while、try/except,加到最后发现代码变成了一团无法维护的状态机。
1.2 Harness 不是框架,是一种执行外壳
“Harness”这个词在 CI/CD 里有成熟含义,指的是把测试或部署任务包在一个受控的执行环境里,统一处理输入、执行、上报、失败、重试。在 AI Agent 领域,Harness 承担的是类似角色。
可以这样理解:大模型是引擎,LangChain 是零件库,而 Harness 是驾驶舱和传动系统。它负责启动 Agent、管理会话和上下文、控制循环、判断终止条件、捕获异常、记录日志、触发人工审批、暴露事件流。它不负责让模型“变聪明”,它负责让模型在可控范围内稳定地执行任务。
社区里出现的 deepseek harness、codex harness 这类词,本质上都是同一类诉求:把大语言模型包装成一个可复用、可观测、可限制边界的执行外壳。它们不一定叫 DeepAgent,但思路是一致的——不要让模型裸跑,给它套上约束和兜底。
1.3 主判断:DeepAgent 的核心不是更聪明,而是可控
如果只用一个标准判断一个 Agent 框架是不是企业级,我会看它是否把“不可控”变成了“可控 + 可观测 + 可恢复”。
- 可控:模型只能调用允许范围内的工具,循环次数有上限,关键操作能被拦截审批。
- 可观测:每一步的输入、输出、耗时、token 消耗、工具返回都能查到。
- 可恢复:任务失败后能定位节点,能重跑,能恢复到某个历史状态,而不是从头再来。
DeepAgent 不是一个独占框架,它更像是一类“带 Harness 的 Agent 框架”的统称。LangChain、LangGraph 是底层的组件基础,DeepAgent 是在它们之上形成了完整的执行外壳。这也是我为什么建议不要只学 LangChain,还要理解状态图、事件流和工程化设施。
2. 从 Harness 到 LangGraph:拆开 DeepAgent 的核心机制
2.1 LangChain 负责零件,LangGraph 负责流程
LangChain 在做的事情,是把模型、Prompt、工具、解析器、记忆、RAG 这些零件统一封装成可组合的组件。它的价值是“接口标准化”。但它并不擅长描述“如果工具 A 返回 X,就继续走 B;如果返回 Y,就回到模型重新决策”这类控制流。
LangGraph 的做法不一样。它用图来描述 Agent 的执行流程:节点是“执行某个动作”,边是“条件转换”。模型是一个节点,工具是一个节点,路由判断可以是一条边上的条件函数。这样整个流程就被显式地画出来了,而不是散落在 Python 的 if 代码里。
这也是 LangGraph 和 LangChain 最核心的区别:LangChain 是链式线性抽象,LangGraph 是图式状态机抽象。复杂 Agent 一定有循环、分支、