LangChain 82 LangGraph 从入门到精通四

本文详细介绍了LangChain中的StateGraphAPI,包括如何使用`StateGraph`类构建图,节点和边的操作,如添加、条件边和设置起终点。通过实例展示如何使用类型化字典和注解进行状态模式定义,以及如何在实际应用中编译和调用图函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LangChain系列文章

  1. LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)
  2. LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)
  3. LangChain 62 深入理解LangChain 表达式语言25 agents代理 LangChain Expression Language (LCEL)
  4. LangChain 63 深入理解LangChain 表达式语言26 生成代码code并执行 LangChain Expression Language (LCEL)
  5. LangChain 64 深入理解LangChain 表达式语言27 添加审查 Moderation LangChain Expression Language (LCEL)
  6. LangChain 65 深入理解LangChain 表达式语言28 余弦相似度Router Moderation LangChain Expression Language (LCEL)
  7. LangChain 66 深入理解LangChain 表达式语言29 管理prompt提示窗口大小 LangChain Expression Language (LCEL)
  8. LangChain 67 深入理解LangChain 表达式语言30 调用tools搜索引擎 LangChain Expression Language (LCEL)
  9. LangChain 68 LLM Deployment大语言模型部署方案
  10. LangChain 69 向量数据库Pinecone入门
  11. LangChain 70 Evaluation 评估、衡量在多样化数据上的性能和完整性
  12. LangChain 71 字符串评估器String Evaluation衡量在多样化数据上的性能和完整性
  13. LangChain 72 reference改变结果 字符串评估器String Evaluation
  14. LangChain 73 给结果和参考评分 Scoring Evaluator
  15. LangChain 74 有用的或者有害的helpful or harmful Scoring Evaluator
  16. LangChain 75 打造你自己的OpenAI + LangChain网页应用
  17. LangChain 76 LangSmith 从入门到精通一
  18. LangChain 77 LangSmith 从入门到精通二
  19. LangChain 78 LangSmith 从入门到精通三
  20. LangChain 79 LangGraph 从入门到精通一
  21. LangChain 80 LangGraph 从入门到精通二
  22. LangChain 81 LangGraph 从入门到精通三

在这里插入图片描述

有几个新的API可以使用。

1.StateGraph

主要入口点是StateGraph

from langgraph.graph import StateGraph

这个类负责构建图。它提供了一个受NetworkX启发的接口。这个图由一个状态对象参数化,它传递给每个节点。

1.1 __init__

    def __init__(self, schema: Type[Any]) -> None:

在构建图表时,您需要传入一个状态模式。然后,每个节点都会返回操作以更新该状态。这些操作可以是在状态上设置特定属性(例如,覆盖现有值),也可以是向现有属性添加内容。是设置还是添加是通过注释您用于构建图表的状态对象来表示的。

指定模式的推荐方法是使用类型化字典:from typing import TypedDict

然后,您可以使用 from typing import Annotated 注释不同的属性。目前,唯一支持的注释是 import operator; operator.add。此注释将使得任何返回此属性的节点将新结果添加到现有值中。

让我们看一个例子:

from typing import TypedDict, Annotated, Union
from langchain_core.agents import AgentAction, AgentFinish
import operator


class AgentState(TypedDict):
   # The input string
   input: str
   # The outcome of a given call to the agent
   # Needs `None` as a valid type, since this is what this will start as
   agent_outcome: Union[AgentAction, AgentFinish, None]
   # List of actions and corresponding observations
   # Here we annotate this with `operator.add` to indicate that operations to
   # this state should be ADDED to the existing values (not overwrite it)
   intermediate_steps: Annotated[list[tuple[AgentAction, str]], operator.add]

我们可以像这样使用:

# Initialize the StateGraph with this state
graph = StateGraph(AgentState)
# Create nodes and edges
...
# Compile the graph
app = graph.compile()

# The inputs should be a dictionary, because the state is a TypedDict
inputs = {
   # Let's assume this the input
   "input": "hi"
   # Let's assume agent_outcome is set by the graph as some point
   # It doesn't need to be provided, and it will be None by default
   # Let's assume `intermediate_steps` is built up over time by the graph
   # It doesn't need to provided, and it will be empty list by default
   # The reason `intermediate_steps` is an empty list and not `None` is because
   # it's annotated with `operator.add`
}

1.2 .add_node

    def add_node(self, key: str, action: RunnableLike) -> None:

这种方法向图中添加一个节点。它接受两个参数:

  • key: 一个表示节点名称的字符串。这个名称必须是唯一的。
  • action: 当调用该节点时要执行的操作。这应该是一个函数或可运行的。

1.3 .add_conditional_edges

    def add_conditional_edges(
        self,
        start_key: str,
        condition: Callable[..., str],
        conditional_edge_mapping: Dict[str, str],
    ) -> None:

这种方法添加了条件边缘。这意味着只会选择一个下游边缘,取决于起始节点的结果。这需要三个参数:

  • start_key:表示起始节点名称的字符串。该键必须已在图表中注册过。
  • condition:要调用以决定接下来要做什么的函数。输入将是起始节点的输出。它应返回一个存在于conditional_edge_mapping中并表示要采取的边缘的字符串。
  • conditional_edge_mapping:字符串到字符串的映射。键应该是条件可能返回的字符串。值应该是如果返回该条件则调用的下游节点。

1.4 set_entry_point

    def set_entry_point(self, key: str) -> None:

图的入口点。这是首先调用的节点。它只需要一个参数:

  • key:应首先调用的节点的名称。

1.5 .set_finish_point

    def set_finish_point(self, key: str) -> None:

这是图的出口点。当调用此节点时,结果将是图的最终结果。它只有一个参数:

  • key:调用时将返回其调用结果作为最终输出的节点名称

注意:如果在任何时候您之前创建了通向END的边缘(条件或正常),则不需要调用此节点。

代码

https://github.com/zgpeace/pets-name-langchain/tree/develop

参考

https://python.langchain.com/docs/langsmith/walkthrough

<think>我们正在讨论LangChainLangGraph之间的关系。根据引用[1]和引用[2]的内容,我们可以总结如下:1.**LangGraph是建立在LangChain之上的**:引用[1]明确指出“LangGraph建立在LangChain的基础上”,这意味着LangGraph利用LangChain的组件(如模型、提示、工具等)来构建更复杂的Agent系统。2.**设计目标不同**:-**LangChain**:专注于链式结构(Chains),适合线性任务流程,例如文档摘要、问答系统等[^2]。-**LangGraph**:专注于图结构(Graph),支持非线性、多路径的控制流,包括条件判断、循环、分支和中断,适合复杂的多智能体协作任务[^2]。3.**核心能力差异**:-**LangChain**:提供模块化组件(模型、提示、索引、记忆、链、工具等),通过组合这些组件构建应用程序[^1]。-**LangGraph**:在LangChain的基础上增加了图计算能力,支持定义多个智能体节点,并通过边来协调它们的交互,实现动态路由和条件执行[^2]。4.**适用场景**:-简单线性任务:使用LangChain(例如:LLMChain顺序调用)[^2]。-复杂非线性任务:使用LangGraph(例如:智能客服系统需要根据用户输入动态切换工具或调用多个Agent)[^2]。5.**可视化支持**:LangGraph提供LangGraphStudio,为开发Agent提供可视化环境[^1]。**关系总结**:-**继承关系**:LangGraphLangChain的扩展,两者共享基础组件(如模型、工具等)。-**互补性**:LangChain解决基础任务编排,LangGraph解决高阶Agent协作问题。-**演进关系**:LangGraph解决了LangChain在处理循环、分支等复杂控制流时的局限性[^1]。**数学表达**:-LangChain链式结构可表示为函数组合:$$\text{Chain}=f_n\circ\cdots\circf_1$$其中$f_i$代表一个处理步骤(如提示模板、模型调用)。-LangGraph图结构可表示为状态机:$$\text{Graph}=(V,E)\quad\text{其中}\quadV=\{\text{节点}\},E=\{\text{边}\}$$节点对应处理函数,边由条件函数$c:\text{state}\rightarrow\text{next\_node}$决定[^2]。**架构对比**:|**特性**|LangChain|LangGraph||----------------|-------------------|---------------------||**结构**|链式结构|图结构||**控制流**|线性顺序|非线性(循环/分支)||**智能体支持**|单智能体|多智能体协作||**复杂度**|低至中等|高||**基础依赖**|无|LangChain组件|>**关键结论**:LangGraph不是替代LangChain,而是为其复杂Agent场景提供增强层。两者共同构成从简单到复杂应用的完整解决方案[^1][^2]。---###相关问题1.在LangGraph中如何定义条件分支来控制任务流程?2.LangChainLangGraph在实时数据处理方面的性能差异?3.如何将现有的LangChain链迁移到LangGraph图结构?4.LangGraph的多智能体协作机制具体如何实现?5.使用LangGraphStudio进行可视化开发有哪些最佳实践?</think>### LangChainLangGraph 的关系详解 LangChainLangGraph 是紧密关联但定位不同的框架,核心区别在于**架构范式**和**适用场景**。以下是关键对比: --- #### 一、核心联系:继承与互补 1. **基础依赖** - LangGraph **直接构建在 LangChain 之上**,复用其核心组件(模型、提示、工具、记忆等)[^1]。 - 两者共享生态系统,例如 LangGraph 可直接调用 LangChain 的 `AgentExecutor` 或 `Runnable` 接口[^2]。 2. **目标一致性** 均致力于**简化大语言模型(LLM)应用的开发流程**,提供模块化工具链,但解决不同层级的复杂度问题。 --- #### 二、核心区别:架构与能力 | **维度** | **LangChain** | **LangGraph** | |----------------|------------------------------|------------------------------| | **架构范式** | 链式结构(Chain) | 图结构(Graph) | | **控制流** | 线性顺序执行 | 非线性流程(循环/分支/中断) | | **任务复杂度** | 简单到中等(如问答、摘要) | 高复杂度(如多智能体协作) | | **节点关系** | 固定顺序调用 | 动态路由(条件边权重决策) | | **典型场景** | `LLMChain`、`SequentialChain` | 客服系统、多Agent决策引擎 | ##### 数学表达差异 - **LangChain 链式结构**: $$ \text{Output} = f_n \circ \cdots \circ f_2 \circ f_1(\text{Input}) $$ 其中 $f_i$ 代表固定步骤(如模型调用、工具执行)[^1]。 - **LangGraph 图结构**: $$ \text{Graph} = (V, E), \quad V=\{\text{节点}\}, \quad E=\{\text{边}| \ \text{条件函数 } c: \text{state} \rightarrow \text{next\_node}\} $$ 节点代表任务单元,边由状态机条件动态激活[^2]。 --- #### 三、LangGraphLangChain 的增强 1. **突破链式局限** - 解决 LangChain 难以处理的**循环、中断、并行分支**问题(如用户中途修改需求)[^1]。 - 示例场景: ```mermaid graph LR A[用户提问] --> B{是否需要查数据库?} B -->|是| C[调用SQL工具] B -->|否| D[直接生成答案] C --> E{结果可信?} E -->|否| F[调用搜索引擎] E -->|是| D ``` 2. **多智能体协作** - LangGraph 可定义多个独立 Agent 节点,通过**消息传递机制**协调工作流[^2]。 - 例如:客服系统中路由节点将“技术问题”分配给专用 Agent。 3. **可视化开发** 提供 **LangGraph Studio** 可视化编辑图节点和调试状态流,降低复杂逻辑的实现门槛[^1]。 --- #### 、如何选择? | **场景** | **推荐框架** | **原因** | |------------------------------|--------------|------------------------------| | 文档摘要/简单问答 | LangChain | 链式结构足够高效 | | 需动态调整流程的客服系统 | LangGraph | 处理分支、循环和异常中断 | | 多Agent协作(如自动决策团队)| LangGraph | 协调多个智能体的输入/输出 | > **关键结论**: > - LangChain 是**基础框架**,适合大多数常规 LLM 应用; > - LangGraph 是**进阶工具**,专为复杂控制流和多智能体系统设计[^1][^2]。 --- ### 相关问题 1. 如何在 LangGraph 中实现“当工具调用失败时自动切换备用工具”的分支逻辑? 2. LangGraph 的多智能体协作机制具体如何降低任务延迟? 3. 能否将现有的 LangChain 链式工作流迁移到 LangGraph?需要哪些改造? 4. LangGraph Studio 在调试复杂状态机时有哪些独特优势? 5. 对比 LangGraph 与传统工作流引擎(如 Airflow)在处理 LLM 任务时的差异?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值