LangGraph

LangGraph文档总结

LangChain仅支持有向无环图(DAG)形式的工作流,然而在较为复杂的LLM应用里,常见的模式是在执行流程中引入循环。

在循环过程中,由LLM推理下一步的行动。从本质上讲,这就好比在for循环中运行大语言模型(LLM)。这类系统通常被称为代理(agent)。
eg: 在简易的检索增强生成(RAG)应用程序中,会调用检索器来获取一些文档,随后这些文档会被传递给大语言模型(LLM),以生成最终答案。通常来说,这种方式是有效的。不过,一旦第一个检索步骤没能返回任何有用结果,整个流程就会出现问题。在这种情况下,如果大语言模型能够判断检索器返回的结果不佳,进而向检索器发出第二个(更精准的)查询请求,并使用新的查询结果,那就再好不过了。从本质上讲,在循环中运行大语言模型有助于开发出更灵活的应用程序,使其能够处理那些可能未预先设定的、更模糊的应用场景。

虽然这个模式简单,但却前景很大。基本形式为有两个步骤的循环:

  1. 调用LLM以确定(a)要采取什么操作,或(b)给用户什么响应
  2. 采取给定的行动,并返回步骤1

重复这两个步骤,直到生成最终响应。(ReAct模式)

由图构建的状态机具有循环的能力,允许处理比简单链更模糊的输入。

graph TD;
    开始 --> 初始化StateGraph传入状态定义;
    初始化StateGraph传入状态定义 --> 添加节点;
    添加节点 --> 添加边;
    添加边 --> 编译;
    编译 --> 得到可运行对象;
    添加节点 --> 特殊END节点表示图结束;

    subgraph 节点详情
        添加节点 --> 节点name为引用字符串;
        添加节点 --> 节点value为函数或LCEL可运行对象;
        节点value为函数或LCEL可运行对象 --> 接受State对象形式字典输入;
        接受State对象形式字典输入 --> 输出包含要更新的State对象键的字典;
    end

    subgraph 边详情
        添加边 --> 起点边;
        添加边 --> 法向边缘;
        添加边 --> 条件边;
        条件边 --> 传入上游节点;
        条件边 --> 传入判断函数返回字符串;
        条件边 --> 传入映射;
    end

    subgraph 状态定义与更新
        初始化StateGraph传入状态定义 --> 状态定义表示中心状态对象;
        状态定义表示中心状态对象 --> 状态由节点更新以键值存储形式;
        状态由节点更新以键值存储形式 --> 属性更新方式1完全覆盖;
        状态由节点更新以键值存储形式 --> 属性更新方式2添加值;
    end

    subgraph 代理执行者
        得到可运行对象 --> 重新创建LangChainAgentExecutor;
        重新创建LangChainAgentExecutor --> 可修改内部结构;
        可修改内部结构 --> 默认状态包含input等概念;
    end

    起点边 --> 示例graphset_entry_pointmodel;
    法向边缘 --> 示例graphadd_edgetools_model;
    条件边 --> 示例graphadd_conditional_edgemodel_should_continue_end_END_continue_tools;
    属性更新方式1完全覆盖 --> 用于希望节点返回属性新值的情况;
    属性更新方式2添加值 --> 用于属性为操作列表且希望添加新操作的情况;

1. 什么是LangGraph?

LangGraph是由LangChain公司开发的一个库,用于构建基于大型语言模型(LLM)的有状态多主体应用程序,特别适用于创建智能体(Agent)和多智能体工作流。LangGraph的设计灵感来自于Pregel和Apache Beam,其公共接口借鉴了NetworkX。

LangGraph能够让开发者构建具有循环功能的计算图,这在传统的链式结构(Chain)或有向无环图(DAG)中是无法实现的。通过LangGraph,开发者可以创建更加灵活、动态的智能体系统,能够处理更复杂的任务流程。

2. 核心概念

2.1 状态图(StateGraph)

LangGraph的核心是StateGraph类,用于表示整个图结构。初始化时需要定义一个状态对象,这个状态对象会随着图的执行而更新。

2.2 节点(Nodes)

节点是图中的处理单元,可以是函数或LangChain的可运行组件。节点接收状态对象作为输入,并返回要更新的状态属性。

2.3 边(Edges)

边定义了节点之间的执行流程和数据流向。有两种类型的边:

  • 普通边:固定的流向
  • 条件边:基于节点输出的条件决定下一步去向

2.4 状态(State)

状态是在图执行过程中维护的中央数据对象。状态的属性可以通过两种方式更新:

  • 完全覆盖:节点返回一个新值来替换原属性
  • 添加:节点返回值会被添加到现有属性(适用于列表等)

2.5 循环(Cycles)

LangGraph的一个重要特性是能够创建循环流程,允许LLM在循环中进行推理决策,这对于构建智能体系统至关重要。

3. LangGraph与传统工作流的区别

传统的工作流通常是有向无环图(DAG),数据只能向前流动,不能回到之前的节点。而LangGraph支持循环,允许在需要时返回到之前的节点,这对于构建需要反复推理和决策的智能体至关重要。

4. 智能体架构

LangGraph支持多种智能体架构:

  • 单一智能体
  • 多智能体系统
  • 分层智能体
  • 顺序智能体

这些架构可以根据任务需求进行组合和定制。

5. LangGraph Platform

LangGraph Platform是一个商业解决方案,用于将LangGraph应用部署到生产环境。它包含以下组件:

  • LangGraph Server(API)
  • LangGraph SDK(客户端)
  • LangGraph CLI(命令行工具)
  • LangGraph Studio(UI/调试器)

LangGraph Platform解决了复杂部署中的常见问题,如流式传输支持、后台运行、长时间运行的智能体支持等。

6. 使用流程图示

以下是使用Mermaid语法描述的LangGraph主要工作流程:

graph TD A[初始化StateGraph] --> B[定义状态结构] B --> C[添加节点] C --> D[定义边和转换条件] D --> E[编译图] E --> F[执行图] %% 节点详情 subgraph 定义状态 B1[定义状态类TypedDict] --> B2[定义状态属性更新方式] end subgraph 节点类型 C1[函数节点] C2[LLM节点] C3[工具节点] end subgraph 边类型 D1[普通边] D2[条件边] end %% 循环示例 F -->|条件判断| G{状态检查} G -->|继续执行| C G -->|完成| H[结束]

7. 智能体状态机示例

以下是使用Mermaid描述的智能体状态机流程:

stateDiagram-v2 [*] --> 初始化 初始化 --> 执行智能体 执行智能体 --> 解析用户输入 解析用户输入 --> 决策 决策 --> 使用工具 决策 --> 生成响应 使用工具 --> 工具执行 工具执行 --> 解析工具结果 解析工具结果 --> 决策 生成响应 --> [*] state 决策 { [*] --> 分析状态 分析状态 --> 选择行动 选择行动 --> [*] }

8. RAG增强智能体流程

以下是使用Mermaid描述的检索增强生成(RAG)智能体流程:

graph TD START([开始]) --> 检索文档 检索文档 --> 评估文档 评估文档 --> 判断{文档相关性} 判断 -->|相关| 生成回答 判断 -->|不相关| 重写问题 重写问题 --> 检索文档 生成回答 --> END([结束])

9. LangGraph关键优势

  1. 内存管理:LangGraph持久化应用程序状态的任意方面,支持对话和更新的记忆
  2. 人机协作:状态检查点允许执行中断和恢复,可在关键阶段通过人工输入进行决策和修正
  3. 可控流程:开发者可以精确控制智能体的流程和状态
  4. 流式传输支持:支持从图节点进行流式更新和LLM调用的流式输出
  5. 可扩展性:支持复杂的多智能体系统和分层决策架构

10. 应用场景

  1. 复杂对话系统
  2. 多步骤任务自动化
  3. 需要反复推理的问题解决
  4. 需要工具使用的智能体
  5. 多智能体协作系统

通过LangGraph,开发者可以构建更加灵活、可控的智能体系统,处理复杂的任务流程,并将其部署到生产环境中。

posted @ 2025-03-18 16:11  economies  阅读(1135)  评论(0)    收藏  举报