目录
[1.Graph API编码思路](#1.Graph API编码思路)
[b.【知识点】State 更新机制:Reducers](#b.【知识点】State 更新机制:Reducers)
编码前的版本说明

LangGraph案例一(智能快递配送系统)
1.Graph API编码思路





我们能将其简单转化一下

2.代码实现
a.步骤1:定义State,设置快递的"包裹信息"

python
from typing import TypedDict, Annotated
from operator import add
# 1. 定义包裹状态
class PackageState(TypedDict):
# 包裹基本信息
package_id: str # 包裹id
origin: str # 始发站
destination: str # 目的地
# 配送状态
status: str # "待揽收", "运输中", "派送中", "已签收"
history: Annotated[list[str], add] # 流转历史
total_distance: Annotated[int, add] # 总里程
# 配送详情
priority: str # "普通", "加急"
b.【知识点】State 更新机制:Reducers


python
# 覆盖更新:每次新状态替换旧状态
status: str
# 追加更新:新的流转记录添加到历史列表
history: Annotated[list[str], add]
# 数值累加:⾥程数累加
total_distance: Annotated[int, add]
c.步骤2:定义StateGraph图,成立快递公司

d.步骤3:定义Nodes,创建配送站点

python
# 3. 定义各个配送站点
def receive_package(state: PackageState):
"""揽收站"""
return {
"status": "已揽收",
"history": [f"在{state['origin']}揽收"]
}
def sort_package(state: PackageState):
"""分拣中心: 根据目的地分拣"""
destination = state["destination"]
if "北京" in destination:
next_station = "北京分拣中心"
elif "上海" in destination:
next_station = "上海分拣中心"
else:
next_station = "其他地区分拣中心"
return {
"status": "已分拣",
"history": [f"分拣至{next_station}"]
}
def final_delivery(state: PackageState):
"""派送站"""
return {
"status": "已签收",
"history": [f"已送达{state['destination']}"]
}
e.步骤4:添加Nodes,建设配送站点


python
# 4. 添加配送站点
delivery.add_node("揽收站", receive_package)
delivery.add_node("分拣中⼼", sort_package)
delivery.add_node("派送站", final_delivery)
f.步骤5:添加Edges,规划运输路线









python
# 新增节点
def standard_delivery(state: PackageState):
"""标准配送"""
return {
"status": "运输中",
"history": ["标准陆运"],
"total_distance": 500
}
def express_delivery(state: PackageState):
"""加急配送"""
return {
"status": "加急运输",
"history": ["空运加急"],
"total_distance": 800
}
# 4. 添加配送站点
delivery.add_node("揽收站", receive_package)
delivery.add_node("分拣中心", sort_package)
delivery.add_node("标准配送", standard_delivery)
delivery.add_node("加急配送", express_delivery)
delivery.add_node("派送站", final_delivery)
# 5. 设计配送路线
delivery.add_edge(START, "揽收站")
delivery.add_edge("揽收站", "分拣中心")
# 智能路由:根据优先级选择配送方式
def select_delivery(state: PackageState):
"""智能路由决策 - 根据包裹特性选择路线"""
if state["priority"] == "加急":
return "加急配送"
else:
return "标准配送"
delivery.add_conditional_edges(
"分拣中心", # source: 起始节点。退出此节点时,将运行此条件边。
select_delivery, # path: 确定下一个或多个节点的可调用对象。
["加急配送", "标准配送"] # path_map
)
delivery.add_edge("标准配送", "派送站")
delivery.add_edge("加急配送", "派送站")
delivery.add_edge("派送站", END)

python
# 智能路由:根据优先级选择配送方式
def select_delivery(state: PackageState):
"""智能路由决策 - 根据包裹特性选择路线"""
if state["priority"] == "加急":
return "备注加急"
else:
return "无备注"
delivery.add_conditional_edges(
"分拣中心", # source: 起始节点。退出此节点时,将运行此条件边。
select_delivery, # path: 确定下一个或多个节点的可调用对象。
{
"备注加急": "加急配送",
"无备注": "标准配送"
}
)
g.步骤6:StateGraph图编译,从公司创建到运行


python
# 8. 测试配送
test_packages = [
{
"package_id": "P001",
"origin": "北京",
"destination": "上海",
"priority": "普通",
"history": [],
"total_distance": 0
},
{
"package_id": "P002",
"origin": "广州",
"destination": "乌鲁木齐",
"priority": "加急",
"history": [],
"total_distance": 0
}
]
for package in test_packages:
print(f"\n配送包裹: {package['package_id']}")
result = delivery_system.invoke(package)
print("最终状态:", result["status"])
print("配送历史:", result["history"])
print("总里程:", result["total_distance"])

3.全部代码
python
from typing import TypedDict, Annotated
from operator import add
from langgraph.constants import START,END
from langgraph.graph import StateGraph
#1.定义状态(贯穿整个图)
class PackageState(TypedDict):
# 包裹基本信息
package_id: str # 包裹id
origin: str # 始发站
destination: str # 目的地
# 配送状态
status: str # "待揽收","已揽收", "运输中", "派送中", "已签收"
history: Annotated[list[str], add] # 流转历史
total_distance: Annotated[int, add] # 总里程
# 配送详情
priority: str # "普通", "加急"
#2.定义节点(函数)
#输入:状态 输出:状态的更新
#节点之间通过状态进行通信
# def test(state: PackageState):
# return {
# "output": "i am output"
# }
# a. 揽收站节点
def recrvie_package(state: PackageState):
"""揽收站"""
#状态的扭转
origin = state["origin"] #状态值的获取
return {
"status": "已揽收",
"history": [f"在{origin}揽收"]
}
# b. 分拣中心节点
def sort_package(state: PackageState):
"""分拣中心: 根据目的地进行分拣"""
destination = state["destination"]
if "北京" in destination:
next = "北京分拣中心"
elif "上海" in destination:
next = "上海分拣中心"
else:
next = "其他地区分拣中心"
return {
"status": "已分拣",
"history": [f"分拣至{next}"],
}
# c. 派送站节点
def final_delivery(state: PackageState):
"""派送站"""
return {
"status": "已签收",
"history": [f"已送达{state["destination"]}"]
}
# d. 标准配送节点
def standard_delivery(state: PackageState):
"""标准配送"""
return {
"status": "运输中",
"history": ["标准陆运"],
"total_distance": 500
}
# f. 加急配送节点
def express_delivery(state: PackageState):
"""加急配送"""
return {
"status": "加急运输",
"history": ["空运加急"],
"total_distance": 800
}
#3.定义图(依赖状态)
delivery = StateGraph(PackageState)
#4.添加节点
delivery.add_node("揽收站",recrvie_package)
delivery.add_node("分拣中心",sort_package)
delivery.add_node("派送站",final_delivery)
delivery.add_node("标准配送",standard_delivery)
delivery.add_node("加急配送",express_delivery)
# #路由方法
# def select_delivery(state: PackageState):
# priority = state["priority"]
# if priority == "加急":
# return "加急配送"
# else:
# return "标准配送" #返回字符串
#
# #5.添加边
# delivery.add_edge(START,"揽收站") #固定边
# delivery.add_edge("揽收站","分拣中心")
# delivery.add_conditional_edges(
# "分拣中心", #条件的起使节点
# select_delivery, #path
# ["加急配送","标准配送"] #path_map:节点名称
# )
#路由方法
def select_delivery(state: PackageState):
priority = state["priority"]
if priority == "加急":
return "备注加急"
else:
return "无备注" #返回字符串
#5.添加边
delivery.add_edge(START,"揽收站") #固定边
delivery.add_edge("揽收站","分拣中心")
delivery.add_conditional_edges(
"分拣中心", #条件的起使节点
select_delivery, #path
{
"备注加急":"加急配送",
"无备注":"标准配送"
}
)
delivery.add_edge("加急配送","派送站")
delivery.add_edge("标准配送","派送站")
delivery.add_edge("派送站",END)
#6.编译图(测试上面代码写的对不对)
delivery_system = delivery.compile()
#7.执行图(输入初始状态,输出最终状态)
# 8. 测试配送
test_packages = [
{
"package_id": "P001",
"origin": "北京",
"destination": "上海",
"priority": "普通",
"history": [],
"total_distance": 0
},
{
"package_id": "P002",
"origin": "广州",
"destination": "乌鲁木齐",
"priority": "加急",
"history": [],
"total_distance": 0
}
]
for package in test_packages:
print(f"\n配送包裹: {package['package_id']}")
#执行图,发一遍快递
result = delivery_system.invoke(package)
print("最终状态:", result["status"])
print("配送历史:", result["history"])
print("总里程:", result["total_distance"])