从 LangGraph 回到 Model-Tool Loop:更聪明的模型,正在让 Agent 架构重新变简单
早期 Agent 框架为什么会走向 LangGraph?
我们先不要急着批评 LangGraph。
早期显式 Agent 框架的出现是合理的。
在大语言模型能力还不稳定的时候,企业级应用最怕的不是模型不够聪明,而是模型不够听话。
它可能不按格式输出,可能跳过步骤,可能忘记系统提示,可能随便编工具参数,可能在应该调用工具的时候直接胡说,可能在应该等待人工确认的时候擅自执行。
那时候,如果你只是写一大段 prompt:
You are a helpful enterprise assistant. Please follow these rules... Step 1... Step 2... Step 3... Never do X... Always do Y...结果很可能是:今天能用,明天崩;简单任务能用,复杂任务崩;demo 能用,生产环境崩。
于是工程师自然会想:
既然模型不可靠,那就不要让它决定流程。我们把流程写死。
这就是 LangGraph 这类框架的土壤。
它们本质上是在用传统软件工程的方式约束 LLM:
分类节点 -> 路由节点 -> 工具节点 -> 审批节点 -> 总结节点 -> 输出节点每一步都有明确状态,每条边都有条件,每个节点都可以独立测试。
从企业工程视角看,这很诱人。因为它看起来可控、可观测、可审计、可恢复。
所以早期 Agent 框架不是错的。它们是在特定历史阶段,对“不可靠模型”的一种工程补丁。
2. 但问题来了:Prompt 爆炸被转移成了 Graph 爆炸
早期大家抱怨 prompt 爆炸。
所有规则都塞进 system prompt,最后 prompt 越来越长,越来越难维护。不同业务逻辑、工具说明、安全策略、输出格式、异常处理,全都混在一起。
于是我们引入了 graph,希望把逻辑拆开。
但拆着拆着,新的问题出现了:
Prompt 爆炸没有消失,只是变成了 Graph 爆炸。
原来一个自然语言很容易表达的规则:
当用户要求发邮件时,如果意图明确且收件人明确,可以发送; 如果用户只是让你帮忙写一封邮件,就只创建草稿; 如果内容敏感,需要人工确认。如果写成图,就可能变成:
intent_detection_node recipient_validation_node sensitivity_check_node draft_or_send_router human_approval_node send_email_node final_response_node然后你还要定义 state schema、edge condition、error branch、retry branch、fallback branch。
这时候系统看起来很工程化,但也开始变得僵硬。
更讽刺的是,很多这种规则,本来正是 LLM 最擅长理解的东西。我们却用一堆代码节点把它提前硬编码了。
这就引出一个核心问题:
你到底是在利用 LLM 的智能,还是在努力绕开 LLM 的智能?
3. 严格代码流程的泛化能力,很多时候不如 LLM
传统软件工程有一个默认假设:明确流程优于模糊推理。
这在普通业务系统里当然成立。银行转账、库存扣减、权限校验、订单状态机,都应该由确定性代码控制。
但 Agent 面对的问题不完全一样。
Agent 经常处理的是半结构化任务:
帮我整理这批邮件 看一下这个项目有没有风险 帮我分析这些日志 根据这几份文档写个回复 检查这段代码哪里可能有问题这类任务的难点不在于“流程不够确定”,而在于“情况太多,无法提前枚举”。
如果你用 graph 强行拆流程,就会遇到一个问题:
你写下的每一条边,都是对未来场景的一次假设。
假设越多,系统越脆。
而 LLM 的优势恰恰是能在没有完全枚举规则的情况下,根据上下文做出合理判断。
所以对于大量通用 Agent 场景,严格工作流并不会让系统更聪明,只会让系统更像一个复杂但笨重的表单流程。
这就是为什么很多看起来很漂亮的多 Agent / LangGraph demo,真实落地时会变得很尴尬:
图很复杂,效果一般。 节点很多,泛化很差。 架构很漂亮,维护很痛苦。4. Skill 的出现,是一个关键转折
我认为 Skill 概念的出现非常重要。
因为它解决的是早期 Agent 框架真正想解决的问题:如何让模型稳定地执行某类任务。
但 Skill 的解决方式和 Graph 不一样。
Graph 的思路是:
你不可靠,所以我用代码管住你。
Skill 的思路是:
你已经足够聪明,所以我给你一份可执行的行为说明书。
这两者差别很大。
一个 Skill 可以包含:
任务目标 操作步骤 注意事项 工具使用规则 输入输出格式 常见错误 示例 边界条件它不是简单 prompt,也不是硬编码流程。它更像一个“可加载的专业操作手册”。
关键是:模型现在越来越能读懂并遵守这种手册。
早期模型可能看完 Skill 也乱来,所以工程师必须写 graph。
但如果模型已经能比较稳定地遵循 Skill,那么大量显式 graph 就不再必要。
此时更好的结构是:
Model + Tools + Skills + Memory + Policy而不是:
Model hidden inside a giant workflow graph5. LangChain 的 Middleware,其实暴露了这个趋势
LangChain 现在引入 middleware,是一个很有意思的信号。
表面上看,这是为了增强create_agent。
但从架构角度看,它说明了一件事:
官方也意识到,不应该让用户为了扩展一个标准 Agent,就去手写完整 LangGraph。
create_agent本质上是一个固定的标准 Agent loop。
大概就是:
model -> tool -> model -> tool -> ... -> final answer而 middleware 负责处理横切逻辑:
before_model after_model wrap_model_call wrap_tool_call human-in-the-loop PII detection summarization retry fallback logging这其实很像 Web 框架。
在 Web 开发里,我们不会为了加日志、鉴权、限流、压缩、异常处理,就重新设计 HTTP 请求流程。我们会用 middleware、filter、interceptor。
Agent 也是一样。
如果标准Model <> Toolloop 已经足够通用,那么大部分扩展都不应该改变图结构,而应该作为 middleware 插入运行时。
所以我甚至觉得 LangChain 现在的架构是在“去 LangGraph 化”:
LangGraph 仍然是底层运行时, 但普通用户不应该直接面对它。这不是说 LangGraph 没用。
而是说:
LangGraph 不应该成为普通 Agent 扩展的默认接口。
6. “Email Agent” 是一个典型的抽象膨胀
LangChain 文档里有一类示例,会把 email 做成一个独立 agent,然后再放进 LangGraph workflow。
技术上当然可以。
但从抽象建模看,这很值得怀疑。
email 到底是什么?
如果只是发邮件、读邮件、搜索邮件,那它显然是 Tool 或 MCP Tool:
read_email search_email send_email create_draft如果是“如何写一封专业邮件”“如何回复客户投诉”“如何按照公司语气写邮件”,那更像 Skill。
只有当任务变成:
帮我处理今天所有邮件,判断哪些要回复,哪些要归档,哪些要提醒我。这时候 email 才值得成为一个 Agent。
因为它有自己的目标、循环、判断、工具集合和中间状态。
所以问题不是“email agent 能不能做”。当然能。
问题是:
我们是不是太容易把一个能力域包装成 Agent 了?
这几年 Agent 框架里有一种抽象膨胀:
File Agent Email Agent Calendar Agent Browser Agent GitHub Agent Database Agent CRM Agent听起来很高级。
但很多时候,它们只是工具集合外面套了一层 LLM。
真正的判断标准应该是:
这个东西是否需要独立的目标驱动循环?
如果不需要,它就是 Tool。
如果需要专业说明,它是 Skill。
如果需要连接外部系统,它是 MCP。
如果需要自治循环,它才是 Agent。
