智能体课程文档

LangGraph 的构建模块

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

LangGraph 的构建模块

要使用 LangGraph 构建应用程序,您需要了解其核心组件。让我们探索构成 LangGraph 应用程序的基本构建模块。

Building Blocks

LangGraph 中的应用程序从一个入口点开始,根据执行情况,流程可能会进入一个函数或另一个函数,直到到达END。

Application

1. 状态

状态(State)是 LangGraph 的核心概念。它表示流经您应用程序的所有信息。

from typing_extensions import TypedDict

class State(TypedDict):
    graph_state: str

状态是用户定义的,因此字段应精心设计,以包含决策过程所需的所有数据!

💡 提示:仔细思考您的应用程序需要在步骤之间跟踪哪些信息。

2. 节点

节点(Nodes)是 Python 函数。每个节点:

  • 将状态作为输入
  • 执行一些操作
  • 返回状态的更新
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!"}

例如,节点可以包含:

  • LLM 调用:生成文本或做出决策
  • 工具调用:与外部系统交互
  • 条件逻辑:确定后续步骤
  • 人工干预:从用户获取输入

💡 信息:一些整个工作流所需的节点,如 START 和 END,直接从 LangGraph 中存在。

3. 边

边(Edges)连接节点并定义通过图的可能路径

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"

边可以是:

  • 直接的:始终从节点 A 到节点 B
  • 有条件的:根据当前状态选择下一个节点

4. 状态图

状态图(StateGraph)是包含您整个代理工作流的容器

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()))
Graph Visualization

但最重要的是,可以调用

graph.invoke({"graph_state" : "Hi, this is Lance."})

输出

---Node 1---
---Node 3---
{'graph_state': 'Hi, this is Lance. I am sad!'}

接下来是什么?

在下一节中,我们将通过构建我们的第一个图来实践这些概念。该图允许 Alfred 接收您的电子邮件,对其进行分类,如果它们是真实的,则起草一份初步回复。

< > 在 GitHub 上更新