LangGraph 原理和简单demo
背景和价值
langchain的不足:
langchain 特点,构造有向无环图。 当流程很长而且要形成环的时候代码写起来很冗长。 比如 p1|p12|p3|p4 如果又回到p1|p2
顾名思义,LangGraph 在图这个概念上有很大的侧重,它的出现就是要解决线性序列的局限性问题,而解决的方法就是循环图,即支持分支和循环。在LangGraph框架中,用图来管理代理的生命周期并在其状态内将暂存器作为消息进行跟踪,增加了以循环方式跨各种计算步骤协调多个链或参与者的功能。这就与 LangChain 将代理视为可以附加工具和插入某些提示的对象不同,对于图来说,意味着我们可以从任何可运行的功能或代理或链作为一个程序的起点。
从LangGraph官方的定义看,该框架是一个用于使用大模型构建有状态、多参与者应用程序的库,可以创建代理和多代理工作流程。而其官方自己总结的LangGraph的优势则是:
循环和分支:在应用程序中实现循环和条件。
持久性:在图中的每个步骤之后自动保存状态。随时暂停和恢复图形执行,以支持错误恢复、人机交互工作流程等。
人机交互:中断图形执行以批准或编辑代理计划的下一个操作。
流支持:流输出由每个节点生成(包括令牌流)。
与 LangChain 集成:LangGraph 与LangChain和LangSmith无缝集成(但不需要它们)。
LangGraph 数据结构

业务概念
边:
【我的理解】控制node扭转
Edges(边)用来定义逻辑如何路由以及图何时开始与停止。这是代理工作以及不同节点如何相互通信的重要组成部分。有几种关键的边类型:
普通边:直接从一个节点到下一个节点(固定从一个节点到另外一个节点)。
条件边:调用函数来确定下一个要转到的节点。(一个节点到多个节点需要通过条件判断)
入口点:当用户输入到达时首先调用哪个节点。
条件入口点:调用函数来确定当用户输入到达时首先调用哪个节点。
同样,我们先看普通边。如果直接想从节点A到节点B,可以直接使用add_edge方法。注意:LangGraph有两个特殊的节点:START和END。START表示将用户输入发送到图的节点。使用该节点的主要目的是确定应该首先调用哪些节点。END节点是代表终端节点的特殊节点。当想要指示哪些边完成后没有任何操作时,将使用该节点。因此,一个完整的图就可以使用如下代码进行定义:
State: 状态,通过state在智能体内传递消息
通过 TypedDict限定state类型
state类型 多种用法
https://www.cnblogs.com/aibi1/p/18810135
Node(节点)
【能力的抽象,是一个函数】
Our graph can now handle two key tasks:
Each node can receive the current State as input and output an update to the state.
Updates to messages will be appended to the existing list rather than overwriting it, thanks to the prebuilt add_messages function used with the Annotated syntax.
在 LangGraph 中,节点是一个 python 函数(sync 或async ),接收当前State作为输入,执行自定义的计算,并返回更新的State。所以其中第一个位置参数是state 。
简单的讲,节点是业务逻辑的代码
End: 流程结束
开发流程
1 定义图的模式
定义图状态的结构。这是用于定义和验证图中节点处理的状态数据的模式。
简单的讲就是定义输入和输出的数据类型
2 构建节点
3 构建边
指定开始和结束节点的 名字
4 编译
参考代码
from langgraph.graph import StateGraph
from typing_extensions import TypedDict
# 定义输入的模式
class InputState(TypedDict):
question: str
# 定义输出的模式
class OutputState(TypedDict):
answer: str
# 将 InputState 和 OutputState 这两个 TypedDict 类型合并成一个字典类型。
class OverallState(InputState, OutputState):
pass
# 明确指定它的输入和输出数据的结构或模式
# 类型字典(TypedDict)的多重继承 和 空类语法,其作用是通过组合多个 TypedDict 类型来创建新的复合类型。以下是逐层解析:
# 等价于 class OverallState:
# question: str
# answer: int
builder = StateGraph(OverallState, input=InputState, output=OutputState)
def agent_node(state:InputState):
print("我是一个AI Agent。")
return
def action_node(state:InputState):
print("我现在是一个执行者。")
return {"answer":"我现在执行成功了"}
builder.add_node("agent_node", agent_node)
builder.add_node("action_node", action_node)
from langgraph.graph import START, END
builder.add_edge(START, "agent_node")
builder.add_edge("agent_node", "action_node")
builder.add_edge("action_node", END)
graph = builder.compile()
graph.invoke({"question":"hello,你好"})
参考资料
https://langchain-ai.github.io/langgraph/?_gl=1se9sv7_gcl_auMjA5NDI5ODYxOC4xNzQ5MTMwNzY3_gaMTMyNzEwMzgyOS4xNzQxOTE3MjAx_ga_47WX3HKKY2*czE3NDk5NjA0NjgkbzIkZzAkdDE3NDk5NjA0NjgkajYwJGwwJGgw#get-started

浙公网安备 33010602011771号