Langchain Academy translated
  • module-0
    • LangChain 学院
  • module-1
    • 智能体记忆
    • 智能体
    • 链式结构
    • 部署
    • 路由器
    • 最简单的图结构
  • module-2
    • 支持消息摘要与外部数据库记忆的聊天机器人
    • 支持消息摘要的聊天机器人
    • 多模式架构
    • 状态归约器
    • 状态模式
    • 消息过滤与修剪
  • module-3
    • 断点
    • 动态断点
    • 编辑图状态
    • 流式处理
    • 时间回溯
  • module-4
    • 映射-归约
    • 并行节点执行
    • 研究助手
    • 子图
  • module-5
    • 记忆代理
    • 具备记忆功能的聊天机器人
    • 基于集合架构的聊天机器人
    • 支持个人资料架构的聊天机器人
  • module-6
    • 助手
    • 连接 LangGraph 平台部署
    • 创建部署
    • 双重消息处理
  • Search
  • Previous
  • Next
  • 最简单的图结构
    • 状态
    • 节点
    • 边(Edges)
    • 图结构构建
    • 图调用

在 Colab 中打开 在 LangChain Academy 中打开

最简单的图结构¶

让我们构建一个包含3个节点和1条条件边的简单图。

Screenshot 2024-08-20 at 3.11.22 PM.png

In [ ]:
Copied!
%%capture --no-stderr
%pip install --quiet -U langgraph
%%capture --no-stderr %pip install --quiet -U langgraph

状态¶

首先定义图的状态。

状态模式(State schema)将作为图中所有节点(Nodes)和边(Edges)的输入模式。

我们使用Python typing模块中的TypedDict类作为模式,该类可为键名提供类型提示。

In [2]:
Copied!
from typing_extensions import TypedDict

class State(TypedDict):
    graph_state: str
from typing_extensions import TypedDict class State(TypedDict): graph_state: str

节点¶

节点本质上就是 Python 函数。

第一个位置参数是前文定义的状态对象。

由于状态是符合上述模式的 TypedDict 类型,每个节点可以通过 state['graph_state'] 访问 graph_state 键值。

每个节点都会返回状态字典中 graph_state 键的新值。

默认情况下,每个节点返回的新值会覆盖先前的状态值。

In [4]:
Copied!
def node_1(state):
    print("---Node 1---")
    return {"graph_state": state['graph_state'] +" I am"}

def node_2(state):
    print("---Node 2---")
    return {"graph_state": state['graph_state'] +" happy!"}

def node_3(state):
    print("---Node 3---")
    return {"graph_state": state['graph_state'] +" sad!"}
def node_1(state): print("---Node 1---") return {"graph_state": state['graph_state'] +" I am"} def node_2(state): print("---Node 2---") return {"graph_state": state['graph_state'] +" happy!"} def node_3(state): print("---Node 3---") return {"graph_state": state['graph_state'] +" sad!"}

边(Edges)¶

边用于连接各个节点。

普通边(Normal Edges)适用于需要始终从某个节点(例如node_1)跳转到另一个节点(如node_2)的场景。

条件边则用于需要在节点间有条件路由的情况。

条件边通过函数实现,该函数基于特定逻辑返回下一个应访问的节点。

In [5]:
Copied!
import random
from typing import Literal

def decide_mood(state) -> Literal["node_2", "node_3"]:
    
    # Often, we will use state to decide on the next node to visit
    user_input = state['graph_state'] 
    
    # Here, let's just do a 50 / 50 split between nodes 2, 3
    if random.random() < 0.5:

        # 50% of the time, we return Node 2
        return "node_2"
    
    # 50% of the time, we return Node 3
    return "node_3"
import random from typing import Literal def decide_mood(state) -> Literal["node_2", "node_3"]: # Often, we will use state to decide on the next node to visit user_input = state['graph_state'] # Here, let's just do a 50 / 50 split between nodes 2, 3 if random.random() < 0.5: # 50% of the time, we return Node 2 return "node_2" # 50% of the time, we return Node 3 return "node_3"

图结构构建¶

现在,我们将基于上述定义的组件构建图结构。

StateGraph类是我们将使用的基础图类。

首先,使用之前定义的State类初始化一个StateGraph。

接着,添加节点和边。

我们使用START节点(特殊节点)来标识图的起点,该节点负责将用户输入传递至图中。

END节点是表示终止节点的特殊节点。

最后,我们编译图结构以执行基本的图结构检查。

该图结构可被可视化为Mermaid流程图。

In [6]:
Copied!
from IPython.display import Image, display
from langgraph.graph import StateGraph, START, END

# Build graph
builder = StateGraph(State)
builder.add_node("node_1", node_1)
builder.add_node("node_2", node_2)
builder.add_node("node_3", node_3)

# Logic
builder.add_edge(START, "node_1")
builder.add_conditional_edges("node_1", decide_mood)
builder.add_edge("node_2", END)
builder.add_edge("node_3", END)

# Add
graph = builder.compile()

# View
display(Image(graph.get_graph().draw_mermaid_png()))
from IPython.display import Image, display from langgraph.graph import StateGraph, START, END # Build graph builder = StateGraph(State) builder.add_node("node_1", node_1) builder.add_node("node_2", node_2) builder.add_node("node_3", node_3) # Logic builder.add_edge(START, "node_1") builder.add_conditional_edges("node_1", decide_mood) builder.add_edge("node_2", END) builder.add_edge("node_3", END) # Add graph = builder.compile() # View display(Image(graph.get_graph().draw_mermaid_png()))
No description has been provided for this image

图调用¶

编译后的图实现了runnable协议。

这为执行LangChain组件提供了标准方式。

invoke是该接口中的标准方法之一。

输入是一个字典{"graph_state": "Hi, this is lance."},用于设置图状态字典的初始值。

当调用invoke时,图会从START节点开始执行。

按照定义顺序依次通过各个节点(node_1、node_2、node_3)。

条件边将根据50/50的决策规则,从节点1跳转到节点2或3。

每个节点函数接收当前状态并返回新值,该值会覆盖原有图状态。

执行将持续进行,直到抵达END节点为止。

In [7]:
Copied!
graph.invoke({"graph_state" : "Hi, this is Lance."})
graph.invoke({"graph_state" : "Hi, this is Lance."})
---Node 1---
---Node 3---
Out[7]:
{'graph_state': 'Hi, this is Lance. I am sad!'}

invoke 会同步运行整个图结构。

它会等待每一步骤完成后再继续执行下一步。

在所有节点执行完毕后,该方法会返回图的最终状态。

在本例中,它返回的是 node_3 完成后的状态:

{'graph_state': 'Hi, this is Lance. I am sad!'}
In [ ]:
Copied!


Documentation built with MkDocs.

Search

From here you can search these documents. Enter your search terms below.

Keyboard Shortcuts

Keys Action
? Open this help
n Next page
p Previous page
s Search