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"])
相关推荐
Dfreedom.44 分钟前
Windows、虚拟机、开发板组网通信原理及调试通联步骤
人工智能·windows·部署·边缘计算·开发板·模型加速
swipe1 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
CC大煊2 小时前
一个Javaer的AI转型笔记(1):入坑LangChain,我的第一个hello world
笔记·langchain
weixin_468466853 小时前
MoneyPrinterTurbo 短视频自动化生产实战指南
运维·人工智能·自动化·大模型·音视频·moneyprinter
Mr.Daozhi5 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
三无推导6 小时前
ComfyUI 安装部署教程:Windows 下快速搭建可视化 AI 绘图工作流,零基础也能跑通
人工智能·pytorch·windows·stable diffusion·aigc·ai绘画·持续部署
swipe7 小时前
混合检索 RAG 的工程化实践:不是多查几路,而是把召回、重排和上下文预算管好
后端·langchain·llm
weixin_468466858 小时前
千问大模型在阿里生态中的实战应用指南
大数据·人工智能·深度学习·ai·大模型·智能交互·自动应答
nnsix9 小时前
PS【PhotoShop】实现拷贝到Windows粘贴板上
windows
сокол9 小时前
【网安-Web渗透测试-免杀系列】内存免杀(无文件落地)
windows·网络安全