LangGraph 状态机:复杂 Agent 任务流程管理实战

news/2024/11/19 13:11:10/文章来源:https://www.cnblogs.com/muzinan110/p/18554629

什么是 LangGraph?

LangGraph 是一个专门为 LLM 应用设计的工作流编排框架。它的核心理念是:

  • 将复杂任务拆分为状态和转换
  • 管理状态之间的流转逻辑
  • 处理任务执行过程中的各种异常情况

想象一下购物过程:浏览商品 → 加入购物车 → 结算 → 支付,LangGraph 就是帮助我们管理这种流程的工具。

核心概念解析

1. 状态(State)

状态就像是任务执行过程中的"检查点":

from typing import TypedDict, Listclass ShoppingState(TypedDict):# 当前状态current_step: str# 购物车商品cart_items: List[str]# 总金额total_amount: float# 用户输入user_input: strclass ShoppingGraph(StateGraph):def __init__(self):super().__init__()# 定义状态self.add_node("browse", self.browse_products)self.add_node("add_to_cart", self.add_to_cart)self.add_node("checkout", self.checkout)self.add_node("payment", self.payment)

2. 状态转换(Transition)

状态转换定义了任务流程的"路线图":

class ShoppingController:def define_transitions(self):# 添加状态转换规则self.graph.add_edge("browse", "add_to_cart")self.graph.add_edge("add_to_cart", "browse")self.graph.add_edge("add_to_cart", "checkout")self.graph.add_edge("checkout", "payment")def should_move_to_cart(self, state: ShoppingState) -> bool:"""判断是否应该转换到购物车状态"""return "add to cart" in state["user_input"].lower()

3. 状态持久化

为了保证系统的可靠性,我们需要持久化状态信息:

class StateManager:def __init__(self):self.redis_client = redis.Redis()def save_state(self, session_id: str, state: dict):"""保存状态到 Redis"""self.redis_client.set(f"shopping_state:{session_id}",json.dumps(state),ex=3600  # 1小时过期)def load_state(self, session_id: str) -> dict:"""从 Redis 加载状态"""state_data = self.redis_client.get(f"shopping_state:{session_id}")return json.loads(state_data) if state_data else None

4. 错误恢复机制

任何步骤都可能出错,我们需要优雅地处理这些情况:

class ErrorHandler:def __init__(self):self.max_retries = 3async def with_retry(self, func, state: dict):"""带重试机制的函数执行"""retries = 0while retries < self.max_retries:try:return await func(state)except Exception as e:retries += 1if retries == self.max_retries:return self.handle_final_error(e, state)await self.handle_retry(e, state, retries)def handle_final_error(self, error, state: dict):"""处理最终错误"""# 保存错误状态state["error"] = str(error)# 回退到上一个稳定状态return self.rollback_to_last_stable_state(state)

实战案例:智能客服系统

让我们看一个实际的例子 - 智能客服系统:

from langgraph.graph import StateGraph, Stateclass CustomerServiceState(TypedDict):conversation_history: List[str]current_intent: struser_info: dictresolved: boolclass CustomerServiceGraph(StateGraph):def __init__(self):super().__init__()# 初始化状态self.add_node("greeting", self.greet_customer)self.add_node("understand_intent", self.analyze_intent)self.add_node("handle_query", self.process_query)self.add_node("confirm_resolution", self.check_resolution)async def greet_customer(self, state: State):"""欢迎客户"""response = await self.llm.generate(prompt=f"""历史对话:{state['conversation_history']}任务:生成合适的欢迎语要求:1. 保持专业友好2. 如果是老客户,表示认出了他们3. 询问如何帮助""")state['conversation_history'].append(f"Assistant: {response}")return stateasync def analyze_intent(self, state: State):"""理解用户意图"""response = await self.llm.generate(prompt=f"""历史对话:{state['conversation_history']}任务:分析用户意图输出格式:{"intent": "退款/咨询/投诉/其他","confidence": 0.95,"details": "具体描述"}""")state['current_intent'] = json.loads(response)return state

使用方法

# 初始化系统
graph = CustomerServiceGraph()
state_manager = StateManager()
error_handler = ErrorHandler()async def handle_customer_query(user_id: str, message: str):# 加载或创建状态state = state_manager.load_state(user_id) or {"conversation_history": [],"current_intent": None,"user_info": {},"resolved": False}# 添加用户消息state["conversation_history"].append(f"User: {message}")# 执行状态机流程try:result = await graph.run(state)# 保存状态state_manager.save_state(user_id, result)return result["conversation_history"][-1]except Exception as e:return await error_handler.with_retry(graph.run,state)

最佳实践

  1. 状态设计原则

    • 保持状态简单清晰
    • 只存储必要信息
    • 考虑序列化需求
  2. 转换逻辑优化

    • 使用条件转换
    • 避免死循环
    • 设置最大步骤数
  3. 错误处理策略

    • 实现优雅降级
    • 记录详细日志
    • 提供回滚机制
  4. 性能优化

    • 使用异步操作
    • 实现状态缓存
    • 控制状态大小

常见陷阱和解决方案

  1. 状态爆炸

    • 问题:状态数量过多导致维护困难
    • 解决:合并相似状态,使用状态组合而不是创建新状态
  2. 死锁情况

    • 问题:状态转换循环导致任务卡住
    • 解决:添加超时机制和强制退出条件
  3. 状态一致性

    • 问题:分布式环境下状态不一致
    • 解决:使用分布式锁和事务机制

总结

LangGraph 状态机为复杂 AI Agent 任务流程管理提供了一个强大的解决方案:

  • 清晰的任务流程管理
  • 可靠的状态持久化
  • 完善的错误处理
  • 灵活的扩展能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836772.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【日记】每次修机器都有些头疼(721 字)

正文这一连几天都下雨,冷死了。基本上玩了一天。没怎么干活儿。下午打算写完至少一篇文章,结果难产了。晚上接到了搬去 5 楼的命令,这次没得商量。头疼。时间在明天晚上。晚上终于还是忍不住稍微动了一下,结果感觉膝盖的伤要复发了……又回到了书荒的状态。得找新书看了。M…

Flink 实战之 Real-Time DateHistogram

DateHistogram 用于根据日期或时间数据进行分桶聚合统计。它允许你将时间序列数据按照指定的时间间隔进行分组,从而生成统计信息,例如每小时、每天、每周或每月的数据分布情况。Elasticsearch 就支持 DateHistogram 聚合,在关系型数据库中,可以使用 GROUP BY 配合日期函数…

软路由 + NAS 实现日常生活办公

组网拓扑设备监控指标设备主要用途或部署服务 1. OpenWrtWireGuard VPN 组网从而实现内网穿透便于访问家庭局域网络; 懂得都懂; 运行一些 docker 小玩意。2. QNAP NASQuObjects 对象存储服务器:Typora 图床功能、Joplin 笔记远程同步; Plex Media Server:搭建个人的影音库…

数据采集实践4

课程链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology作业链接 https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology/homework/13288gitee仓库链接 https://gitee.com/wd_b/party-soldier-data-collection/tree/master/…

违规生产检测视频分析服务器安全帽安全服检测批量操作功能教程

在工业自动化和智能化的浪潮中,视频监控系统正经历着从传统监控向智能监控的转变。视频分析服务器,作为这一转变的核心,正以其独特的优势在安全管理领域扮演着越来越重要的角色。本文将详细介绍视频分析服务器的技术特点、优势以及如何通过批量操作来提高监控效率和安全性。…

使用WebRTC技术搭建小型的视频聊天页面

目录目录 参考资料 什么是WebRTC? 能做什么? 架构图 个人理解(类比)核心知识点 核心知识点类比ICE框架 STUN(协议) NAT(网络地址转换) TURN SDP(会话描述协议) WebRTC的核心API现在开始做饭 准备阶段环境准备 服务器搭建 Coturn TURN server(开源服务) 部署 Signal Server信令…

HarmonyOS-Chat聊天室|纯血鸿蒙Next5 api12聊天app|ArkUI仿微信

自研原生鸿蒙NEXT5.0 API12 ArkTS仿微信app聊天模板HarmonyOSChat。 harmony-wechat原创重磅实战纯血鸿蒙OS ArkUI+ArkTs仿微信App聊天实例。包括聊天、通讯录、我、朋友圈等模块,实现类似微信消息UI布局、编辑器光标处输入文字+emo表情图片/GIF动图、图片预览、红包、语音/位…

Apache Dolphinscheduler数据质量源码分析

Apache DolphinScheduler 是一个分布式、易扩展的可视化数据工作流任务调度系统,广泛应用于数据调度和处理领域。 在大规模数据工程项目中,数据质量的管理至关重要,而 DolphinScheduler 也提供了数据质量检查的计算能力。本文将对 Apache DolphinScheduler 的数据质量模块进…

通过域名访问内网服务器

cloudflare优选ip访问家用服务器 前言 由于一直有使用markdown写笔记的需求,但是每次处理图片的时候总是很头疼。突然,我瞥见了还在角落里面吃灰小主机,因此萌生了废物利用想法,搭建一个外网可访问的图床。图床直接使用lsky-pro就可以,关键还是在外网访问上。 于是在网上看…

【算法】KMP 与 Z 函数

1. KMP 1.1 算法简介 可以做到线性匹配的快速匹配字符串的算法,并可以维护字符串最长公共前后缀,扩展出计算字符串周期。 在 OI 界 KMP 算法是字符串板块中很经典的算法,可以扩展出很多巧妙的解题技巧。 1.2 算法流程 1.2.1 字符串匹配 考虑 \(O(n^2)\) 暴力的匹配,瓶颈在于…

apifox使用小记

1.copy as cURL(cmd)之后在apifox里直接import cURL 2.调用时发生301错误 通常情况下是因为有session校验存在(用户校验)。解决方案: F12里将cookie里的session取到,在apifox里全局配置 这里踩了一个坑 第一次我是import了一个get请求,发送后发生301,所以我去设置了co…

毕业实习总结报告

毕业实习总结报告这既是毕业实习要求的总结报告,也是我对AutoSAR的一点理解,更是个人对未来生活的一点思考。我不希望把这份报告草草水过,而是希望把现在的感受记录下来,给以后的自己看一看,好记性不如记下来。涉及到工作细节和隐私的部分不在此展示了。时间像一头野驴呀,…