客服工单智能处理系统 本项目是第七章 、 、 的综合实践案例,项目结构仿照 :一个主程序文件加一个说明文档,便于直接运行和阅读。 项目目标 系统模拟一个客服工单处理流程: 接收用户工单; 智能体自动分类并判断风险; 智能体生成客服回复草稿; 在草稿生成后暂停,等待人工复核; 人工通过、修改或驳回; 发送前做风险检查; 在真正发送前再次暂停,等待最终授权; 授权后恢复流程并模拟发送。 这个案例重点不是复杂业务,而是演示 LangGraph 的“可中断、可恢复、可人工介入”的工作流能力。 项目结构 核心知识点 interruptafter 代码中配置: 含义: 节点生成回复草稿后,流程立即暂停。人工可以查看草稿,再决定通过、修改或驳回。 适用场景: AI 生成邮件草稿后人工检查;
本项目是第七章 interrupt_before、interrupt_after、MemorySaver 的综合实践案例,项目结构仿照 WhoIsTheSpyDemo:一个主程序文件加一个说明文档,便于直接运行和阅读。
系统模拟一个客服工单处理流程:
这个案例重点不是复杂业务,而是演示 LangGraph 的“可中断、可恢复、可人工介入”的工作流能力。
TicketReviewAgentDemo/ ├── LICENSE ├── Readme.md ├── TicketReviewAgent.py └── img.png
代码中配置:
interrupt_after=["draft_solution"]
含义:draft_solution 节点生成回复草稿后,流程立即暂停。人工可以查看草稿,再决定通过、修改或驳回。
适用场景:
代码中配置:
interrupt_before=["send_reply"]
含义:流程即将进入 send_reply 节点前暂停。只有人工输入“确认发送”,系统才会继续执行真正的发送动作。
适用场景:
代码中配置:
memory = MemorySaver() app = graph.compile( checkpointer=memory, interrupt_after=["draft_solution"], interrupt_before=["send_reply"], )
MemorySaver 会把每次执行的状态保存到 thread_id 对应的检查点里。中断后继续执行时,不需要重新跑前面的节点,只需要使用同一个 thread_id 调用:
app.invoke(None, config=config)
人工审核结果会先写入同一个 checkpoint:
app.update_state(config, {"human_review": "approve"})
再从中断点恢复:
app.stream(None, config=config)
项目默认从根目录 .env 读取模型配置:
API_KEY=你的模型密钥 BASE_URL=https://api.deepseek.com MODEL=deepseek-chat
如果没有配置 API_KEY,脚本会使用内置兜底内容演示 LangGraph 流程,方便先理解中断和恢复逻辑。
在项目根目录执行:
python project/TicketReviewAgentDemo/TicketReviewAgent.py
交互流程中,你会看到两次暂停:
也可以使用自动演示模式:
python project/TicketReviewAgentDemo/TicketReviewAgent.py --auto
自动演示模式会自动通过人工复核,并自动确认发送,适合课堂演示或快速检查流程。
| 节点 | 作用 |
|---|---|
classify_ticket |
分析工单类型、风险等级和摘要 |
draft_solution |
生成客服回复草稿,执行后触发 interrupt_after |
human_review |
接收人工审核结果,通过、修改或驳回 |
risk_check |
发送前风险检查 |
send_reply |
模拟发送客服回复,执行前触发 interrupt_before |
show_final_result |
输出审计记录 |
你可以继续扩展这个 Demo:
send_reply 替换为真实邮件 API;MemorySaver 换成数据库持久化 Checkpointer;
本项目遵循 MIT License,详见 LICENSE 文件。