跳至主要內容

LangGraph基础

pptg大约 2 分钟

LangChain带来了很多AI方面的基础模块,并且也提供了一些预构建的Agent。然而在复杂、动态的调度上,还是需要自己去手动组装。LangGraph的出现,图构建的方式解决了这个问题。

主要模块

LangGraph的主要模块是GraphNodeStateEdgeCheckPoint

核心概念核心指责说明
图 (Graph)定义工作流的整体骨架和流转逻辑像绘制业务流程图,规定了所有步骤和步骤间的走向
节点 (Node)承载工作流中的具体任务和业务逻辑流程图中的每个具体操作步骤,如审批、调用API
状态 (State)在节点间共享和传递数据与上下文一个在所有步骤间流转的共享文件夹,每个步骤都能读取或写入信息
边 (Edge)根据条件决定工作流的执行路径流程图中的箭头线,可以根据条件决定下一步是A还是B
检查点 (Checkpoint)实现工作流的持久化、中断恢复和可观测性执行过程中的存档,异常或者用户交互时支持重入

从一个小demo入门,构建一个最简单的Graph:

from typing import Annotated, TypedDict
from langgraph.graph.message import add_messages
from langgraph.graph import StateGraph, START, END

llm = ChatOpenAI(
    model="DeepSeek-V3-0324",
    base_url="xx",
    api_key="xx",
)

# 定义State
class State(TypedDict):
    messages: Annotated[list, add_messages]

# 定义Node
def chat(state: State) -> State:
    res = llm.invoke(state["messages"])
    return {"messages": [res]}

# 编译Edge、Graph
graph_builder = StateGraph(State)
graph_builder.add_node("chat", chat)
graph_builder.add_edge(START, "chat")
graph_builder.add_edge("chat", END)
graph = graph_builder.compile()


def run(user_input: str):
    return graph.invoke({"messages": [{"role": "user", "content": user_input}]})

run("你好")

这里的State,是用来在整个图里进行数据流转的,所以在LangGraph里是不推荐使用全局变量的。后面的add_messages,是一个reducer,这里理解成LangGraph会自动为每个State的元素,自动执行xxx(old_state, new_state) -> update_state就可以, 比如这里实际上就是进行了拼接:

def add_messages(old_messages, new_messages) -> update_messages
    return [old_messages, new_messages]