和Langchain的区别,为什么要有langgraph?
- 链表和图的区别
- 单agent 和多agent
- Memory 和state的区别
维度 | LangChain | LangGraph |
---|---|---|
1. 设计哲学 | 链式(Chain):线性、顺序、无环 DAG | 图式(Graph):节点+边,可循环、可分支 |
2. 状态管理 | 依赖 Memory 组件,上下文有限,无全局持久化 | 内置中央 State,支持检查点持久化与断点续跑 |
3. 控制流 | 固定 A→B→C,条件逻辑需手动编码 | 条件边 + 循环边,LLM 可动态决定下一步 |
4. 并发能力 | 单线程/简单并行 | 原生支持并行节点,官方压测并发吞吐高 3 倍 |
5. 适用场景 | 问答机器人、固定流程的数据处理 | 多智能体协作、长时任务、需要反复决策的系统(如金融风控) |
6. 与 LLM 关系 | 直接调用 LLM,链内顺序组合 | 可把任意 LangChain Chain/Tool 作为节点复用 |
7. 使用体验 | 上手简单,API 直观 | 需理解图、状态、边,学习曲线略高 |
LangGraph 编排的原理是什么?
LangGraph 编排原理的 4 个核心要点,可拆解如下:
-
核心抽象 • 节点(Node):任何可执行单元------LLM、工具、API、子图------均封装为节点。 • 边(Edge):描述节点先后关系,支持固定边(A→B)与条件边(if-else 路由)。 • 状态(State):共享的 Pydantic 数据结构,在节点间传递并作为上下文与内存。 • 图(Graph):节点与边的组合,编译成可调用对象,对外暴露 invoke/stream 等接口。
-
运行时流程 • 初始化:用输入数据填充初始状态。 • 超步调度:引擎根据当前状态和边策略,选出就绪节点并行执行。 • 状态更新:节点执行后写回状态,并把更新后的状态沿出边发送。 • 终止判断:无就绪节点或满足终止条件时结束。
-
与 DAG(无环图) 的区别 • 支持任意有向图,不局限于无环结构。 • 允许循环执行,只要状态收敛即可安全终止。 • DAG 只是 LangGraph 的一个子集。
-
与 LangChain 的关系 • LangChain 的链是线性或简单分支结构,靠 Memory 维持上下文。 • LangGraph 把"链"泛化为任意图,用状态机式机制支持循环、并行、多 Agent 协作等复杂场景。
State是什么?
- 上下文容器 把对话历史、工具结果、用户变量等一切需要跨节点传递的信息,放进一个统一的 Pydantic/BaseModel 对象里。
- 消息总线 节点执行完只干两件事: • 读取当前 State • 返回对 State 的"补丁"(delta) 运行时引擎把这些补丁合并,形成新的 State,再沿着边发出去,供下游节点继续消费。
- 持久化锚点 通过 CheckpointSaver,State 可以被序列化到线程级存储;恢复时只需把上一步的 State 反序列化,就能从断点继续跑,实现长期记忆。
State 就是 LangGraph 的「内存+消息+快照」三合一的数据结构
Memory和State的区别
维度 | Memory(LangChain 语境) | State(LangGraph 语境) |
---|---|---|
1. 本质 | 一个记忆插件(对象/组件),封装了"如何保存/读取历史" | 一个数据容器(Pydantic/BaseModel),放在图的全局 Context 里,节点直接读/写 |
2. 作用范围 | 只能被所在链访问;跨链需手动传递 | 被整张图共享;任何节点都能访问同一实例 |
3. 生命周期 | 链执行完就结束;持久化需额外配置 | 可随检查点持久化到磁盘,线程重启后自动恢复 |
4. 数据形态 | 通常是"对话历史列表"或"向量检索器" | 任意字段(messages、变量、文件句柄、任务状态等) |
5. 使用方式 | 在 Chain 构造时传 memory= 参数 |
节点函数签名里直接声明 state: State 并返回 {"field": new_value} |
6. 可变性 | 由 Memory 类内部控制,外部只读 | 每个节点可直接修改字段,引擎合并补丁 |
7. 与并发关系 | 链内通常是顺序执行,无需并发保护 | 图支持并行节点,State 由引擎做冲突合并 |
两种架构中Memory 是如何实现的?
维度 | LangChain | LangGraph |
---|---|---|
1. 设计哲学 | 链式(Chain):线性、顺序、无环 DAG | 图式(Graph):节点+边,可循环、可分支 |
2. 状态管理 | 依赖 Memory 组件,上下文有限,无全局持久化 | 内置中央 State,支持检查点持久化与断点续跑 |
3. 控制流 | 固定 A→B→C,条件逻辑需手动编码 | 条件边 + 循环边,LLM 可动态决定下一步 |
4. 并发能力 | 单线程/简单并行 | 原生支持并行节点,官方压测并发吞吐高 3 倍 |
5. 适用场景 | 问答机器人、固定流程的数据处理 | 多智能体协作、长时任务、需要反复决策的系统(如金融风控) |
6. 与 LLM 关系 | 直接调用 LLM,链内顺序组合 | 可把任意 LangChain Chain/Tool 作为节点复用 |
7. 使用体验 | 上手简单,API 直观 | 需理解图、状态、边,学习曲线略高 |
State和Memory的区别
维度 | Memory(LangChain 语境) | State(LangGraph 语境) |
---|---|---|
1. 本质 | 一个记忆插件(对象/组件),封装了"如何保存/读取历史" | 一个数据容器(Pydantic/BaseModel),放在图的全局 Context 里,节点直接读/写 |
2. 作用范围 | 只能被所在链访问;跨链需手动传递 | 被整张图共享;任何节点都能访问同一实例 |
3. 生命周期 | 链执行完就结束;持久化需额外配置 | 可随检查点持久化到磁盘,线程重启后自动恢复 |
4. 数据形态 | 通常是"对话历史列表"或"向量检索器" | 任意字段(messages、变量、文件句柄、任务状态等) |
5. 使用方式 | 在 Chain 构造时传 memory= 参数 |
节点函数签名里直接声明 state: State 并返回 {"field": new_value} |
6. 可变性 | 由 Memory 类内部控制,外部只读 | 每个节点可直接修改字段,引擎合并补丁 |
7. 与并发关系 | 链内通常是顺序执行,无需并发保护 | 图支持并行节点,State 由引擎做冲突合并 |