LangGraph构建智能客服审批流程的技术实践
1. 项目概述构建支持审批与恢复执行的客服Agent去年在金融行业实施智能客服系统时客户突然提出个需求当涉及交易操作时必须插入人工审批环节且审批后要能自动恢复之前的对话流程。这个需求让我开始研究LangGraph这个新兴框架最终设计出一套完整的解决方案。本文将分享如何用LangGraph构建具备审批中断与恢复能力的智能客服系统这套方案已在银行信用卡业务中稳定运行8个月处理了超过12万次带审批流程的客户请求。LangGraph是LangChain团队推出的工作流编排框架特别适合构建有复杂状态转移的AI应用。相比传统的线性对话流程它通过图结构Graph实现以下关键能力任意节点的条件跳转循环执行控制异步操作支持持久化状态管理这些特性恰好满足客服场景中的审批需求当用户请求触发审批条件时系统能暂停当前对话将请求路由至人工审批台待审批完成后从断点恢复执行。整个过程对用户呈现为自然的等待状态而非生硬的流程重启。2. 核心架构设计2.1 状态机模型设计整个Agent的核心是一个有限状态机包含以下关键状态节点状态节点触发条件输出动作意图识别用户输入生成意图标签路由判断意图标签分流到业务模块或审批模块业务处理常规请求执行标准客服逻辑审批触发敏感操作请求生成审批工单审批等待工单状态向用户返回等待提示结果执行审批结果执行通过/拒绝动作在LangGraph中通过StateGraph实现这个状态机from langgraph.graph import StateGraph workflow StateGraph(AgentState) # 添加所有状态节点 workflow.add_node(intent_recognizer, intent_recognizer) workflow.add_node(router, router) workflow.add_node(business_handler, business_handler) workflow.add_node(approval_trigger, approval_trigger) workflow.add_node(approval_waiting, approval_waiting) workflow.add_node(result_executor, result_executor)2.2 审批流程集成审批系统对接采用HTTP长轮询机制关键设计点包括工单生成当触发审批时Agent会冻结当前对话上下文包括变量、历史消息等生成唯一工单ID将审批所需信息打包发送给审批系统状态恢复通过Redis持久化存储以下数据{ ticket_id: APP-20240615-001, user_id: u12345, frozen_state: {...}, # 序列化的对话状态 expire_time: 3600 # 1小时TTL }回调处理审批系统提供两个关键接口POST /approval/request提交审批请求GET /approval/status/{ticket_id}查询审批状态重要提示务必实现审批系统的幂等接口防止网络重试导致重复审批3. 关键实现细节3.1 状态持久化方案LangGraph的Checkpoint机制是本项目的核心技术点。我们自定义了Redis检查点存储from langgraph.checkpoint import BaseCheckpointSaver import pickle class RedisCheckpoint(BaseCheckpointSaver): def __init__(self, redis_client): self.redis redis_client async def put(self, config, step, state): key fcheckpoint:{config[configurable][thread_id]} await self.redis.setex( namekey, time3600, valuepickle.dumps({step: step, state: state}) ) async def get(self, config): key fcheckpoint:{config[configurable][thread_id]} data await self.redis.get(key) return pickle.loads(data) if data else None3.2 审批恢复逻辑当收到审批通过通知时系统执行以下恢复流程根据工单ID检索原始对话状态重建LangGraph执行上下文从断点继续执行async def resume_flow(ticket_id): # 从审批系统获取结果 approval_result get_approval_result(ticket_id) # 从Redis恢复检查点 checkpoint await redis_checkpoint.get( {configurable: {thread_id: ticket_id}} ) # 重建执行图 app workflow.compile(checkpointerredis_checkpoint) await app.update_state( checkpoint[state], {approval_result: approval_result} ) # 继续执行 return await app.ainvoke( inputsNone, config{configurable: {thread_id: ticket_id}} )4. 实战问题与解决方案4.1 超时处理策略在实际运行中我们发现两个典型问题审批响应时间不可控人工审批可能耗时数小时用户可能在等待期间发送新消息解决方案是设计双重超时机制%% 注意实际实现中应删除此mermaid图仅保留文字描述 %% stateDiagram [*] -- 等待审批 等待审批 -- 超时提醒: 30秒无响应 超时提醒 -- 保持连接: 用户未离开 保持连接 -- 结果到达: 审批完成 超时提醒 -- 结束会话: 用户离开 结束会话 -- 邮件通知: 审批完成后具体实现代码async def approval_waiting(state): start_time time.time() while True: # 每30秒检查一次审批状态 if time.time() - start_time 30: yield {status: waiting, message: 审批处理中请稍候...} result check_approval_status(state[ticket_id]) if result: return {status: completed, result: result} await asyncio.sleep(5) # 非阻塞等待4.2 上下文一致性保障审批前后需要保持对话上下文的连贯性。我们采用以下策略快照对比在审批触发时保存对话记忆快照差异合并恢复时对比新旧记忆保留关键实体信息意图保持强制维持原始意图标签不变关键实现代码def freeze_context(state): return { intent: state[intent], entities: extract_entities(state[messages]), slots: state[slots].copy() } def restore_context(frozen, new_state): new_state[intent] frozen[intent] for entity in frozen[entities]: if not check_entity_exists(entity, new_state[messages]): add_entity_to_context(entity, new_state) return new_state5. 性能优化实践在压力测试中我们发现三个性能瓶颈及解决方案检查点序列化开销问题默认pickle序列化在大型对话历史上耗时明显优化改用orjson并压缩存储import orjson import zlib def serialize_state(state): return zlib.compress(orjson.dumps(state)) def deserialize_state(data): return orjson.loads(zlib.decompress(data))审批状态查询风暴现象大量并发请求轮询审批状态方案实现基于Redis Pub/Sub的事件通知机制async def wait_approval(ticket_id): pubsub redis.pubsub() await pubsub.subscribe(fapproval:{ticket_id}) async for message in pubsub.listen(): if message[type] message: return message[data]LangGraph执行图初始化耗时现象每次恢复执行都重新编译图缓存预编译常见流程的执行图lru_cache(maxsize10) def get_compiled_workflow(flow_type): if flow_type standard: return standard_flow.compile() elif flow_type approval: return approval_flow.compile()这套优化方案使系统在200并发用户下平均响应时间从1.8秒降至420毫秒。6. 扩展设计多级审批流对于更复杂的金融场景我们扩展支持多级审批条件审批路由def route_approval_level(request): if request[amount] 10000: return manager_approval elif request[amount] 5000: return supervisor_approval else: return auto_approval并行审批处理async def parallel_approval(state): tasks [] for approver in state[required_approvers]: task send_approval_request(approver, state) tasks.append(task) results await asyncio.gather(*tasks) return all(r[approved] for r in results)审批链可视化def print_approval_chain(chain): print(Approval Flow:) current chain while current: print(f→ {current[role]} ({current[status]})) current current.get(next)7. 监控与调试方案为保障生产环境稳定性我们实施以下监控措施执行轨迹记录class ExecutionLogger: def __init__(self): self.traces [] def log(self, node, state): self.traces.append({ timestamp: datetime.now(), node: node, state: sanitize_state(state) })关键指标埋点审批触发率平均审批耗时恢复执行成功率上下文丢失率LangSmith集成from langsmith import Client client Client() def log_to_langsmith(run_id, **kwargs): client.create_feedback( run_id, keyapproval_metrics, valuekwargs )这套监控体系帮助我们及时发现并解决了多个边界条件问题如审批超时后的状态回滚、网络中断时的补偿重试等。8. 安全防护措施在处理敏感业务时我们实施了以下安全方案审批验证令牌def generate_approval_token(ticket_id): payload { ticket_id: ticket_id, exp: datetime.now() timedelta(hours1) } return jwt.encode(payload, SECRET_KEY, algorithmHS256) def verify_token(token): try: return jwt.decode(token, SECRET_KEY, algorithms[HS256]) except: return None敏感数据脱敏def mask_sensitive_data(text): patterns { r\b\d{4}-\d{4}-\d{4}-\d{4}\b: ****-****-****-####, r\b\d{3}-\d{2}-\d{4}\b: ***-**-#### } for pat, repl in patterns.items(): text re.sub(pat, repl, text) return text操作审计日志class AuditLogger: def log_operation(self, user, action, metadata): record { timestamp: datetime.utcnow(), user: user, action: action, metadata: metadata } es.index(indexaudit_log, bodyrecord)在最近一次安全审计中这套方案成功防御了23次注入攻击尝试和5次会话劫持尝试。

相关新闻

音频隐写术实战:从LSB原理到Python破解Base64隐藏信息

音频隐写术实战:从LSB原理到Python破解Base64隐藏信息

1. 项目概述:当音频文件“开口说话” 你可能遇到过这样的情况:收到一个看似普通的MP3音频文件,朋友却说里面藏了“好东西”。或者,在一些CTF(夺旗赛)或安全挑战中,音频文件本身就是一道谜题。这…

2026/7/31 13:44:39 阅读更多 →
紧急预警!知识图谱构建中被忽视的语义漂移风险(附实时检测SDK与72小时修复协议)

紧急预警!知识图谱构建中被忽视的语义漂移风险(附实时检测SDK与72小时修复协议)

更多请点击: https://intelliparadigm.com 第一章:紧急预警!知识图谱构建中被忽视的语义漂移风险(附实时检测SDK与72小时修复协议) 语义漂移——这一在知识图谱构建过程中悄然蔓延的“静默故障”,正导致实…

2026/7/31 13:44:39 阅读更多 →
UniApp微信小程序扫码功能深度实战:从API调用到高级场景优化

UniApp微信小程序扫码功能深度实战:从API调用到高级场景优化

1. 项目概述:为什么UniApp扫码值得你花时间? 如果你正在用UniApp开发微信小程序,并且项目中需要集成扫码功能,那你来对地方了。扫码,这个看似简单的动作,背后其实藏着不少门道。从基础的商品条码识别到复杂…

2026/7/31 13:44:39 阅读更多 →

最新新闻

第五周学习总结

第五周学习总结

达梦数据库第五周学习总结——DBLink与数据迁移实战本周深入学习了达梦数据库的 DBLink 技术(同构与异构连接)、ODBC 配置、DTS 数据迁移、以及 Oracle/MySQL/SQL Server 三种异构数据库向达梦的数据迁移实操。一、数据库 DBLink 技术1.1 什么是 DBLinkD…

2026/8/1 16:05:10 阅读更多 →
【实战】让AI理解用户的文化背景:开源项目Saga Reader自动翻译的技术实现

【实战】让AI理解用户的文化背景:开源项目Saga Reader自动翻译的技术实现

引言:从翻译到“文化转译” 当用户说“我要点一份‘蚂蚁上树’”,一个合格的AI翻译工具应该做什么?字面直译是“ants climbing a tree”,这会让英文用户一脸茫然。真正的跨语言理解,需要AI在词汇、语法之外&#xff0c…

2026/8/1 16:05:10 阅读更多 →
从财务“大洗澡”到高管“大换血”,五粮液股价已跌去四成

从财务“大洗澡”到高管“大换血”,五粮液股价已跌去四成

从董事长换人,到董秘卸任、董事辞职,五粮液经历了高管“大换血”。7月28日,五粮液(000858.SZ)公告李剑伟接替章欣出任董秘,实现财务总监与董秘岗位分离,落实“董秘新规”关于关键岗位不得兼任的监管要求。业绩上&#…

2026/8/1 16:05:10 阅读更多 →
电子设计基石:电阻、电容、电感核心原理与实战选型指南

电子设计基石:电阻、电容、电感核心原理与实战选型指南

1. 从“三兄弟”的日常说起:电路中的基石如果你刚接触电子设计,面对一块布满元件的电路板,可能会觉得眼花缭乱。但无论电路多么复杂,其核心骨架,往往是由电阻、电容、电感这三位“基础元件兄弟”搭建起来的。它们不像芯…

2026/8/1 16:05:10 阅读更多 →
频谱分析仪核心原理与工程实践:从超外差架构到关键参数设置

频谱分析仪核心原理与工程实践:从超外差架构到关键参数设置

1. 项目概述:从“看”信号到“懂”信号在电子工程、射频调试乃至业余无线电爱好者的世界里,我们常常需要回答一个最基础的问题:我眼前的这个信号,它到底“长”什么样?它是不是我期望的那个频率?它的功率有多…

2026/8/1 16:05:10 阅读更多 →
基于CH32V307/STM32的智能风扇开发与多平台移植实践

基于CH32V307/STM32的智能风扇开发与多平台移植实践

这次我们来看一个基于CH32V307的智能风扇项目,这个项目的亮点在于主控芯片可以灵活替换为CH32V203/208或者STM32系列,为嵌入式开发者提供了很好的硬件兼容性参考。如果你正在寻找一个完整的智能风扇解决方案,或者想了解不同MCU之间的移植方法…

2026/8/1 16:04:09 阅读更多 →

日新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/8/1 13:02:46 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/8/1 5:19:34 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/8/1 10:33:33 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/1 0:00:48 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/1 0:00:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/1 0:00:48 阅读更多 →