LangGraph 的核心概念:
state: 状态。像个接力棒,在整个流程中传递,并携带了一些信息,比如下一步去哪个节点。
node:节点。就是定义的一个个函数(处理节点),比如调用llm, 或者处理下数据,或者判断下值的内容等等。
edge: 边。就是把node 串联起来,指定好下一步怎么走。分为 edge 无条件边 和 conditional_edges 条件边,就是说满足条件了才把两个节点连接起来。
graph: 表示整个流程图,就是声明下。
LangGraph 的执行逻辑是:输入初始状态 → 图按节点和边定义的顺序执行 → 不断更新状态 → 直到达到终止条件。
最简单的一个案例:
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
# 定义状态
class State(TypedDict):
input: str
output: str
# 定义节点
def process_input(state: State) -> State:
state["output"] = f"处理输入: {state['input']}"
return state
def finalize_output(state: State) -> State:
state["output"] += " -> 已完成"
return state
# 创建图
workflow = StateGraph(State)
workflow.add_node("process_input", process_input)
workflow.add_node("finalize_output", finalize_output)
workflow.add_edge(START, "process_input")
workflow.add_edge("process_input", "finalize_output")
workflow.add_edge("finalize_output", END)
# 编译和运行
graph = workflow.compile()
result = graph.invoke({"input": "Hello, LangGraph!", "output": ""})
print(result)
条件边的案例

关键组成部分解析:
-
起始节点 (
"check_input"):-
表示条件分支的起点,当这个节点执行完毕后,会根据条件决定下一步走向
-
-
条件函数 (
route):-
这是一个自定义函数(前面定义的
def route(state: State) -> str) -
接收当前状态
state作为输入 -
返回一个字符串,这个字符串就是决策结果(在本例中是
"process_input"或"skip_processing")
-
-
分支映射字典:
-
这是一个映射表,将条件函数的返回值连接到具体的节点
-
键:条件函数可能返回的字符串
-
值:对应要执行的节点名称
-
结构:
{ "条件返回值1": "节点A", "条件返回值2": "节点B" }
-
完整代码:
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
# 定义状态
class State(TypedDict):
input: str
output: str
# 定义节点
def check_input(state) -> State:
state["needs_processing"] = len(state["input"]) > 5 # length big than 5
return state
def process_input(state: State) -> State:
state["output"] = f"process_input 处理输入: {state['input']}"
return state
def skip_processing(state: State) -> State:
state["output"] = f"too short, no need processing"
return state
def finalize_output(state: State) -> State:
state["output"] += " -> 已完成"
return state
def route(state):
return "process_input" if state["needs_processing"] else "skip_processing"
# 创建图
workflow = StateGraph(State)
workflow.add_node("check_input", check_input)
workflow.add_node("process_input", process_input)
workflow.add_node("skip_processing", skip_processing)
workflow.add_node("finalize_output", finalize_output)
workflow.add_edge(START, "check_input")
workflow.add_conditional_edges("check_input",route,{
"process_input": "process_input",
"skip_processing": "skip_processing"
})
workflow.add_edge("process_input", "finalize_output")
workflow.add_edge("skip_processing", "finalize_output")
workflow.add_edge("finalize_output", END)
# 编译和运行
graph = workflow.compile()
result = graph.invoke({"input": "hi!", "output": ""})
print(result)
循环:
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
class State(TypedDict):
counter: int
output: str
def increment(state: State) -> State:
state["counter"] += 1
state["output"] = f"当前计数: {state['counter']}"
return state
def should_continue(state: State) -> str:
return "increment" if state["counter"] < 3 else END
# 创建图
workflow = StateGraph(State)
workflow.add_node("increment", increment)
workflow.add_edge(START, "increment")
workflow.add_conditional_edges("increment", should_continue, {
"increment": "increment",
END: END
})
# 编译和运行
graph = workflow.compile()
result = graph.invoke({"counter": 0, "output": ""})
print(result)
ps:
1. tools 要么写文本注释,要么添加 description = "工具的表述"
eg:
# tools
@tool
def search(query_content):
"""搜索工具:根据用户查询内容进行搜索"""
return f"query {query_content} result is balabalala:"
490

被折叠的 条评论
为什么被折叠?



