LangGraph教程(四):智能客服实战指南

LangGraph教程(四):智能客服项目示例(流程+完整代码)

一、项目背景与目标

在传统客服场景中,人工客服需要处理大量重复性问题,效率低下且成本高昂。基于LangGraph的智能客服系统通过状态机管理对话流程,结合大语言模型(LLM)实现意图识别、信息检索和响应生成,能够显著提升服务效率。本示例将实现一个支持多轮对话的智能客服,具备以下功能:

  1. 意图分类(如查询订单、投诉建议)
  2. 实体抽取(订单号、用户ID等)
  3. 工具调用(数据库查询、API调用)
  4. 上下文管理(多轮对话状态跟踪)

二、核心流程设计

1. 状态机架构

采用LangGraph的StateGraph构建有限状态机,定义5个核心状态:

  1. from langgraph.prebuilt import StateGraph
  2. class CustomerServiceStates:
  3. INIT = "init"
  4. INTENT_RECOGNITION = "intent_recognition"
  5. ENTITY_EXTRACTION = "entity_extraction"
  6. TOOL_INVOCATION = "tool_invocation"
  7. RESPONSE_GENERATION = "response_generation"

2. 状态转移逻辑

当前状态 触发条件 下一状态 数据流
INIT 用户输入 INTENT_RECOGNITION 原始文本
INTENT_RECOGNITION 意图分类完成 ENTITY_EXTRACTION 意图标签
ENTITY_EXTRACTION 实体抽取完成 TOOL_INVOCATION 结构化参数
TOOL_INVOCATION 工具返回结果 RESPONSE_GENERATION 工具输出
RESPONSE_GENERATION 响应生成完成 INIT 客服回复

3. 工具集成设计

定义3类工具接口:

  1. class CustomerServiceTools:
  2. def query_order(self, order_id: str) -> dict:
  3. """模拟订单查询"""
  4. return {"status": "shipped", "tracking": "123456"}
  5. def log_complaint(self, user_id: str, content: str) -> str:
  6. """记录投诉"""
  7. return f"Complaint from {user_id} logged"
  8. def fetch_faq(self, query: str) -> str:
  9. """知识库检索"""
  10. return "Standard FAQ response"

三、完整代码实现

1. 环境准备

  1. pip install langgraph openai python-dotenv

2. 主程序实现

  1. import os
  2. from dotenv import load_dotenv
  3. from langgraph.prebuilt import StateGraph
  4. from langchain_community.llms import OpenAI
  5. from langchain_core.prompts import ChatPromptTemplate
  6. from langchain_core.output_parsers import StructuredOutputParser
  7. load_dotenv()
  8. class CustomerServiceAgent:
  9. def __init__(self):
  10. self.llm = OpenAI(temperature=0.3)
  11. self.tools = CustomerServiceTools()
  12. self.graph = self._build_graph()
  13. def _build_graph(self):
  14. graph = StateGraph(CustomerServiceStates.INIT)
  15. # 意图识别节点
  16. graph.add_node(
  17. CustomerServiceStates.INTENT_RECOGNITION,
  18. self._recognize_intent
  19. )
  20. # 实体抽取节点
  21. graph.add_node(
  22. CustomerServiceStates.ENTITY_EXTRACTION,
  23. self._extract_entities
  24. )
  25. # 工具调用节点
  26. graph.add_node(
  27. CustomerServiceStates.TOOL_INVOCATION,
  28. self._invoke_tool
  29. )
  30. # 响应生成节点
  31. graph.add_node(
  32. CustomerServiceStates.RESPONSE_GENERATION,
  33. self._generate_response
  34. )
  35. # 定义状态转移
  36. graph.set_edge(
  37. CustomerServiceStates.INIT,
  38. CustomerServiceStates.INTENT_RECOGNITION,
  39. condition=lambda x: True
  40. )
  41. graph.set_edge(
  42. CustomerServiceStates.INTENT_RECOGNITION,
  43. CustomerServiceStates.ENTITY_EXTRACTION,
  44. condition=lambda x: x.get("intent") in ["query_order", "complaint"]
  45. )
  46. # ...其他边定义
  47. return graph
  48. def _recognize_intent(self, input_text: str):
  49. prompt = ChatPromptTemplate.from_template("""
  50. 用户说: {input_text}
  51. 请分类意图,选项: 查询订单/投诉建议/一般咨询
  52. """)
  53. message = prompt.format_message(input_text=input_text)
  54. response = self.llm.invoke([message])
  55. return {"intent": response.content.strip()}
  56. def _extract_entities(self, state: dict):
  57. intent = state["intent"]
  58. input_text = state["input_text"]
  59. if intent == "query_order":
  60. parser = StructuredOutputParser.from_response_schema(
  61. {"type": "object", "properties": {"order_id": {"type": "string"}}}
  62. )
  63. prompt = ChatPromptTemplate.from_template("""
  64. 从以下文本提取订单号: {input_text}
  65. 输出格式: {{"order_id": "XXX"}}
  66. """)
  67. # ...实现实体抽取逻辑
  68. return {"entities": {"order_id": "123"}} # 简化示例
  69. # ...其他意图处理
  70. def run(self, input_text: str):
  71. state = {"input_text": input_text}
  72. while True:
  73. current_state = state.get("current_state", CustomerServiceStates.INIT)
  74. if current_state == CustomerServiceStates.RESPONSE_GENERATION:
  75. response = self._generate_response(state)
  76. return response
  77. # ...状态机执行逻辑

3. 工具类实现

  1. class CustomerServiceTools:
  2. def query_order(self, order_id: str) -> dict:
  3. # 实际应连接数据库
  4. return {
  5. "status": "delivered",
  6. "items": [{"name": "Product A", "qty": 1}],
  7. "tracking": f"TRACK{order_id}"
  8. }
  9. def log_complaint(self, user_id: str, content: str) -> str:
  10. # 实际应写入投诉系统
  11. return f"Complaint #{len(self.complaints)+1} logged: {content[:50]}..."
  12. def fetch_faq(self, query: str) -> str:
  13. # 实际应查询知识库
  14. faq_db = {
  15. "return policy": "30天无理由退换",
  16. "shipping fee": "满99元免运费"
  17. }
  18. return faq_db.get(query.lower(), "未找到相关答案")

四、关键技术点解析

1. 上下文管理

使用状态字典维护对话上下文:

  1. class DialogState:
  2. def __init__(self):
  3. self.history = []
  4. self.current_intent = None
  5. self.entities = {}
  6. def update(self, new_state: dict):
  7. self.history.append(new_state)
  8. if "intent" in new_state:
  9. self.current_intent = new_state["intent"]
  10. if "entities" in new_state:
  11. self.entities.update(new_state["entities"])

2. 错误处理机制

实现三级容错:

  1. 输入校验层:过滤无效字符
  2. 模型输出校验:验证JSON结构
  3. 工具调用重试:3次重试机制

3. 性能优化

  • 缓存常用FAQ响应
  • 异步工具调用
  • 意图分类模型微调

五、部署与扩展建议

1. 部署方案

  1. graph LR
  2. A[用户请求] --> B[API网关]
  3. B --> C[负载均衡器]
  4. C --> D[客服实例集群]
  5. D --> E[Redis缓存]
  6. D --> F[PostgreSQL数据库]

2. 扩展方向

  1. 多语言支持:添加语言检测模块
  2. 情感分析:集成情绪识别模型
  3. 主动学习:收集难例优化模型

六、完整运行示例

  1. if __name__ == "__main__":
  2. agent = CustomerServiceAgent()
  3. # 测试用例1:订单查询
  4. print("测试订单查询:")
  5. response = agent.run("我的订单12345到哪里了?")
  6. print(response)
  7. # 测试用例2:投诉处理
  8. print("\n测试投诉处理:")
  9. response = agent.run("我要投诉,物流太慢了!")
  10. print(response)

七、最佳实践总结

  1. 状态设计原则:每个状态应对应明确的业务动作
  2. 工具调用规范
    • 工具接口应保持无状态
    • 输入参数严格校验
    • 输出结果标准化
  3. 模型优化方向
    • 微调专用意图分类模型
    • 构建领域特定的实体识别模型
    • 使用RAG增强知识库查询

本实现通过LangGraph的状态机架构,将复杂的对话流程分解为可管理的模块,结合LLM的语义理解能力和工具集成,构建出可扩展的智能客服系统。实际部署时建议增加监控模块,跟踪意图识别准确率、工具调用成功率等关键指标。