LangGraph-AI应用开发框架(二)

目录

编码前的版本说明

LangGraph案例一(智能快递配送系统)

[1.Graph API编码思路](#1.Graph API编码思路)

2.代码实现

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

[b.【知识点】State 更新机制:Reducers](#b.【知识点】State 更新机制:Reducers)

c.步骤2:定义StateGraph图,成立快递公司

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

e.步骤4:添加Nodes,建设配送站点

f.步骤5:添加Edges,规划运输路线

g.步骤6:StateGraph图编译,从公司创建到运行

3.全部代码


编码前的版本说明

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"])
相关推荐
是小蟹呀^2 小时前
【总结】LangChain中的中间件Middleware
python·中间件·langchain·agent
xixixi777772 小时前
从Mythos到GPT-5.4-Cyber:AI安全竞赛的“双轨”分化与防御新范式
网络·gpt·安全·机器学习·架构·大模型·claude
loong_XL3 小时前
2026智能体爆发现象级产品:OpenClaw、Hermes Agent、Claude Cowork
大模型·agent·智能体·claw·龙虾
FrontAI3 小时前
深入浅出 LangChain —— 第三章:模型抽象层
前端·人工智能·typescript·langchain·ai agent
Destiny_where3 小时前
Langgraph基础(4)-中断interrupt.实现图执行的动态暂停与外部交互
人工智能·python·langchain·langgraph
一个人旅程~3 小时前
linuxmint如何使用iphone手机上网以及如何管理iphone手机的照片和文件?需要下载哪些基础包和依赖?
linux·windows·经验分享·电脑
黑风风5 小时前
在 Windows 上设置 MAVEN_HOME 环境变量(完整指南)
java·windows·maven
念念不忘 必有回响5 小时前
RAG 入门第三课:给你的知识库装上大脑(基于LangChain与Qwen3.5的本地RAG系统搭建)
langchain·rag
seabirdssss5 小时前
Flutter 开发环境配置
android·windows·flutter·adb