LangGraph构建带审批流程的智能客服系统实战
1. 项目概述构建带审批流程的智能客服系统最近在帮一家金融公司改造他们的智能客服系统时遇到个有意思的需求某些敏感业务场景比如账户余额查询、交易记录调取需要人工审核才能继续执行而且当审批通过后系统要能自动恢复之前的对话流程。这让我开始研究如何用LangGraph搭建支持审批与恢复执行的客服Agent今天就把实战经验分享给大家。传统客服Agent遇到审批环节时往往直接中断会话等人工审核后需要用户重新描述需求。而我们要实现的系统会在审批通过后自动回到中断点继续执行未完成的操作流程。想象一下这样的场景用户查询近半年交易记录→触发风控审批→专员审核通过→系统自动返回查询结果。整个过程无需用户重复操作体验流畅得像没有中断过一样。2. 技术选型与架构设计2.1 为什么选择LangGraph相比LangChainLangGraph最大的优势是支持有状态的多步骤工作流。它的Graph特性让我们可以用节点(Node)表示每个处理步骤如意图识别、信息提取用边(Edge)控制流程跳转逻辑通过持久化检查点(Checkpoint)实现流程中断与恢复from langgraph.graph import Graph workflow Graph() # 定义节点 workflow.add_node(intent_recognizer, recognize_intent) workflow.add_node(approval_checker, check_approval_required) workflow.add_node(human_approval, send_for_approval) # 定义边 workflow.add_edge(intent_recognizer, approval_checker) workflow.add_conditional_edge( approval_checker, lambda x: requires_approval if x[needs_approval] else auto_pass, {requires_approval: human_approval, auto_pass: end} )2.2 审批流程的三种实现模式根据业务需求不同我们设计了三种审批集成方案方案类型触发条件审批方式恢复机制硬拦截式敏感关键词匹配强制人工审批审批通过后重放完整对话软拦截式风险评分阈值人工审批或自动放行仅执行未完成步骤混合式规则模型判断分级审批初级/高级选择性步骤回滚金融场景推荐使用混合式方案。比如当用户要求查询最近三个月交易记录并导出Excel时查询操作触发初级审批客服组长审核导出操作触发高级审批风控专员审核每个审批通过后只执行对应环节3. 核心实现细节3.1 状态持久化设计实现中断恢复的关键是完整保存对话上下文。我们采用三级存储策略class ApprovalState: def __init__(self): self.current_node # 当前执行节点 self.history [] # 已完成的步骤日志 self.pending_data {} # 待审批数据 self.context {} # 完整对话上下文 # 使用Redis持久化状态 import pickle import redis r redis.Redis() def save_state(session_id, state): r.set(fapproval:{session_id}, pickle.dumps(state)) def load_state(session_id): data r.get(fapproval:{session_id}) return pickle.loads(data) if data else None重要提示状态对象必须包含完整的可序列化数据避免存储LangChain的Memory对象这类不可序列化的内容。3.2 审批接口实现审批系统通常需要提供HTTP接口供人工处理。这里给出FastAPI的实现示例from fastapi import FastAPI, HTTPException from pydantic import BaseModel app FastAPI() class ApprovalRequest(BaseModel): session_id: str approve: bool comment: str None app.post(/approve) async def handle_approval(req: ApprovalRequest): state load_state(req.session_id) if not state: raise HTTPException(404, Session expired) if req.approve: # 恢复执行 workflow rebuild_workflow(state.current_node) result await workflow.arun(state.context) return {status: resumed, result: result} else: # 终止流程 delete_state(req.session_id) return {status: rejected}4. 实战中的经验技巧4.1 审批超时处理我们发现30%的审批请求会在2小时后才得到处理这时需要特殊处理设置TTL自动过期比如24小时恢复时检查数据有效性如查询条件是否仍然合理添加超时提醒模板def check_timeout(state): elapsed time.time() - state.last_update if elapsed 3600 * 2: # 2小时 send_notification( f审批任务#{state.session_id}已超时, f请及时处理{get_approval_url(state.session_id)} )4.2 可视化调试技巧LangGraph自带LangSmith集成但审批流程需要额外记录为每个审批请求创建独立Trace记录审批人和决策原因标注流程恢复点from langsmith import Client client Client() def log_approval(session_id, action, metadata): client.create_run( nameapproval_decision, inputs{session_id: session_id}, outputs{action: action}, metadatametadata )5. 典型问题排查指南5.1 状态恢复失败症状审批通过后流程没有从正确节点恢复检查点是否包含足够上下文至少需要当前节点、输入参数、历史路径确认重建工作流时使用了相同的节点注册顺序验证Redis的序列化/反序列化过程没有数据丢失5.2 审批通知未触发排查步骤检查审批节点是否正确设置了输出边验证消息服务邮件/SMS的API密钥查看LangGraph的异常日志# 查看最近10条错误日志 docker logs --tail 10 langgraph-server | grep approval5.3 性能优化建议当审批流程较长时超过5个节点建议对状态对象进行压缩如使用zlib只持久化必要的上下文字段对大文件附件使用对象存储引用import zlib def compress_state(state): return zlib.compress(pickle.dumps(state)) def decompress_state(data): return pickle.loads(zlib.decompress(data))这个方案已经在生产环境处理了超过12万次带审批的客服请求平均审批响应时间从原来的47分钟降低到19分钟。最让我惊喜的是通过合理设置检查点流程恢复成功率达到了99.3%。如果你正在构建需要人工介入的智能客服系统不妨试试这个方案。

相关新闻

Scrapy爬虫实战:从拉勾网招聘数据清洗到技能标签可视化分析

Scrapy爬虫实战:从拉勾网招聘数据清洗到技能标签可视化分析

1. 项目概述与核心价值最近在整理过往的数据分析项目时,翻到了一个用Scrapy爬取拉勾网招聘数据的“老古董”。这个项目虽然有些年头,但其中关于反爬对抗、数据清洗以及围绕岗位技能进行深度分析的思路,至今依然非常经典和实用。很多朋友在入门…

2026/10/17 13:38:04 阅读更多 →
物流API集成与开箱记录生成:Python实现跨境电商包裹跟踪系统

物流API集成与开箱记录生成:Python实现跨境电商包裹跟踪系统

在跨境电商和代购场景中,很多开发者会接触到需要解析物流信息、跟踪包裹状态、甚至自动识别开箱商品的需求。这类需求背后,往往涉及物流 API 集成、订单数据解析、图像识别或文本分析等技术。虽然“挖煤姬”本身可能是一个代购平台或用户昵称&#xff0c…

2026/10/16 4:13:16 阅读更多 →
构建电子竞赛动态知识库:从信息孤岛到实战赋能

构建电子竞赛动态知识库:从信息孤岛到实战赋能

1. 从“信息孤岛”到“知识枢纽”:电子竞赛的痛点与机遇如果你是一名电子类竞赛的参与者或指导老师,下面这个场景你一定不陌生:深夜,实验室灯火通明,你卡在一个看似简单的电路调试上。你打开搜索引擎,输入问…

2026/10/2 0:28:59 阅读更多 →

最新新闻

QML自制数字软键盘:向TextInput/TextField键入数字并实现左移右移删除

QML自制数字软键盘:向TextInput/TextField键入数字并实现左移右移删除

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 18:34:59 阅读更多 →
charting-library-master-v28.3 源码解析:从本地运行到高性能渲染实践

charting-library-master-v28.3 源码解析:从本地运行到高性能渲染实践

简介:charting-library-master-v28.3 是 TradingView 高级图表库 v28.3.7 的完整源码包,面向金融交易领域的开发者、量化分析师及具备一定编程基础的技术人员,用于在自有平台中集成专业级行情图表与可视化分析能力。资源共包含 1212 个文件&a…

2026/10/17 18:34:59 阅读更多 →
Makefile变量机制深度解析:$@ $^ $< override origin原理与工程实践

Makefile变量机制深度解析:$@ $^ $< override origin原理与工程实践

1. 为什么你写的 Makefile 总是“改一行,全重编”?——从变量失控说起我带过不少刚接触构建系统的开发者,他们写完第一个 Makefile 后常会兴奋地跑make,结果发现:明明只改了一个.c文件,整个项目却从头开始编…

2026/10/17 18:34:59 阅读更多 →
【WorkBuddy专栏58】腾讯AI智能体「赛马」全景:7款产品对比与TaoToken统一接入实践

【WorkBuddy专栏58】腾讯AI智能体「赛马」全景:7款产品对比与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 18:34:59 阅读更多 →
卷积核参数量计算全解析:从标准卷积到转置卷积的公式与避坑指南

卷积核参数量计算全解析:从标准卷积到转置卷积的公式与避坑指南

很多人把卷积核参数计算当成背公式的活儿,但真正上手搭网络、调参、复现论文的时候,才会发现那些公式背后全是坑。我见过不少同学在群里问:为什么我的网络参数量和论文对不上?为什么改了分组卷积之后显存不降反升?其实…

2026/10/17 18:34:59 阅读更多 →
模型不稳?拆解AI自我优化与自我调节的底层机制

模型不稳?拆解AI自我优化与自我调节的底层机制

1. 项目初衷:当模型不再“听话”,我决定拆开它的内部调节机制做算法这几年,最常听到的抱怨就是“模型上线时好好的,过了俩月效果怎么越来越差”“同样的数据,别人跑出来就是比我强”。我以前也以为这是数据清洗和调参的…

2026/10/17 18:33:59 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →