智能体编排框架横评:同一个报销 Agent 换六种写法
本文总结从 Agent 循环、工具调用、状态、检查点、中断这几个基本概念讲起,再用同一个报销例子走过 LangChain、LangGraph、厂商 SDK、多智能体框架、轻量框架和低代码平台,每站都从安装和第一个 Agent 开始。
这个系列讲什么
Agent 核心 回答过 LangChain 和 LangGraph 的关系、手搓还是用框架,那是面试的答法。这个系列面向想动手的人:每个框架从安装、跑通第一个 Agent 讲起,再讲它的基本概念,最后用同一个例子写一遍,方便对照。
例子沿用 主线:一个报销请求走完整个 Agent 系统:
员工问:"我上周出差打车超标了,还能报吗?能的话帮我提报销工单。"
Agent 有三个工具:
| 工具 | 作用 | 示例数据 |
|---|---|---|
search_policy |
查报销制度 | 打车标准 80 元 |
get_invoice |
查发票 | INV-102,金额 118.5 元 |
create_ticket |
建报销工单 | 有副作用,建单前必须员工确认 |
阅读前提:
- 各站的代码都是按官方文档写的示意代码,没有运行过。
- 内容按 2026-11 初的官方文档写,每站末尾有"版本说明"和参考资料。
- 只讲用法和适用场景,不评价产品好坏,也不做性能对比。
几个基本概念
后面六站反复用到下面几个词,先在这里说清楚。
Agent 循环。 Agent 的核心是一个循环:把对话发给模型;模型要么直接回答,要么要求调用某个工具;程序执行工具,把结果追加到对话里,再发给模型;直到模型给出最终回答为止。所有框架的 Agent 都是这个循环,区别在于循环外面包了多少东西。手写这个循环的过程见 跟读 learn-claude-code:17 个 harness 机制怎么挂到一个循环上。
工具调用。 工具就是一个普通函数,加上名字、说明和参数格式。框架把这些信息发给模型,模型返回"调用哪个工具、传什么参数",框架负责执行并把结果交回模型。大部分框架用装饰器或函数签名自动生成参数格式。
状态。 一次运行里要记住的东西:对话历史、工具结果、中间变量。有的框架只记对话历史,有的(如 LangGraph)让你定义一个结构化的状态对象,每一步读写它。
检查点。 把某一时刻的状态存下来(内存、SQLite、Postgres 等)。有了检查点,进程退出后可以从存下的位置接着跑,也可以回到之前某一步重新执行。
中断。 运行到某一步主动停下,等外部输入(通常是人的确认)再继续。报销例子里,建单前就要中断,等员工确认。中断要靠检查点:停下时把状态存起来,拿到确认后读回来继续。
多 Agent。 把任务拆给多个 Agent,各有自己的提示词和工具,由一个协调者分派,或者让它们轮流发言。第 4 站专门讲。
四类产品:运行时、框架、Harness、平台
常说的"Agent 框架"其实混着四类东西:
| 类型 | 管什么 | 例子 | 你还要写什么 |
|---|---|---|---|
| 运行时 | 状态、检查点、中断恢复、并行调度 | LangGraph、MAF Workflow、Temporal 类 durable 引擎 | 循环本身、工具、提示词 |
| 框架 | 模型调用、工具定义、一个现成的 Agent 循环 | LangChain、OpenAI Agents SDK、Pydantic AI、CrewAI、Google ADK | 持久化细节、权限、评测 |
| Harness | 一整套带工具、权限、上下文压缩、会话的成品 Agent | Claude Agent SDK、Deep Agents | 业务工具和策略 |
| 平台 | 画布编排、知识库、发布、托管 | Dify、Coze Studio、n8n | 节点配置,复杂逻辑写成代码节点 |
这个划分不严格,很多产品跨类:LangChain 的 create_agent 底层就是一张 LangGraph 图;Pydantic AI 自己不做持久化,交给 Temporal、DBOS 这类外部引擎。划分的用处在于:选了哪一类,其余几类的事要自己补。
下面这张图把平台、Harness、框架、运行时四类排在一起,每一类都标出了还要自己写的部分:
- 平台管画布、知识库和发布,复杂逻辑写成代码节点
- Harness 是带工具、权限、压缩的成品,你写业务工具和策略
- 框架给出现成的 Agent 循环,持久化、权限和评测自己补
- 运行时管状态、检查点和中断恢复,循环本身要你来写
- LangChain 的 create_agent 编译出来就是一张 LangGraph 图
- Pydantic AI 自己不做 durable,交给 Temporal、DBOS 这类引擎
六站
| 站 | 节点 | 讲哪些 | 一句话 |
|---|---|---|---|
| 1 | 智能体编排框架横评(1):LangChain 1.x | LangChain 1.x | 一个 create_agent 入口加中间件 |
| 2 | 智能体编排框架横评(2):LangGraph | LangGraph | 自己画状态图,节点、边、检查点、interrupt() |
| 3 | 智能体编排框架横评(3):厂商 Agent SDK | OpenAI Agents SDK、Claude Agent SDK、Google ADK、AWS Strands | 模型厂商自己出的 Agent 库 |
| 4 | 智能体编排框架横评(4):多智能体框架 | CrewAI、AutoGen、Microsoft Agent Framework | 以多 Agent 协作为主 |
| 5 | 智能体编排框架横评(5):轻量与类型化框架 | Pydantic AI、LlamaIndex Workflows、smolagents、Mastra | 抽象少,用类型、装饰器和普通函数 |
| 6 | 智能体编排框架横评(6):低代码与可视化平台 | Dify、Coze Studio、n8n,简述 Flowise、Langflow | 在画布上拖节点,平台负责运行 |
每站的写法相同:先讲这个框架是什么、怎么安装、第一个 Agent 怎么写;再讲基本概念;然后是报销例子和常见问题;最后是版本说明、和手写循环的对照、自测题。第一次接触 Agent 框架,建议从第 1 站读起。
同一个难点,各家怎么写:建单前停下来等人
报销例子里最能看出框架差别的一步,是建单前的员工确认。它涉及三件事:循环能不能在工具执行前停下,停下期间状态存在哪,恢复时会不会把前面的操作再做一遍。
下面这张图是报销流程的主干,标出了在哪一步停下来等员工确认:
- 员工提问,Agent 先查制度和发票
- 模型读到限额 80 元,判断要建特批单
- 建单会改外部系统,框架在调用前停下,等员工确认
- 员工确认后才真正建单
- 把单号回复给员工
停下等员工确认的细节:
- 模型提出调用 create_ticket,框架先把这次调用拦下
- 对话、参数和执行到哪一步都写下来,进程退出也不丢
- 前端拿到待确认的调用,展示给员工
- 员工点确认或拒绝,中间可能隔了很久
- 拒绝时不建单,拒绝的原因作为结果交还给模型
- 确认时用同一个会话编号恢复
- 从停下的位置继续,这次真正执行 create_ticket
建单的细节:
- 恢复时可能把建单这一步再跑一遍,所以先算幂等键
- 没建过,正常调用接口
- 建过,直接取已有单号,不会多出一张单
- 两条路得到的是同一个单号
| 框架 | 怎么停下 | 怎么继续 | 要留意的 |
|---|---|---|---|
| LangChain | HumanInTheLoopMiddleware 拦截指定工具 |
带上决定(批准、修改、拒绝)再调用一次 | 必须配 checkpointer |
| LangGraph | 节点里调 interrupt() |
Command(resume=...),同一个 thread_id |
被中断的节点会从头重跑 |
| OpenAI Agents SDK | 工具设 needs_approval |
对 result.interruptions 逐项批准或拒绝,再带着 RunState 运行 |
官方说明审批不保证恰好执行一次 |
| Claude Agent SDK | 权限规则加 can_use_tool 回调 |
回调直接返回允许或拒绝 | 被允许规则放行的调用不会进回调 |
| Google ADK | FunctionTool(require_confirmation=...) |
用约定名字的函数响应回传确认 | 部分会话服务不支持 |
| CrewAI | Flow 里的 @human_feedback |
从待处理状态恢复 | Task 的 human_input 拦不住单次工具调用 |
| Microsoft Agent Framework | 工具设 approval_mode="always_require" |
处理审批请求后继续 | 工作流状态在每一步结束时保存 |
| Pydantic AI | 工具设 requires_approval=True |
运行以待审批结果结束,带上审批结果再运行 | 消息历史要自己存 |
| LlamaIndex Workflows | ctx.wait_for_event 等人的回应 |
存下 Context,回来再恢复 | 默认不持久化 |
| Dify | Human Input 节点 | 员工在页面上点按钮选分支 | 含该节点的工作流不能被 Agent 节点调用 |
| n8n | 工具上的 Human review,或 Wait 节点 | 表单、Webhook 或 Slack 里批准 | 拒绝时模型会收到拒绝信息 |
各家做法其实一样:工具执行前发出一个"等人决定"的请求,把状态存下来,进程可以退出;拿到决定后从同一个位置接着跑。差别在状态存在哪、恢复时重跑多大一段、拒绝的结果怎么告诉模型。
恢复时重跑最容易出问题。LangGraph 恢复时整个节点重跑,LlamaIndex 会重放等待之前的代码,OpenAI 明说不保证恰好一次。所以不管用哪家,create_ticket 都要带幂等键,保证同一张单重复提交只建一次。这件事框架替你做不了,见 可靠执行:状态、幂等与恢复。
五个横切问题
除了停下来等人,各站还回答了同样几个问题:状态怎么存,多 Agent 怎么组织,怎么看运行过程,怎么接 MCP 工具。下面是结论,细节在各站正文里。
| 框架 | 状态与持久化 | 多 Agent | 可观测 | MCP |
|---|---|---|---|---|
| LangChain | 用 LangGraph 的 checkpointer 和 store | 子 Agent 包成工具、handoff、router | LangSmith 或 OTel | 内置 langchain.mcp |
| LangGraph | 每一步一份检查点,可回放、分叉 | 子图、Send 扇出、Command 交接 |
LangSmith 或 OTel | 通过 LangChain 适配 |
| OpenAI Agents SDK | Session 存历史,RunState 可序列化 |
handoff 或 Agent 当工具 | 追踪默认开启,发往 OpenAI | 托管 MCP 工具和本地 MCP |
| Claude Agent SDK | 会话自动写成 JSONL,可恢复、分叉 | 子代理,上下文隔离 | OTel | 自定义工具本身就是 MCP 工具 |
| Google ADK | SessionService 三种实现 | sub_agents、Agent 当工具;跨进程用 A2A |
OTel | McpToolset |
| CrewAI | Flow 的 @persist,默认 SQLite |
顺序或层级流程,Agent 间委派 | 内置追踪需平台账号,另有事件监听 | Agent 的 mcps 字段 |
| Microsoft Agent Framework | 工作流检查点 | 顺序、并发、handoff、群聊、Magentic 五种编排 | OTel,本地 DevUI | 支持 MCP 工具 |
| Pydantic AI | 默认不存,可接 Temporal、DBOS | Agent 当工具、pydantic-graph | Logfire 或 OTel | toolset 接入,也能当 MCP 服务器 |
| LlamaIndex Workflows | Context 可序列化,没有内置检查点 | 多个 workflow 组合 | 事件流和第三方集成 | 有适配包 |
| Dify | 平台存库 | Agent 节点、工作流当工具 | 内置日志,可接外部追踪 | 作为客户端只支持 HTTP;应用可发布为 MCP 服务器 |
| n8n | 执行数据入库 | 一个 AI Agent 当另一个的工具 | 执行列表可重跑,OTel | 客户端节点和服务端触发器 |
版本说明
这两年各框架变化很大,看旧教程时注意下面几点:
- LangChain 1.0(2025-10)只保留
create_agent一个高层入口,旧的 chains 和 AgentExecutor 移进了langchain-classic。 - Claude Code SDK 于 2025-09 改名 Claude Agent SDK;Google ADK 2.0 把运行时换成图引擎;OpenAI 的可视化 Agent Builder 已宣布弃用,迁移指向 Agents SDK。
- AutoGen 已归档,不再维护,迁移指向 Microsoft Agent Framework 1.0。
各家的方向也越来越接近:上层是模型驱动的循环,底层是能存检查点、能中断的图或工作流引擎;多 Agent 不再是默认选择,更常见的是把子 Agent 包成工具;几乎每家都支持 MCP。
怎么选
没有通用答案,按需求找起点:
- 业务人员也要改流程,需要可视化:智能体编排框架横评(6):低代码与可视化平台。先读许可证,再想好复杂逻辑和回归测试放在哪。
- 流程有固定的审批点、要跑很久、要能断点续跑:智能体编排框架横评(2):LangGraph,或 Microsoft Agent Framework 的 Workflow。
- 模型加几个工具,想少写代码:智能体编排框架横评(1):LangChain 1.x 的
create_agent,或第 5 站的 Pydantic AI。喜欢类型检查和依赖注入选后者。 - 模型厂商已经定了:智能体编排框架横评(3):厂商 Agent SDK 里对应的那家,能用上厂商的托管工具和追踪,以后换厂商会更费事。
- 要一个现成的、能读写文件和跑命令的 Agent:Claude Agent SDK 这类 harness,先读懂它的权限模型。
- TypeScript 技术栈:Mastra,或 LangChain.js、OpenAI Agents SDK 的 JS 版。
- 确实需要多个角色并行:先读 智能体编排框架横评(4):多智能体框架 的"报销要不要拆成三个 Agent"一节。
不管选哪个都要自己做的事
框架省下的是调模型、接工具、跑循环的代码。下面几件事每家都要自己定:
- 副作用要幂等。 中断恢复、重试都可能让工具再执行一次,见 可靠执行:状态、幂等与恢复。
- 权限放在工具层。 框架提供审批开关,但哪些工具要审批、谁有权批、被拒后怎么办,是业务规则,见 安全边界:让权限落到工具层。
- 评测。 框架能记录运行过程,但不判断结果对不对,回归测试集要自己建,见 Agent 评测:从测试集到发布门槛。
- 上下文长度。 长对话怎么压缩、工具结果怎么截断,有的框架给了中间件,取舍还是你的,见 计划、子代理与上下文预算。
怎么读
- 第一次学 Agent 框架:读完本文的基本概念,从第 1 站开始,每站先把"第一个 Agent"跑通,再看报销例子。
- 只想建立全局印象:读本文,再读第 2 站和第 3 站。第 2 站代表自己画图的路线,第 3 站代表模型驱动循环的路线,其他框架大多在两者之间。
- 准备面试:第 1、2 站对应最常被问的 LangChain 和 LangGraph;第 4 站的"报销要不要拆成三个 Agent"可以用来回答什么时候该用多 Agent。自测题先遮住答案自己讲。
- 要做选型:按上面的"怎么选"找到对应的站,重点看"常见问题"和"版本说明"。
- 想知道框架底下发生了什么:对照 跟读 learn-claude-code:17 个 harness 机制怎么挂到一个循环上 系列,每站的"和手写循环的对照"一节把两个系列连起来。
连接
- Agent 核心:面试版的框架问答,本系列是展开后的教程。
- Coding / Harness:框架和 Harness 的区分,本文的四类划分从这里出发。
- Agent 架构图解:从工作流到事件驱动工单:多 Agent 的架构模式图解,第 4 站讲这些模式在框架里怎么写。
- 跟读 learn-claude-code:17 个 harness 机制怎么挂到一个循环上:从零写 harness 的系列,和本系列互为对照。
- 人在回路:建单前确认的模式,本文的对照表列出它在十一种框架里的写法。
- 可靠执行:状态、幂等与恢复:中断恢复带来的重跑问题,要靠幂等解决。
- 主线:一个报销请求走完整个 Agent 系统:报销例子的来源。