搞懂DeepAgent、Harness与LangGraph:Agent框架核心机制实战
好的,我理解全部要求。现在直接为你输出一篇完整、可直接发布的CSDN技术教程博文。
作为一名后端开发,过去半年我一直在和各种 Agent 框架打交道。从最初调 LangChain 的 Agent 经常“答非所问”,到后来把团队业务接入 LangGraph 做状态编排,再到研究 DeepAgent 这类强调“控制循环”的企业级框架,一个很深的感受是:如果只看官方文档,很容易被各种抽象名词绕晕,但一旦理解了底层机制,所有 Agent 框架的核心套路其实是一致的。
这篇文章我想把这段时间的实践经验整理成一套保姆级教程。围绕 DeepAgent、Harness、LangChain、LangGraph 这组关键词,从“这些概念到底是干什么的”讲起,再拆解 Agent 运行的核心机制,最后给出一个可以直接落地的可运行项目,并且补充你在生产环境里大概率会遇到的问题和排查思路。不管你是刚入门 AI 应用开发,还是已经在业务里尝试接大模型,这篇文章都能给你一条相对完整的路径。
先说清楚:我不会把每个框架的 API 都罗列一遍,而是重点讲透 Agent 的运行机制——因为只要你理解了 Harness 是怎么控制 Agent 循环的,理解 LangGraph 的状态图为什么是这么设计的,再看任何框架的文档,都会轻松很多。
1. 先把概念搞清楚:DeepAgent、Harness、LangChain 和 LangGraph 到底指什么
很多初学者一开始就把这几个词当成并列的技术栈去学,结果越学越乱。我先用通俗的方式把它们归一下类。
1.1 DeepAgent 是什么
DeepAgent 并不是某个官方发布的单一框架,而是在大模型应用开发中,用来描述“具备自主决策能力的智能体运行机制”的一类框架或架构方案。通俗地说,DeepAgent 强调的是:大模型不只是回答你的问题,而是能自己规划步骤、调用工具、观察结果、修正策略,最终完成任务。
这种机制通常包含以下模块:
- 规划(Planning):大模型把用户的目标拆解成一系列可执行的步骤。
- 工具调用(Tool Calling):根据规划结果,调用外部 API、数据库、代码执行器等。
- 记忆(Memory):保存对话历史或任务过程中的关键信息。
- 执行与反馈(Execution & Reflection):执行工具后,把结果反馈给大模型,让它判断下一步怎么做。
所以当你听到“DeepAgent 框架”时,可以把它理解为一套专门用来构建上述能力的工程化方案。
1.2 Harness 是什么
Harness 直译过来是“马具、挽具”,在 AI Agent 领域,Harness 指的是包裹在大模型之外的运行时控制层。
你可以这样理解:大模型本身只是一个“大脑”,它输出 Token、生成文字。Harness 则负责在大模型输出之前和之后,做一系列工程化处理,比如:
- 维护对话上下文。
- 解析大模型输出中的工具调用指令。
- 执行工具并将结果返回给模型。
- 控制整个循环什么时候结束。
- 处理超时、重试、安全限制。
现在不少团队提到“Harness Engineering”,本质上就是把 Agent 的循环控制逻辑当成一个独立工程设计问题来看待。Codex Harness、DeepSeek Harness 这类名词,也都指的是围绕特定模型构建的 Agent 控制层。
1.3 LangChain 和 LangGraph 的关系
LangChain 是最早让“用大模型开发应用”变得简单的一批框架。它提供了 LLM 封装、Prompt 模板、Chain 链式调用、Agent 工具等模块。
LangGraph 是 LangChain 团队后来推出的底层编排框架。你可以理解成:LangChain 是上层封装,LangGraph 是底层状态机。
LangGraph 的核心思路,是把 Agent 的每一次思考、工具调用、结果返回,都看作状态图里的一个节点和一条边。开发者可以精确控制状态如何在节点之间流转,这比 LangChain 早期 Agent 里那种“黑盒循环”要可控得多。
另外提一下,LangGraph 和 LangChain 并不是替代关系。LangGraph 里照样可以使用 LangChain 的模型封装、Prompt 模板和工具组件。它们的关系是“上下层协作”,不是“二选一”。
1.4 AI 大模型在整个体系里的位置
AI 大模型是整个 Agent 系统的推理引擎。无论是 DeepAgent、Harness 还是 LangChain,最终都要调用一个或多个大模型来完成理解、规划、生成等核心能力。
当前阶段,主流的调用方式有两种:
- 直接调用 API,比如 OpenAI、DeepSeek、Qwen 的开放接口。
- 本地部署开源模型,通过 vLLM、Ollama 等工具提供 OpenAI 兼容接口。
在 Agent 开发中,你不需要特别关心模型内部的训练细节,但必须清楚模型的上下文窗口、函数调用能力、输出格式稳定性,这些会直接影响 Agent 的上限。
2. 环境准备与版本说明
在开始写代码之前,我们先把环境准备好。本文的示例会以 Python 和 LangGraph 为主,因为这套组合既能让你看清楚 Agent 的运行机制,又能快速落地业务。
2.1 运行环境
| 项目 | 说明 |
|---|---|
| 操作系统 | Windows 10/11、macOS、Linux 均可 |
| Python 版本 | 建议 3.10 及以上 |
| 包管理工具 | pip 或 poetry |
| 模型 API | OpenAI 兼容接口,可采用 DeepSeek、OpenAI、通义千问等 |
| 框架版本 | langchain、langgraph、langchain-openai,具体版本以官方 PyPI 最新为准 |
由于 LangChain 和 LangGraph 的迭代速度非常快,本文示例中不会把版本号写死。你在安装时,建议直接安装最新稳定版。
2.2 创建虚拟环境
这里我以 Python 的 venv 为例:
激活之后,升级 pip:
2.3 安装依赖
接下来安装核心依赖:
这里说明一下每个依赖的作用:
langchain:提供模型封装、Prompt 模板、工具定义等基础组件。langchain-openai:让 LangChain 能调用所有 OpenAI 兼容接口。langgraph:提供状态图编排能力,是我们实现 Agent 循环的核心。
另外,如果希望做一些开发调试,可以安装 python-dotenv 来管理环境变量:
2.4 配置模型 API
在项目根目录新建一个 .env 文件,用于存放模型 API 相关的环境变量:
如果你的模型来自其他服务商,只需要把 OPENAI_BASE_URL 换成对应的 Base URL 即可。
注意:这里有一个非常容易踩的坑。很多人拿到 LangChain 示例代码,发现调用失败,是因为 LangChain 默认会去连 OpenAI 官方接口。如果你使用的是国内模型服务,请务必设置 OPENAI_BASE_URL。还有一点需要提醒:生产环境里不要把 API Key 直接写死在代码里,应该通过环境变量或密钥管理服务注入。
3. 核心机制拆解:Agent 到底是怎么“自动思考”的
这一节是整个教程的重点,我们会从底层机制上弄清楚一个 Agent 是如何连续思考、调用工具、最终完成任务的。
3.1 ReAct 范式:思考 - 行动 - 观察
现在的 Agent 框架,绝大多数都遵循 ReAct 范式,也就是 Reason + Act 的循环。
它的基本流程是:
- 思考(Thought):大模型根据当前对话上下文,决定下一步需要做什么。
- 行动(Action):如果需要调用工具,大模型输出一个结构化指令,比如调用某个函数。
- 观察(Observation):系统执行工具,并把结果返回给大模型。
- 重复:大模型看到观察结果后,继续思考,直到认为可以给出最终答案。
用文字描述可能不够直观,我们看一个最简单的手写循环示例。
这段代码虽然简陋,但它包含了 Agent 循环的全部关键要素:模型判断是否需要调用工具、系统执行工具、结果回填给模型、模型继续推理直到输出最终答案。
这也是理解后面所有框架的基础:LangChain 也好,LangGraph 也好,本质上都是在帮你封装这个循环。
3.2 任务规划能力是怎么实现的
很多人问:“LangChain 中的任务规划能力是如何实现的?”
任务规划并不是某个独立算法,而是大模型根据 Prompt 指令、上下文信息、可用工具列表,自主生成执行步骤。实现方式主要有三种:
第一种:单步 ReAct 循环。 模型每一步只决定一个动作,执行完再决定下一步。好处是灵活,坏处是步骤多了容易“迷失”。
第二种:Plan-and-Execute。 模型先根据用户目标生成一份完整计划,然后逐步执行。比如用户说“帮我调研一下竞争对手的产品”,模型会先生成“打开搜索→搜索关键词→整理结果→生成报告”这样的计划,然后逐步执行。
第三种:结构化输出规划。 框架约束模型输出 JSON 等结构化格式,比如 {"step": "第一步", "action": "search_web", "args": {...}}。这种方式便于代码解析,也方便加入校验和重试逻辑。
LangGraph 比 LangChain 早期的 Agent 更加强大,是因为它允许你把“规划”和“执行”设计成图里的不同节点,既能动态规划,也能固定流程,甚至能做多层嵌套。
3.3 记忆机制对 Agent 的影响
Agent 需要记忆,否则模型会忘记前面已经做过的操作。
记忆大致可以分为三层:
- 短期记忆:指一次任务内,把所有对话历史和中间结果都放进上下文里。这种方式实现简单,但会占用大量 Token。
- 长期记忆:把重要信息存入向量数据库,比如 Chroma、Milvus。需要时通过检索把相关内容取回。
- 工作记忆:在代码层维护一个状态对象,记录当前任务进度、已完成步骤、需要保留的中间变量。LangGraph 的状态机制就是典型的工作记忆。
在真实项目中,这三种记忆往往是组合使用的。比如:全局上下文只保留最近几轮对话,团队知识库放进向量数据库,任务状态全部放在 LangGraph 的 State 里。
3.4 LangChain 和 LangGraph 的区别,用一个例子说透
我用一个比喻来帮助大家记忆:
LangChain 更像是“预制菜流水线”。你把食材(工具)、菜谱(Prompt)准备好,可以用简单的 Chain 顺序执行,也可以用 AgentExecutor 自动调度。优点是上手快,缺点是流程一旦复杂,你很难精确控制每一步。
LangGraph 更像是“可编程流水线”。你得先把工序画成图纸(状态图),然后自己定义每个工位(节点)做什么、工序之间怎么流转。优点是完全可控,适合复杂业务。
下面是一个例子,假设我们需要实现一个“如果用户问天气,就查天气工具;否则走普通对话”的 Agent。
如果用 LangChain 早期的 AgentExecutor,你只需要定义一个工具列表,框架自己去决定调用哪个。但实际运行中,模型偶尔会挑错工具,或者陷入无限循环。这在生产环境里是非常致命的。
如果用 LangGraph,你可以把 “判断工具” 和 “执行工具” 拆成两个节点,并且在进入工具节点之前做一次规则判断,这样就能避免模型误用工具。本质上,LangGraph 的图结构给了你更多干预和兜底的机会。
4. 完整实战:基于 LangGraph 构建一个可落地的企业级 Agent
下面进入正题,我们用 LangGraph 来实现一个相对完整的 Agent。
这个 Agent 的需求是:用户输入一段产品需求描述,Agent 能先判断意图,然后调用“需求分析工具”提取关键信息,最后调用“文档生成工具”生成一份结构化的需求文档。
4.1 项目目录结构
我们先建立一个清晰的项目结构:
这个结构把状态定义、节点实现、工具实现和图的构建分开,便于维护。
4.2 定义 Agent 状态
在 LangGraph 中,状态是一个核心概念。所有节点共享一份状态对象,节点之间通过状态传递数据。
这里的 messages 字段使用了 LangGraph 提供的 add_messages 标注,它的作用是当多个节点都要往消息列表里追加内容时,自动进行合并而不是覆盖。
4.3 编写工具函数
工具函数是 Agent 执行具体操作的能力。在本例中,我们提供两个简单的模拟工具:
这里把工具写成普通函数,是为了让你看清楚:LangGraph 节点里执行的逻辑可以是你任意写的 Python 代码,不一定要被框架包装。 这在实际业务中意义重大,因为企业的很多系统调用都是内部 RPC、数据库操作,无法完全走大模型工具标准化协议。
4.4 实现节点逻辑
接下来定义图中的各个节点。节点就是一个接收状态、返回新状态增量的普通函数。
关于这里要重点解释的是 intent_node:在实际大模型项目中,意图判断不一定非要调用大模型,有时候用简单的规则反而更快更稳定。你可以把它理解成一个“可插拔的决策节点”,以后想换成大模型判断,只需修改这一个节点内部实现,不需要动整张图。
4.5 构建图结构
现在把这些节点组合成一张图:
可能有读者会问:error_node 和错误处理在哪里用上?这里先保留一个节点,说明图设计里可以预留兜底路径。后面我们在 5.3 节中会展示如何在节点执行异常时跳转到这个节点。
4.6 编写入口文件
4.7 运行与验证
在项目根目录执行:
预期输出效果如下(实际内容取决于你的输入和工具函数实现):
这样一来,你就能直观看到状态图如何根据意图把不同的节点串联起来。这里虽然还没有真正调用大模型,但你已经理解了 Agent 的骨架。后续不管接什么大模型、什么工具,都是往这张图里填血肉。
5. 常见问题与排查思路
在实际使用 LangGraph、LangChain 或自己写 Harness 层的过程中,很多问题其实是相似的。我整理了下面几个高频问题。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| Agent 陷入无限循环 | 模型不断调用同一个工具,或工具调用链过长 | 在 Harness 层设置最大迭代次数;用 LangGraph 时设计终结条件 |
| 工具调用参数格式错误 | 模型输出 JSON 与实际函数签名不一致 | 对工具参数做严格校验;给模型提供函数描述的示例 |
| 模型调用 API 超时 | 网络环境不稳定或模型服务负载高 | 设置合理的超时和重试策略;必要时切换备用模型通道 |
| 上下文越长费用越高 | 所有历史消息全部塞给模型 | 增加消息摘要节点,历史超过阈值后进行压缩 |
| 模型返回内容不稳定 | Prompt 指令不够明确 | 定义清晰的输出格式,必要时使用 JSON Schema 约束 |
| LangGraph 编译报错 | 边引用了不存在的节点或条件映射错误 | 检查节点名称和条件字典的 key 是否一致 |
5.1 无限循环怎么处理
在 LangGraph 里,你可以在条件边中增加计数器。当某个节点的执行次数超过阈值时,直接跳转到结束节点。
这比单纯依靠大模型“自我判断”要安全得多。
5.2 工具调用失败怎么办
工具执行失败时,不要直接中断整个 Agent 流程。正确做法是:把异常信息当作“观察结果”回传给大模型,让模型决定是换一种参数重试,还是换一个工具,或者直接放弃。
如果你在 LangGraph 中使用 try/except 包装工具节点,返回一个 tool_error 字段,可以在条件边里判断是否需要重试。
5.3 在 LangGraph 中增加异常兜底路径
这里我们把前面预留的 error_node 接入图中,展示完整的容错写法。
在这个示例中,如果分析节点返回的错误字段不为空,会进入 error 节点,否则继续生成文档。这体现了 LangGraph 的另一个价值:你可以把容错逻辑作为显式路径画在图里,让 Agent 的行为变得可预期。
5.4 部署和监控层面的问题
本地跑通之后,部署到服务器或容器环境时,还需要额外关注:
- API Key 不要打进镜像,要使用环境变量或 Secret 管理工具。
- Agent 的日志要记录“每次调用的模型、工具、耗时、Token 数”,方便排查。
- 生产环境建议加一层限流,防止异常循环导致巨额费用。
6. 最佳实践与工程建议
最后这部分,分享一些我在企业项目里总结出的工程经验。
6.1 把图当作业务流程,而不是技术实现
很多开发者一开始就陷入 LangGraph 的 API 细节里,忽略了真正重要的是业务流程。在画图之前,我建议你先用纸笔画出业务流转过程:
- 哪些环节需要大模型参与?
- 哪些环节可以走规则判断?
- 哪些环节必须人工兜底?
把这些问题想清楚后,再用代码实现,会高效很多。这一点和 Harness Engineering 的思想也是相通的:先定义控制逻辑,再考虑模型能力。
6.2 每个工具都要有清晰的描述
大模型是靠工具描述来决定何时使用该工具的。如果你的工具描述写得太模糊,模型就会经常用错。写工具描述时,尽量包含:
- 这个工具是干什么的。
- 什么场景下使用。
- 参数分别代表什么含义。
- 一个典型的调用示例。
6.3 用结构化输出约束模型
对于企业级系统,模型输出的稳定性至关重要。如果只是用自然语言让模型“按格式输出”,很容易出现随机偏差。建议使用结构化输出约束,比如 LangChain 的 with_structured_output,或者直接在后端做 JSON Schema 校验。
6.4 State 设计要扁平化
在 LangGraph 中,State 设计得越扁平,节点间的耦合越少。尽量不要在 State 里放一个超大的嵌套对象,否则调试的时候很难看清状态变化。可以按业务领域拆分不同字段,比如 user_context、task_progress、final_answer。
6.5 重视可观测性
很多人写 Agent 时只关心最终结果,忽略了过程日志。在真实项目里,一个 Agent 任务可能跨多个节点、多次模型调用,如果没有完整日志,出了问题会非常难排查。建议在每个节点里加入结构化日志,记录:
- 当前节点名。
- 输入的关键字段。
- 输出字段。
- 节点耗时。
- 模型调用次数和 Token 消耗。
在 LangGraph 中,你可以为每个节点加一个日志装饰器,或者在节点函数内部打印关键信息。
6.6 做充足的测试
Agent 的测试思路和传统后端完全不同。除了单元测试,你还需要对“模型调用的分支结果”做模拟测试。比如,工具返回异常格式时,Agent 是否还能继续处理。
建议至少覆盖以下场景:
- 正常路径:输入符合预期,顺利完成任务。
- 工具异常:工具抛错,能触发兜底逻辑。
- 超长输入:对话历史很长,是否有压缩逻辑。
- 空输入 / 无意图:模型能否判断出需要用户补充信息。
- 敏感输入:是否会被安全策略拦截。
7. 总结
通过这篇文章,我们把 DeepAgent、Harness、LangChain、LangGraph 这几个容易混淆的概念重新梳理了一遍。它们的核心关系可以这样理解:DeepAgent 是一种智能体运行机制的统称,Harness 是包裹在大模型外的控制层,LangChain 提供了构建智能体的基础组件,LangGraph 则用状态图的方式帮助你把控制逻辑可视化、工程化。
文章中的实战示例虽然只用到了规则判断和简单工具,但骨架已经足够清晰。你可以在上面继续增加大模型节点、向量检索工具、数据库读写工具,甚至接入消息队列做异步任务处理。
如果你现在准备在项目中引入 Agent 机制,我的建议是:先不要急着追求复杂的框架和炫酷的功能,而是从一张简单的图开始,把流程跑通,把日志和容错做好。当你对图的结构越来越熟悉,再去处理复杂的动态规划、多 Agent 协作,会顺手很多。
希望这篇教程能帮你少走一些弯路。如果你在搭建过程中有自己的心得或者踩坑经历,欢迎在评论区交流。