← 回到知识图谱
文章持续完善

智能体编排框架横评:同一个报销 Agent 换六种写法

本文总结从 Agent 循环、工具调用、状态、检查点、中断这几个基本概念讲起,再用同一个报销例子走过 LangChain、LangGraph、厂商 SDK、多智能体框架、轻量框架和低代码平台,每站都从安装和第一个 Agent 开始。

创建 2026-11-05更新 2026-11-06阅读约 15 分钟
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、框架、运行时四类排在一起,每一类都标出了还要自己写的部分:

四层各管什么,剩下的要自己写可缩放的动画图,启用 JavaScript 后可以播放和放大。
  1. 平台管画布、知识库和发布,复杂逻辑写成代码节点
  2. Harness 是带工具、权限、压缩的成品,你写业务工具和策略
  3. 框架给出现成的 Agent 循环,持久化、权限和评测自己补
  4. 运行时管状态、检查点和中断恢复,循环本身要你来写
  5. LangChain 的 create_agent 编译出来就是一张 LangGraph 图
  6. 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 站读起。

同一个难点,各家怎么写:建单前停下来等人

报销例子里最能看出框架差别的一步,是建单前的员工确认。它涉及三件事:循环能不能在工具执行前停下,停下期间状态存在哪,恢复时会不会把前面的操作再做一遍。

下面这张图是报销流程的主干,标出了在哪一步停下来等员工确认:

建单前停下来等人:总览和细节可缩放的动画图,启用 JavaScript 后可以播放和放大。
  1. 员工提问,Agent 先查制度和发票
  2. 模型读到限额 80 元,判断要建特批单
  3. 建单会改外部系统,框架在调用前停下,等员工确认
  4. 员工确认后才真正建单
  5. 把单号回复给员工

停下等员工确认的细节:

  1. 模型提出调用 create_ticket,框架先把这次调用拦下
  2. 对话、参数和执行到哪一步都写下来,进程退出也不丢
  3. 前端拿到待确认的调用,展示给员工
  4. 员工点确认或拒绝,中间可能隔了很久
  5. 拒绝时不建单,拒绝的原因作为结果交还给模型
  6. 确认时用同一个会话编号恢复
  7. 从停下的位置继续,这次真正执行 create_ticket

建单的细节:

  1. 恢复时可能把建单这一步再跑一遍,所以先算幂等键
  2. 没建过,正常调用接口
  3. 建过,直接取已有单号,不会多出一张单
  4. 两条路得到的是同一个单号
框架 怎么停下 怎么继续 要留意的
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。

怎么选

没有通用答案,按需求找起点:

不管选哪个都要自己做的事

框架省下的是调模型、接工具、跑循环的代码。下面几件事每家都要自己定:

怎么读

  • 第一次学 Agent 框架:读完本文的基本概念,从第 1 站开始,每站先把"第一个 Agent"跑通,再看报销例子。
  • 只想建立全局印象:读本文,再读第 2 站和第 3 站。第 2 站代表自己画图的路线,第 3 站代表模型驱动循环的路线,其他框架大多在两者之间。
  • 准备面试:第 1、2 站对应最常被问的 LangChain 和 LangGraph;第 4 站的"报销要不要拆成三个 Agent"可以用来回答什么时候该用多 Agent。自测题先遮住答案自己讲。
  • 要做选型:按上面的"怎么选"找到对应的站,重点看"常见问题"和"版本说明"。
  • 想知道框架底下发生了什么:对照 跟读 learn-claude-code:17 个 harness 机制怎么挂到一个循环上 系列,每站的"和手写循环的对照"一节把两个系列连起来。

连接

这是一篇可以继续生长的笔记。沿着关系继续阅读 ↗