LangGraph + 真实LLM 智能客服助手
这是一个集成了真实大语言模型的LangGraph高级案例,展示如何构建一个企业级的智能客服助手系统。本案例从基础的聊天机器人进阶到完整的客服工作流系统,具备以下核心功能:
核心功能模块:
-
问题理解与分类 - 使用LLM智能识别问题类型
- 多维度分类:技术支持、账户问题、产品咨询、投诉建议等
- 置信度评估:确保分类的准确性和可靠性
- 动态分类规则:支持新问题类型的快速适配
-
情感分析 - 识别用户情绪和紧急程度
- 情感维度:积极、中性、消极、沮丧、愤怒等多层次情感识别
- 紧急度评估:low/medium/high 三级紧急程度判断
- 情感变化追踪:监控对话过程中的情感变化趋势
-
知识库搜索 - 基于分类和关键词的智能搜索
- 多策略搜索:关键词匹配、语义搜索、同义词扩展
- 相关性评分:基于多种因素的智能排序算法
- 动态索引:支持知识库的实时更新和优化
-
智能回答生成 - 结合上下文和知识库的回答
- 上下文感知:基于对话历史和用户状态生成个性化回答
- 模板化回答:确保回答的专业性和一致性
- 情感适应:根据用户情绪调整回答的语调和风格
-
升级判断 - 多维度评估是否需要人工客服
- 智能路由:基于多个维度的综合评估决策
- 优先级管理:确保重要问题得到及时处理
- 升级策略:灵活的升级规则和降级机制
核心架构特点:
企业级设计理念:
- 真实LLM集成(OpenAI GPT/通义千问/文心一言等)
- 复杂的多节点工作流设计
- 基于多因素的智能路由决策
- 完整的状态管理和追踪系统
- 结构化的LLM输出解析
- 错误处理和降级策略
可扩展性考虑:
- 模块化的节点设计,便于功能扩展
- 标准化的状态接口,支持新节点的无缝集成
- 配置化的决策规则,支持业务规则的动态调整
- 插件式的工具集成,便于添加新的外部服务
高可用性保障:
- 多层次的错误处理和恢复机制
- 优雅的降级策略,确保系统的持续可用
- 完善的日志和监控体系
- 性能优化和资源管理
技术亮点:
提示工程创新:
- JSON结构化提示工程:确保LLM输出的一致性和可解析性
- 上下文窗口优化:有效管理长对话的上下文信息
- 多轮对话支持:保持对话的连贯性和上下文记忆
- 错误恢复提示:处理LLM输出异常的自动修复机制
LLM集成最佳实践:
- 多提供商适配:支持OpenAI、通义千问、文心一言等多种LLM
- 统一接口抽象:屏蔽不同LLM的API差异
- 成本控制策略:智能的请求优化和缓存机制
- 性能监控:实时监控LLM调用的性能和成本
工作流优化:
- 状态驱动的决策逻辑:基于完整状态信息的智能决策
- 知识库智能匹配算法:多维度的知识检索和排序
- 情感驱动的服务升级:基于情感分析的动态服务调整
- 全流程可观测性:完整的处理过程记录和分析
业务价值:
客户体验提升:
- 24/7 全天候服务:无间断的客户支持
- 快速响应时间:秒级的问题分析和回答
- 个性化服务:基于用户历史和偏好的定制化回答
- 情感感知服务:根据用户情绪提供适当的关怀
运营效率优化:
- 智能分流:自动识别并分配合适的处理方式
- 工作负载均衡:合理分配人工和AI的工作量
- 知识管理:统一的知识库和经验积累
- 质量监控:全面的服务质量评估和改进
成本控制:
- 人力成本降低:AI处理大部分常规问题
- 培训成本减少:标准化的服务流程和知识库
- 响应时间缩短:减少客户等待时间
- 满意度提升:提高客户满意度和忠诚度
学习目标:
初级开发者:
- 理解企业级LangGraph应用的设计模式
- 掌握真实LLM的集成和调用方法
- 学会结构化提示工程的最佳实践
- 了解客服业务的核心流程和挑战
中级开发者:
- 掌握复杂状态管理和工作流设计
- 学会多维度决策逻辑的实现
- 理解企业级应用的错误处理策略
- 掌握性能优化和成本控制技巧
高级开发者:
- 学会可扩展架构的设计原则
- 掌握多模态和多轮对话的处理技术
- 理解企业级部署和运维考虑
- 学会系统监控和持续优化方法
实际应用场景:
电商客服:
- 订单查询和处理
- 产品咨询和推荐
- 售后服务和退换货
- 投诉处理和满意度调查
金融客服:
- 账户查询和操作指导
- 产品介绍和风险提示
- 交易问题和争议处理
- 合规要求和安全提醒
技术支持:
- 产品使用指导
- 故障诊断和解决
- 技术文档和资源推荐
- 版本更新和新功能介绍
企业内部服务:
- IT支持和设备管理
- HR政策咨询和流程指导
- 财务报销和审批流程
- 行政服务和资源申请
扩展方向:
技术扩展:
- 集成语音识别和合成:支持语音客服
- 多模态理解:图片、文档、视频的智能处理
- 实时翻译:多语言客服支持
- 知识图谱:更智能的知识推理和关联
业务扩展:
- CRM集成:客户信息管理和历史记录
- 工单系统:完整的问题跟踪和处理流程
- 分析dashboard:服务质量和效率分析
- A/B测试:持续优化和改进验证
智能化升级:
- 机器学习模型:个性化推荐和预测
- 自动化工作流:复杂业务流程的自动化
- 智能质检:自动化的服务质量评估
- 预测性服务:主动识别和解决潜在问题
这个案例不仅是技术演示,更是企业级AI客服系统的完整实现参考,
涵盖了从技术架构到业务应用的各个层面,为实际项目提供宝贵的经验和指导。
import os
import json
from typing import Dict, List, TypedDict, Annotated, Literal
from datetime import datetime
# LangChain 核心组件 - 提供LLM抽象和消息管理
from langchain_core.messages import BaseMessage, HumanMessage, AIMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import JsonOutputParser, StrOutputParser
# LangGraph 组件 - 提供工作流编排能力
from langgraph.graph import StateGraph, END
from langgraph.graph.message import add_messages
LLM 提供商集成 - 支持多种LLM服务,适配不同的LLM提供商,体现了企业级应用的兼容性考虑
try:
# OpenAI API兼容的服务(包括各种国产大模型)
# 这种导入方式支持OpenAI官方API以及兼容OpenAI接口的其他服务
from langchain_openai import ChatOpenAI
LLM_AVAILABLE = "openai"
except ImportError:
try:
# 阿里云通义千问 - 国产大模型的集成示例
from langchain_community.llms import Tongyi
LLM_AVAILABLE = "tongyi"
except ImportError:
try:
# 百度文心一言 - 另一个主流国产大模型
from langchain_community.chat_models import QianfanChatEndpoint
LLM_AVAILABLE = "qianfan"
except ImportError:
# 如果所有LLM都不可用,系统会使用模拟模式
LLM_AVAILABLE = None
配置和初始化
配置类 - 集中管理所有配置参数,企业级配置管理设计原则:
-
分离关注点(Separation of Concerns):
- 将配置与业务逻辑分离
- 不同类型的配置分组管理
- 便于不同环境的配置切换
-
安全性考虑:
- 敏感信息(如API密钥)应从环境变量读取
- 支持配置加密和访问控制
- 避免在代码中硬编码敏感信息
-
可维护性:
- 配置项命名规范,易于理解
- 提供合理的默认值
- 支持配置验证和类型检查
-
扩展性:
- 支持动态配置更新
- 便于添加新的配置项
- 支持配置的继承和覆盖
实际应用中的配置管理最佳实践:
-
多环境支持:
- 开发环境(dev):使用测试数据和宽松的配置
- 测试环境(test):模拟生产环境的配置
- 生产环境(prod):严格的安全和性能配置
-
配置来源优先级:
- 环境变量 > 配置文件 > 默认值
- 支持配置的动态覆盖和热更新
- 提供配置来源的可追溯性
-
配置验证:
- 启动时验证配置的完整性和正确性
- 提供配置错误的详细诊断信息
- 支持配置的向后兼容性检查
-
监控和审计:
- 记录配置的变更历史
- 监控配置的使用情况和性能影响
- 支持配置回滚和紧急修复
class Config:
# === API配置 ===
# 注意:在生产环境中,API密钥应该从环境变量获取,而不是硬编码
# 示例:OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
OPENAI_API_KEY = "123-********-4576"
OPENAI_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3"
# === 模型配置 ===
# 这些参数控制LLM的行为特征,需要根据具体业务需求调优
MODEL_NAME = "deepseek-v3-250324" # 模型名称 - 选择合适的模型版本
TEMPERATURE = 0.7 # 控制输出随机性,0.7提供创造性和一致性的平衡
# 0.0 = 完全确定性,1.0 = 高度随机性
MAX_TOKENS = 1000 # 限制输出长度,控制成本和响应时间
初始化大语言模型
LLM初始化的企业级设计考虑:
-
多提供商支持策略:
- 主备模式:主要LLM失败时自动切换到备用LLM
- 负载均衡:根据性能和成本在多个LLM间分配请求
- 能力适配:根据任务类型选择最适合的LLM
-
初始化最佳实践:
- 延迟初始化:只在实际使用时创建LLM实例
- 连接池管理:复用连接,减少建立连接的开销
- 超时配置:合理设置请求超时时间
- 重试机制:处理网络异常和临时故障
-
成本控制策略:
- 请求缓存:缓存相似请求的结果
- 批量处理:合并多个小请求减少API调用次数
- 模型选择:根据任务复杂度选择合适的模型
- 使用监控:实时监控API使用量和成本
-
性能优化:
- 异步调用:使用异步I/O提高并发性能
- 流式输出:对于长文本生成使用流式API
- 预热机制:系统启动时预热模型连接
- 性能监控:监控响应时间和成功率
降级策略设计:
-
服务降级层次:
- Level 1:主要LLM服务正常
- Level 2:切换到备用LLM服务
- Level 3:使用本地模型或缓存结果
- Level 4:返回预定义的安全回答
-
降级触发条件:
- API错误率超过阈值
- 响应时间超过预期
- 成本超出预算限制
- 服务维护或升级
-
降级恢复机制:
- 健康检查:定期检测服务恢复状态
- 逐步恢复:从低风险请求开始恢复
- 性能验证:确保恢复后的服务质量
- 用户通知:适当的用户体验管理
def initialize_llm():
if LLM_AVAILABLE == "openai":
# 使用OpenAI兼容的API(可以是OpenAI、Azure、或其他兼容服务)
# 这种配置方式支持多种兼容OpenAI API的服务,包括:
# - OpenAI 官方API
# - Azure OpenAI Service
# - 各种国产大模型的OpenAI兼容接口
# - 私有部署的兼容服务
return ChatOpenAI(
model=Config.MODEL_NAME,
temperature=Config.TEMPERATURE,
max_tokens=Config.MAX_TOKENS,
openai_api_key=Config.OPENAI_API_KEY,
openai_api_base=Config.OPENAI_BASE_URL
)
else:
# 如果没有可用的LLM,返回模拟器
# 这确保了系统的可用性,即使在没有API访问的情况下也能演示
# 在实际应用中,这里应该实现更完善的降级策略
return MockLLM()
模拟LLM类 - 用于演示和测试
模拟服务的设计价值:
-
开发阶段支持:
- 离线开发:无需网络连接即可开发和测试
- 成本控制:避免开发阶段的API调用费用
- 稳定测试:提供一致和可预测的测试结果
- 功能验证:专注于业务逻辑而非API集成
-
系统可靠性:
- 降级保障:在真实LLM不可用时提供基础服务
- 性能基准:作为性能对比的基准线
- 错误处理:测试系统在异常情况下的表现
- 文档演示:提供一致的演示效果
-
模拟策略设计:
- 真实性:模拟结果应该尽可能接近真实LLM的输出
- 多样性:提供多种类型的模拟响应
- 可配置性:支持不同场景的模拟配置
- 调试友好:提供清晰的模拟逻辑和状态
企业级模拟服务实现:
-
数据驱动:
- 使用真实的历史数据训练模拟模型
- 基于统计分析生成符合分布的随机响应
- 支持A/B测试和效果验证
-
动态响应:
- 根据输入内容生成相应的模拟输出
- 支持上下文感知的响应生成
- 模拟真实LLM的响应时间特征
-
配置化管理:
- 支持不同场景的模拟配置
- 允许运行时调整模拟行为
- 提供模拟质量的评估指标
class MockLLM:
def invoke(self, messages):
"""
模拟LLM调用 - 根据输入类型返回相应的模拟响应
智能响应生成策略:
=================
1. 内容分析:
- 关键词匹配:识别输入中的关键概念
- 意图识别:理解用户的查询意图
- 上下文理解:考虑对话的历史记录
2. 响应生成:
- 模板匹配:基于预定义模板生成响应
- 动态组合:组合多个信息片段形成完整响应
- 格式保证:确保输出格式的一致性和可解析性
3. 质量控制:
- 长度适中:控制响应的长度符合预期
- 逻辑一致:确保响应在逻辑上合理
- 格式正确:特别是JSON格式的正确性
模拟响应的业务价值:
===================
1. 功能验证:
- 验证工作流的完整性和正确性
- 测试异常情况的处理能力
- 评估系统的性能特征
2. 用户体验:
- 在真实LLM不可用时提供基础服务
- 为用户提供一致的交互体验
- 避免系统完全不可用的情况
3. 开发效率:
- 加速开发和测试周期
- 降低开发和调试成本
- 提供稳定的开发环境
"""
# 处理不同类型的输入格式
# 这种兼容性设计确保了模拟器能够处理各种调用方式
if isinstance(messages, list):
user_content = messages[-1].content if messages else ""
else:
user_content = str(messages)
# 根据内容类型返回不同的模拟响应
# 这些响应模拟了真实LLM可能产生的结构化输出
if "分类" in user_content or "category" in user_content.lower():
# 模拟问题分类的JSON响应
# 这种结构化的响应确保了后续处理的一致性
return AIMessage(content='{"category": "技术支持", "confidence": 0.85, "reason": "用户询问技术相关问题"}')
elif "情感" in user_content or "sentiment" in user_content.lower():
# 模拟情感分析的JSON响应
# 包含多个维度的情感信息,便于后续的决策处理
return AIMessage(content='{"sentiment": "neutral", "score": 0.6, "emotion": "平静"}')
else:
# 默认的文本回答
# 提供友好的用户体验,即使在模拟模式下也要保持专业性
return AIMessage(content="这是一个模拟的LLM响应。请配置真实的API密钥以获得更好的效果。")
状态定义
客服助手状态定义 - 复杂业务场景的状态设计
企业级状态设计哲学:
-
业务完整性原则:
- 全流程覆盖:状态应该覆盖整个客服流程的所有环节
- 数据完整性:确保重要的业务数据不会丢失
- 状态一致性:不同节点对状态的理解应该一致
- 版本兼容性:支持状态结构的演进和升级
-
可扩展性设计:
- 模块化结构:将相关的状态字段分组管理
- 预留扩展:为未来的功能扩展预留空间
- 嵌套支持:支持复杂的嵌套数据结构
- 配置灵活性:允许运行时的状态配置调整
-
性能考虑:
- 内存效率:避免存储过大的状态对象
- 序列化优化:确保状态的高效序列化和反序列化
- 访问模式:优化常用字段的访问性能
- 缓存友好:设计便于缓存的状态结构
客服业务状态设计考虑:
-
客户体验相关:
- 完整的对话历史记录
- 情感变化的跟踪记录
- 个性化偏好和历史
- 服务质量评估数据
-
业务流程管理:
- 问题分类和路由信息
- 处理优先级和时限
- 升级条件和触发机制
- 质量监控和评估指标
-
运营数据分析:
- 完整的处理步骤记录
- 性能指标和时间统计
- 决策过程和依据记录
- 异常情况和错误日志
实际应用中的状态扩展:
-
用户维度扩展:
- 用户画像和偏好
- 历史问题和解决方案
- 满意度和反馈记录
- VIP等级和特殊需求
-
业务维度扩展:
- 产品信息和版本
- 订单状态和历史
- 账户信息和权限
- 合规要求和限制
-
技术维度扩展:
- 渠道信息(Web、App、电话等)
- 设备信息和环境
- 性能指标和监控数据
- 安全验证和审计日志
class CustomerServiceState(TypedDict):
# === 基本信息 ===
# 这部分存储会话的基础标识和时间信息,用于追踪和管理
user_id: str # 用户唯一标识 - 支持个性化服务和历史追踪
session_id: str # 会话唯一标识 - 用于追踪单次对话的完整过程
timestamp: str # 时间戳 - 记录处理开始时间,支持性能分析和审计
# === 用户输入 ===
# 存储用户的原始输入和对话历史,是整个处理流程的数据源
user_question: str # 用户的原始问题 - 保持问题的原始性和完整性
messages: Annotated[List[BaseMessage], add_messages] # 完整的对话历史
# 使用add_messages确保消息的自动管理和去重
# === 分析结果 ===
# 存储各种AI分析的结果,是后续决策的重要依据
question_category: str # 问题分类结果(技术支持/账户问题/产品咨询/投诉建议等)
# 支持多级分类和动态分类规则
category_confidence: float # 分类的置信度(0-1)- 用于评估分类结果的可靠性
sentiment_analysis: Dict # 情感分析的详细结果
# 包含情感倾向、强度、关键词等多维度信息
# === 知识库相关 ===
# 管理知识检索和应用的相关信息
knowledge_results: List[Dict] # 知识库搜索的结果列表
# 每个结果包含内容、来源、相关性评分等信息
relevant_info: str # 提取的相关信息摘要
# 格式化后的知识内容,便于生成回答
# === 决策相关 ===
# 存储各种业务决策的结果和依据
need_human_handover: bool # 是否需要转接人工客服
# 基于多维度评估的最终决策结果
urgency_level: str # 紧急程度级别(low/medium/high)
# 影响处理优先级和资源分配
# === 输出结果 ===
# 存储最终的输出和建议,直接影响用户体验
ai_response: str # AI生成的最终回答
# 经过多轮优化和格式化的用户友好回答
suggested_actions: List[str] # 系统建议的后续操作
# 为用户或客服人员提供的行动建议
# === 元数据和追踪 ===
# 记录处理过程的详细信息,支持监控、调试和优化
processing_steps: List[str] # 处理步骤的详细记录
# 完整的流程追踪,便于问题排查和流程优化
confidence_scores: Dict # 各环节的置信度分数
# 量化的质量评估,支持持续改进
知识库模拟
模拟企业知识库 - 结构化的知识管理,在实际应用中,这通常是:
- 关系数据库(MySQL、PostgreSQL)
- 文档数据库(MongoDB、Elasticsearch)
- 向量数据库(Pinecone、Weaviate、Chroma)
- 图数据库(Neo4j)
KNOWLEDGE_BASE = {
"技术支持": [
{
"id": "tech_001",
"title": "登录问题解决方案",
"content": "如果无法登录,请先检查用户名密码是否正确,然后尝试清除浏览器缓存,如果问题持续存在,请联系技术支持。",
"tags": ["登录", "密码", "账户"],
"priority": "high", # 优先级
"last_updated": "2024-01-15" # 最后更新时间
},
{
"id": "tech_002",
"title": "网络连接故障排查",
"content": "网络连接问题可能由多种原因造成:1)检查网络连接状态;2)重启路由器;3)检查防火墙设置;4)联系网络服务提供商。",
"tags": ["网络", "连接", "故障"],
"priority": "medium",
"last_updated": "2024-01-10"
},
{
"id": "tech_003",
"title": "软件安装指南",
"content": "软件安装步骤:1)下载官方安装包;2)以管理员身份运行;3)按照向导完成安装;4)重启系统。如有问题请查看安装日志。",
"tags": ["软件", "安装", "设置"],
"priority": "low",
"last_updated": "2024-01-05"
}
],
"账户问题": [
{
"id": "account_001",
"title": "忘记密码处理流程",
"content": "忘记密码可以通过以下方式重置:1)点击登录页面的'忘记密码';2)输入注册邮箱;3)查收重置邮件;4)按邮件指引重置密码。",
"tags": ["密码", "重置", "邮箱"],
"priority": "high",
"last_updated": "2024-01-12"
},
{
"id": "account_002",
"title": "账户被冻结的原因",
"content": "账户可能因以下原因被冻结:1)连续输入错误密码;2)异常登录行为;3)违反使用条款。请联系客服进行账户解冻。",
"tags": ["冻结", "安全", "解冻"],
"priority": "high",
"last_updated": "2024-01-08"
}
],
"产品咨询": [
{
"id": "product_001",
"title": "产品功能介绍",
"content": "我们的产品提供以下核心功能:1)智能数据分析;2)实时监控报警;3)自定义报表生成;4)多平台同步。支持试用版本。",
"tags": ["功能", "特性", "试用"],
"priority": "medium",
"last_updated": "2024-01-14"
},
{
"id": "product_002",
"title": "价格套餐说明",
"content": "我们提供三种套餐:基础版(免费)、专业版(99元/月)、企业版(299元/月)。企业版包含更多高级功能和优先技术支持。",
"tags": ["价格", "套餐", "付费"],
"priority": "medium",
"last_updated": "2024-01-11"
}
],
"投诉建议": [
{
"id": "complaint_001",
"title": "投诉处理流程",
"content": "我们重视每一个客户的反馈。投诉处理流程:1)记录问题详情;2)48小时内专人跟进;3)提供解决方案;4)回访确认满意度。",
"tags": ["投诉", "流程", "反馈"],
"priority": "high",
"last_updated": "2024-01-13"
}
]
}
搜索知识库
搜索知识库 - 智能知识检索算法,企业级知识检索系统设计:
-
多策略搜索引擎:
- 关键词搜索:基于TF-IDF和布尔匹配的传统搜索
- 语义搜索:使用词向量和句向量的语义理解
- 模糊搜索:支持拼写错误和同义词的智能匹配
- 全文搜索:支持复杂查询语法和高级过滤
-
相关性排序算法:
- 文本匹配度:基于关键词重叠和权重的评分
- 语义相似度:使用预训练模型计算语义距离
- 业务优先级:结合文档重要性和时效性
- 用户反馈:基于历史点击和满意度数据
-
查询优化策略:
- 查询重写:自动扩展和优化用户查询
- 分词处理:中文分词和词性标注
- 同义词扩展:使用同义词词典增强召回
- 个性化:基于用户历史和偏好调整结果
实际应用中的高级特性:
-
智能推荐:
- 相关问题推荐:基于当前问题推荐类似问题
- 热门问题:统计和推荐高频问题
- 个性化推荐:基于用户画像的定制推荐
- 实时趋势:基于当前热点的动态推荐
-
知识质量管理:
- 内容审核:自动检测和标记低质量内容
- 更新提醒:基于时效性的内容更新提醒
- 用户反馈:收集用户对知识质量的评价
- A/B测试:测试不同版本内容的效果
-
性能优化:
- 索引优化:构建高效的搜索索引
- 缓存策略:缓存热门查询的结果
- 并行搜索:支持多数据源的并行查询
- 增量更新:支持知识库的增量更新
参数说明:
- query: 用户的搜索查询,可能包含自然语言问题
- category: 问题分类,用于缩小搜索范围提高精度
返回值:
返回按相关性排序的知识条目列表,每个条目包含:
- 原始知识内容和元数据
- 相关性评分和匹配信息
- 推荐理由和使用建议
def search_knowledge_base(query: str, category: str = None) -> List[Dict]:
results = []
# 第一步:基于分类过滤知识范围
# 这种分层搜索策略大大提高了搜索的精确度和效率
if category and category != "其他":
if category in KNOWLEDGE_BASE:
# 精确匹配分类 - 最理想的情况
knowledge_items = KNOWLEDGE_BASE[category]
else:
# 模糊匹配分类名称 - 处理分类识别不准确的情况
# 这种容错机制确保了系统的鲁棒性
knowledge_items = []
for kb_category, items in KNOWLEDGE_BASE.items():
if category in kb_category or kb_category in category:
knowledge_items.extend(items)
# 如果还是没有找到,搜索所有分类
if not knowledge_items:
for items in KNOWLEDGE_BASE.values():
knowledge_items.extend(items)
else:
# 搜索所有分类 - 兜底策略,确保总是有搜索结果
knowledge_items = []
for items in KNOWLEDGE_BASE.values():
knowledge_items.extend(items)
print(f" 搜索范围:{len(knowledge_items)} 个知识条目")
# 第二步:改进的关键词匹配算法
query_words = query.lower().split()
# 同义词映射 - 提高搜索召回率
# 在实际应用中,这通常来自:
# - 专业的同义词词典(如HowNet、WordNet)
# - 词向量模型的相似词计算
# - 用户行为数据的挖掘结果
# - 领域专家的知识整理
synonym_map = {
"冻结": ["冻结", "锁定", "被锁", "封"],
"账户": ["账户", "账号", "帐户", "帐号"],
"登录": ["登录", "登陆", "登入", "进入"],
"密码": ["密码", "口令", "秘码"],
"功能": ["功能", "特性", "能力"],
"价格": ["价格", "费用", "收费", "钱"],
"安装": ["安装", "下载", "部署"],
"网络": ["网络", "网", "连接"],
"投诉": ["投诉", "抱怨", "反馈"]
}
# 扩展查询词 - 使用同义词提高匹配率
expanded_words = set(query_words)
for word in query_words:
for key, synonyms in synonym_map.items():
if word in synonyms:
expanded_words.update(synonyms)
# 第三步:相关性评分算法
# 这是知识检索的核心算法,决定了搜索结果的质量
for item in knowledge_items:
score = 0
content_lower = (item["title"] + " " + item["content"]).lower()
tags_lower = [tag.lower() for tag in item["tags"]]
# 计算匹配分数 - 多因素评分模型
for word in expanded_words:
# 内容匹配(权重:1)
if word in content_lower:
score += 1
# 标签匹配(权重:3)- 标签通常更精确和重要
for tag in tags_lower:
if word in tag or tag in word:
score += 3
# 添加优先级加权 - 重要知识条目优先显示
# 这体现了业务优先级在搜索排序中的重要性
if item.get("priority") == "high":
score += 1
elif item.get("priority") == "medium":
score += 0.5
# 只保留有匹配的结果
if score > 0:
item_copy = item.copy()
item_copy["relevance_score"] = score
results.append(item_copy)
print(f" 匹配到 {len(results)} 个相关结果")
# 第四步:结果排序和截取
# 按分数排序,返回最相关的结果
results.sort(key=lambda x: x["relevance_score"], reverse=True)
return results[:3] # 返回最相关的3个结果,避免信息过载
节点函数定义
问题分类节点 - 使用LLM进行智能分类,这个节点展示了如何:
- 设计结构化的提示工程
- 处理LLM的JSON输出
- 实现错误处理和降级策略
- 记录处理过程和调试信息
提示工程最佳实践:
- 明确的任务描述
- 具体的分类标准
- 结构化的输出格式
- 示例和约束条件
错误处理策略:
- JSON解析失败的降级
- LLM调用异常的处理
- 默认值的合理设置
- 详细的错误记录
def question_classification_node(state: CustomerServiceState) -> CustomerServiceState:
print("🔍 正在分析和分类用户问题...")
# 初始化LLM - 支持多种提供商
llm = initialize_llm()
user_question = state["user_question"]
# 构建分类提示词 - 结构化提示工程的典型例子
classification_prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的客服问题分类专家。请分析用户问题并进行分类。
分类选项:
1. 技术支持 - 软件使用、故障排查、安装问题等
2. 账户问题 - 登录、密码、账户状态等
3. 产品咨询 - 功能介绍、价格、购买等
4. 投诉建议 - 服务投诉、意见建议等
5. 其他 - 不属于以上分类的问题
请严格按照以下JSON格式返回结果,不要添加任何额外的文字或格式:
{{"category": "分类名称", "confidence": 0.85, "reason": "分类理由"}}"""),
("user", "用户问题:{question}")
])
try:
print(f" 正在调用LLM进行分类...")
formatted_messages = classification_prompt.format_messages(question=user_question)
print(f" 发送给LLM的消息: {formatted_messages}")
response = llm.invoke(formatted_messages)
print(f" LLM调用成功,响应类型: {type(response)}")
# 处理LLM响应 - 清理和解析JSON输出
content = response.content.strip()
print(f" LLM原始响应:{content}")
# 清理响应格式 - 处理可能的Markdown格式包装
if content.startswith('```json'):
content = content.replace('```json', '').replace('```', '').strip()
elif content.startswith('```'):
content = content.replace('```', '').strip()
print(f" 清理后的内容:{repr(content)}")
# 多行内容处理 - 提取JSON部分
lines = content.split('\n')
json_line = None
for line in lines:
line = line.strip()
if line.startswith('{') and line.endswith('}'):
json_line = line
break
if json_line:
content = json_line
# JSON解析和数据提取
try:
print(f" 准备解析的JSON内容:{repr(content)}")
result = json.loads(content)
category = result.get("category", "其他")
confidence = result.get("confidence", 0.5)
reason = result.get("reason", "")
print(f" 解析成功:{result}")
except json.JSONDecodeError as je:
# JSON解析失败的降级处理
print(f" JSON解析失败:{je}")
print(f" 尝试解析的内容:{repr(content)}")
print(f" 内容长度:{len(content)}")
print(f" 内容类型:{type(content)}")
# 使用默认值确保系统继续运行
category = "其他"
confidence = 0.3
reason = f"JSON解析失败:{str(je)}"
except Exception as e:
# 全面的异常处理
print(f"分类失败:{e}")
print(f"异常类型:{type(e)}")
import traceback
print(f"详细错误信息:")
traceback.print_exc()
# 降级到安全的默认值
category = "其他"
confidence = 0.1
reason = f"分类过程出错:{str(e)}"
# 更新状态 - 记录分类结果和过程
state["question_category"] = category
state["category_confidence"] = confidence
state["processing_steps"].append(f"问题分类:{category} (置信度: {confidence:.2f})")
state["messages"].append(SystemMessage(content=f"问题已分类为:{category},理由:{reason}"))
# 输出处理结果
print(f" 分类结果:{category}")
print(f" 置信度:{confidence:.2f}")
print(f" 理由:{reason}")
return state
情感分析节点
情感分析节点 - 识别用户情绪和紧急程度,这个节点的重要性:
- 客服质量:理解用户情绪,提供合适的服务语调
- 优先级排序:紧急情况优先处理
- 升级决策:负面情绪可能需要人工介入
- 服务改进:情感数据可用于服务质量分析
情感分析的应用:
- 自动调整回复语调
- 识别服务升级需求
- 客户满意度监控
- 风险预警和干预
技术实现要点:
- 多维度情感识别
- 紧急程度量化
- 关键词提取
- 结构化输出
def sentiment_analysis_node(state: CustomerServiceState) -> CustomerServiceState:
print("😊 正在进行情感分析...")
llm = initialize_llm()
user_question = state["user_question"]
# 情感分析提示词 - 多维度情感识别
sentiment_prompt = ChatPromptTemplate.from_messages([
("system", """你是一个情感分析专家。请分析用户消息的情感倾向和紧急程度。
情感类别:
- positive: 积极正面
- neutral: 中性平和
- negative: 消极负面
- frustrated: 沮丧不满
- angry: 愤怒生气
紧急程度:
- low: 一般咨询,不紧急
- medium: 需要及时回复
- high: 紧急问题,需要立即处理
请严格按照以下JSON格式返回结果,不要添加任何额外的文字或格式:
{{"sentiment": "neutral", "score": 0.5, "urgency": "medium", "emotion": "具体情绪描述", "keywords": ["关键词1", "关键词2"]}}"""),
("user", "用户消息:{message}")
])
try:
print(f" 正在调用LLM进行情感分析...")
formatted_messages = sentiment_prompt.format_messages(message=user_question)
print(f" 发送给LLM的消息: {formatted_messages}")
response = llm.invoke(formatted_messages)
print(f" LLM调用成功,响应类型: {type(response)}")
# 响应处理流程(与分类节点类似)
content = response.content.strip()
print(f" LLM原始响应:{content}")
# 清理响应格式
if content.startswith('```json'):
content = content.replace('```json', '').replace('```', '').strip()
elif content.startswith('```'):
content = content.replace('```', '').strip()
print(f" 清理后的内容:{repr(content)}")
# 提取JSON部分
lines = content.split('\n')
json_line = None
for line in lines:
line = line.strip()
if line.startswith('{') and line.endswith('}'):
json_line = line
break
if json_line:
content = json_line
try:
print(f" 准备解析的JSON内容:{repr(content)}")
sentiment_result = json.loads(content)
print(f" 解析成功:{sentiment_result}")
except json.JSONDecodeError as je:
# 情感分析失败的降级处理
print(f" JSON解析失败:{je}")
print(f" 尝试解析的内容:{repr(content)}")
print(f" 内容长度:{len(content)}")
print(f" 内容类型:{type(content)}")
# 使用中性的默认值
sentiment_result = {
"sentiment": "neutral",
"score": 0.5,
"urgency": "medium",
"emotion": "平和",
"keywords": []
}
except Exception as e:
# 全面的异常处理
print(f"情感分析失败:{e}")
print(f"异常类型:{type(e)}")
import traceback
print(f"详细错误信息:")
traceback.print_exc()
# 降级到安全的默认值
sentiment_result = {
"sentiment": "neutral",
"score": 0.5,
"urgency": "medium",
"emotion": "未知",
"keywords": []
}
# 更新状态 - 保存情感分析结果
state["sentiment_analysis"] = sentiment_result
state["urgency_level"] = sentiment_result.get("urgency", "medium")
state["processing_steps"].append(f"情感分析:{sentiment_result.get('sentiment')} (强度: {sentiment_result.get('score', 0):.2f})")
# 输出分析结果
print(f" 情感:{sentiment_result.get('sentiment')}")
print(f" 强度:{sentiment_result.get('score', 0):.2f}")
print(f" 紧急程度:{sentiment_result.get('urgency')}")
return state
知识库搜索节点
知识库搜索节点 - 智能知识检索,这个节点的作用:
- 基于问题分类和内容搜索相关知识
- 为后续的回答生成提供信息支持
- 计算知识匹配的置信度
- 整理和格式化搜索结果
知识检索策略:
- 分类优先:先在对应分类中搜索
- 关键词匹配:使用分词和同义词
- 相关性排序:按匹配度排序结果
- 结果限制:避免信息过载
实际应用扩展:
- 向量语义搜索
- 机器学习排序
- 个性化推荐
- 实时更新索引
def knowledge_search_node(state: CustomerServiceState) -> CustomerServiceState:
print("📚 正在搜索知识库...")
user_question = state["user_question"]
category = state["question_category"]
# 调用知识库搜索函数
search_results = search_knowledge_base(user_question, category)
# 整理相关信息 - 格式化搜索结果用于后续处理
relevant_info = ""
if search_results:
relevant_info = "找到以下相关信息:\n"
for i, result in enumerate(search_results, 1):
# 格式化每个搜索结果
relevant_info += f"{i}. {result['title']}\n{result['content']}\n\n"
else:
relevant_info = "未找到直接相关的知识库信息。"
# 更新状态 - 保存搜索结果和格式化信息
state["knowledge_results"] = search_results
state["relevant_info"] = relevant_info
state["processing_steps"].append(f"知识库搜索:找到 {len(search_results)} 条相关结果")
# 输出搜索统计
print(f" 搜索结果:{len(search_results)} 条")
for result in search_results:
print(f" - {result['title']} (相关度: {result['relevance_score']})")
return state
智能回答生成节点
智能回答生成节点 - 整合上下文生成个性化回答,这个节点是整个客服系统的核心输出环节:
- 整合所有前置分析结果
- 生成个性化的客服回答
- 根据情感调整语调
- 提供后续操作建议
回答生成策略:
- 上下文感知:使用所有可用信息
- 情感适应:根据用户情绪调整语调
- 知识融合:优先使用知识库信息
- 降级处理:确保总是有合理回答
质量保证:
- 专业性:使用客服标准用语
- 完整性:提供充分的信息
- 可操作性:给出具体的解决步骤
- 友好性:保持良好的服务态度
def response_generation_node(state: CustomerServiceState) -> CustomerServiceState:
print("💬 正在生成智能回答...")
llm = initialize_llm()
# 收集所有上下文信息 - 整合前置节点的分析结果
user_question = state["user_question"]
category = state["question_category"]
sentiment = state["sentiment_analysis"]
knowledge_info = state["relevant_info"]
urgency = state["urgency_level"]
# 构建回答生成提示词 - 复杂的上下文整合
response_prompt = ChatPromptTemplate.from_messages([
("system", """你是一个专业的客服助手。请根据以下信息为用户生成有帮助的回答:
回答要求:
1. 语气要友好、专业、耐心
2. 根据用户情感调整语调(如果用户生气要更加耐心)
3. 优先使用知识库信息
4. 如果知识库没有答案,提供通用建议
5. 回答要具体、可执行
6. 适当表达歉意和理解
用户信息:
- 问题分类:{category}
- 情感状态:{sentiment}
- 紧急程度:{urgency}
知识库信息:
{knowledge_info}
请生成一个专业、有帮助的客服回答。"""),
("user", "用户问题:{question}")
])
try:
# 调用LLM生成回答
response = llm.invoke(response_prompt.format_messages(
category=category,
sentiment=sentiment.get("sentiment", "neutral"),
urgency=urgency,
knowledge_info=knowledge_info,
question=user_question
))
print(f" LLM原始响应:{response.content}")
ai_response = response.content
except Exception as e:
print(f"回答生成失败:{e}")
# 降级到通用回答模板
ai_response = f"感谢您的咨询。关于您提到的{category}问题,我已经记录了您的需求。我们会尽快为您提供解决方案。如果问题紧急,建议您联系我们的人工客服。"
# 生成建议操作 - 基于分析结果的智能建议
suggested_actions = []
# 基于紧急程度的建议
if urgency == "high":
suggested_actions.append("转接人工客服")
# 基于情感状态的建议
if sentiment.get("sentiment") in ["negative", "frustrated", "angry"]:
suggested_actions.append("情绪安抚")
suggested_actions.append("主管介入")
# 基于知识匹配的建议
if state["knowledge_results"]:
suggested_actions.append("提供相关文档链接")
# 更新状态 - 保存生成的回答和建议
state["ai_response"] = ai_response
state["suggested_actions"] = suggested_actions
state["processing_steps"].append("生成智能回答")
state["messages"].append(AIMessage(content=ai_response))
# 输出生成统计
print(f" 回答长度:{len(ai_response)} 字符")
print(f" 建议操作:{suggested_actions}")
return state
升级决策节点
升级决策节点 - 多维度评估是否需要人工介入,这个节点实现了智能客服的核心决策逻辑:
- 综合评估多个维度的指标
- 基于业务规则做出升级决策
- 记录决策过程和原因
- 为后续路由提供判断依据
决策维度:
- 情感因素:负面情绪需要人工关怀
- 紧急程度:高优先级问题需要快速响应
- 分类置信度:不确定的问题需要专家判断
- 知识匹配度:无法自动解决的问题
- 特殊关键词:涉及法律、投诉等敏感问题
业务价值:
- 提高客户满意度
- 优化人力资源配置
- 减少处理时间
- 降低服务成本
def escalation_decision_node(state: CustomerServiceState) -> CustomerServiceState:
print("⚖️ 正在判断是否需要人工介入...")
# 初始化决策变量
need_human = False
reasons = []
# 维度1:情感因素评估
sentiment = state["sentiment_analysis"]
if sentiment.get("sentiment") in ["angry", "frustrated"]:
need_human = True
reasons.append("用户情绪负面")
# 维度2:紧急程度评估
if state["urgency_level"] == "high":
need_human = True
reasons.append("问题紧急")
# 维度3:分类置信度评估
if state["category_confidence"] < 0.6:
need_human = True
reasons.append("问题分类不明确")
# 维度4:知识库匹配度评估
if not state["knowledge_results"]:
need_human = True
reasons.append("知识库无相关信息")
# 维度5:特殊关键词检测
# 某些敏感问题必须由人工处理
complaint_keywords = ["投诉", "退款", "赔偿", "法律", "起诉"]
if any(keyword in state["user_question"] for keyword in complaint_keywords):
need_human = True
reasons.append("涉及投诉或法律问题")
# 更新状态 - 记录决策结果和原因
state["need_human_handover"] = need_human
state["processing_steps"].append(f"升级判断:{'需要' if need_human else '不需要'}人工介入")
# 如果需要升级,添加详细说明
if need_human:
escalation_msg = f"建议转接人工客服。原因:{'; '.join(reasons)}"
state["messages"].append(SystemMessage(content=escalation_msg))
# 输出决策结果
print(f" 需要人工介入:{need_human}")
if reasons:
print(f" 原因:{'; '.join(reasons)}")
return state
条件判断函数
路由决策函数 - 决定工作流的最终路径,这是LangGraph条件边的实现,用于:
- 检查升级决策的结果
- 选择相应的处理路径
- 确保工作流的正确执行
返回值说明:
- “human_handover”: 转接人工客服
- “ai_response”: 使用AI回答结束
def should_escalate(state: CustomerServiceState) -> Literal["human_handover", "ai_response"]:
if state.get("need_human_handover", False):
return "human_handover"
else:
return "ai_response"
人工接管节点
人工接管节点 - 生成详细的交接信息,这个节点的职责:
- 整理完整的上下文信息
- 生成结构化的交接文档
- 提供处理建议和历史记录
- 确保人工客服能够快速上手
交接信息包含:
- 用户基本信息
- 问题分析结果
- 处理历史记录
- AI建议和推荐操作
- 注意事项和风险提示
业务价值:
- 提高人工客服效率
- 减少重复信息收集
- 保证服务连续性
- 提升客户体验
def human_handover_node(state: CustomerServiceState) -> CustomerServiceState:
print("👥 转接人工客服...")
# 生成详细的交接信息文档
handover_info = f"""
=== 客服交接信息 ===
用户ID: {state['user_id']}
问题分类: {state['question_category']} (置信度: {state['category_confidence']:.2f})
情感状态: {state['sentiment_analysis'].get('sentiment', 'unknown')}
紧急程度: {state['urgency_level']}
用户问题: {state['user_question']}
处理步骤: {' -> '.join(state['processing_steps'])}
知识库搜索结果: {len(state['knowledge_results'])} 条
AI建议回答: {state.get('ai_response', '未生成')}
建议操作: {', '.join(state['suggested_actions'])}
"""
# 生成最终的客户回复
final_response = "您的问题已转接给人工客服,我们的专业客服人员会尽快为您处理。感谢您的耐心等待。"
# 更新状态
state["ai_response"] = final_response
state["messages"].append(AIMessage(content=final_response))
state["messages"].append(SystemMessage(content=handover_info))
state["processing_steps"].append("转接人工客服")
print(" 已生成交接信息")
return state
工作流构建
创建客服助手工作流图 - 复杂业务流程的编排,这个函数展示了企业级应用的工作流设计:
- 多节点的顺序处理
- 复杂的条件路由
- 状态的完整传递
- 错误处理和降级
工作流特点:
- 线性处理:问题分析 -> 情感分析 -> 知识搜索 -> 回答生成 -> 升级决策
- 条件分支:最后基于升级决策选择AI回答或人工接管
- 状态驱动:每个节点都基于完整的状态信息做决策
- 可扩展性:易于添加新的处理节点
业务流程设计原则:
- 用户体验优先
- 处理效率最大化
- 错误容忍和恢复
- 数据完整性保证
def create_customer_service_graph():
print("🏗️ 正在构建智能客服工作流...")
# 创建状态图 - 定义工作流的状态管理
workflow = StateGraph(CustomerServiceState)
# 添加处理节点 - 每个节点负责特定的业务逻辑
workflow.add_node("classify_question", question_classification_node) # 问题分类
workflow.add_node("analyze_sentiment", sentiment_analysis_node) # 情感分析
workflow.add_node("search_knowledge", knowledge_search_node) # 知识搜索
workflow.add_node("generate_response", response_generation_node) # 回答生成
workflow.add_node("decide_escalation", escalation_decision_node) # 升级决策
workflow.add_node("human_handover", human_handover_node) # 人工接管
# 设置工作流入口点
workflow.set_entry_point("classify_question")
# 添加线性处理边 - 定义主要的处理流程
workflow.add_edge("classify_question", "analyze_sentiment") # 分类 -> 情感分析
workflow.add_edge("analyze_sentiment", "search_knowledge") # 情感分析 -> 知识搜索
workflow.add_edge("search_knowledge", "generate_response") # 知识搜索 -> 回答生成
workflow.add_edge("generate_response", "decide_escalation") # 回答生成 -> 升级决策
# 添加条件分支边 - 基于升级决策选择最终路径
workflow.add_conditional_edges(
"decide_escalation", # 决策节点
should_escalate, # 条件函数
{
"human_handover": "human_handover", # 需要人工 -> 人工接管节点
"ai_response": END # 不需要人工 -> 直接结束
}
)
# 人工接管后结束流程
workflow.add_edge("human_handover", END)
# 编译工作流图 - 生成可执行的应用
app = workflow.compile()
print("✅ 智能客服工作流构建完成!")
return app
主函数和演示
运行智能客服助手 - 完整的客服处理流程, 这是整个客服系统的主要接口:
- 初始化工作流应用
- 创建初始状态
- 执行完整的处理流程
- 返回详细的处理结果
参数:
- user_question: 用户问题
- user_id: 用户标识
返回:
- 完整的处理状态,包含所有分析结果和处理记录
使用场景:
- 在线客服系统
- 智能问答机器人
- 客户支持平台
- 服务质量评估
def run_customer_service(user_question: str, user_id: str = "user_001") -> CustomerServiceState:
print(f"\n{'='*60}")
print(f"🤖 智能客服助手开始服务")
print(f"{'='*60}")
# 创建工作流应用
app = create_customer_service_graph()
# 生成会话标识
session_id = f"session_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
# 初始化完整的状态对象
initial_state = CustomerServiceState(
# 基本信息
user_id=user_id,
session_id=session_id,
timestamp=datetime.now().isoformat(),
# 用户输入
user_question=user_question,
messages=[HumanMessage(content=user_question)],
# 分析结果(初始为空)
question_category="",
category_confidence=0.0,
sentiment_analysis={},
# 知识库结果(初始为空)
knowledge_results=[],
relevant_info="",
# 决策结果(初始为默认值)
need_human_handover=False,
urgency_level="medium",
# 输出结果(初始为空)
ai_response="",
suggested_actions=[],
# 元数据(初始为空)
processing_steps=[],
confidence_scores={}
)
print(f"\n📥 收到用户咨询:{user_question}")
print(f"👤 用户ID:{user_id}")
print(f"🆔 会话ID:{session_id}")
# 执行完整的工作流
result = app.invoke(initial_state)
# 输出处理结果
print(f"\n{'='*60}")
print(f"📤 客服回复:")
print(f"{'='*60}")
print(result["ai_response"])
# 输出详细的处理统计
print(f"\n📊 处理统计:")
print(f" - 问题分类:{result['question_category']} (置信度: {result['category_confidence']:.2f})")
print(f" - 情感状态:{result['sentiment_analysis'].get('sentiment', 'unknown')}")
print(f" - 紧急程度:{result['urgency_level']}")
print(f" - 知识库结果:{len(result['knowledge_results'])} 条")
print(f" - 需要人工:{'是' if result['need_human_handover'] else '否'}")
print(f" - 建议操作:{', '.join(result['suggested_actions'])}")
print(f" - 处理步骤:{' -> '.join(result['processing_steps'])}")
return result
演示智能客服系统
演示智能客服系统 - 全面测试不同场景,这个演示函数设计了多种测试场景:
- 不同类型的问题(技术、账户、产品、投诉)
- 不同的情感状态(平和、紧急、负面、愤怒)
- 不同的复杂程度(简单咨询、复杂问题)
测试目标:
- 验证问题分类的准确性
- 测试情感识别的效果
- 检查知识库搜索的相关性
- 评估升级决策的合理性
- 确保回答质量的一致性
业务价值:
- 系统功能验证
- 性能基准测试
- 用户体验评估
- 改进方向识别
def demo_customer_service():
print("🚀 智能客服助手演示开始")
print("=" * 80)
# 精心设计的测试用例 - 覆盖不同业务场景
test_cases = [
{
"question": "我的账户被冻结了,急需解决!",
"user_id": "user_001",
"description": "账户问题 + 紧急情况 + 负面情绪"
},
{
"question": "你们的产品有哪些功能?价格如何?",
"user_id": "user_002",
"description": "产品咨询 + 平和语气 + 信息需求"
},
{
"question": "软件老是闪退,安装了好几次都不行,太垃圾了!",
"user_id": "user_003",
"description": "技术支持 + 负面情绪 + 重复问题"
},
{
"question": "我要投诉你们的服务态度,要求退款赔偿!",
"user_id": "user_004",
"description": "投诉问题 + 愤怒情绪 + 法律相关"
},
{
"question": "请问如何重置密码?",
"user_id": "user_005",
"description": "简单咨询 + 礼貌语气 + 标准流程"
}
]
# 执行所有测试用例
for i, test_case in enumerate(test_cases, 1):
print(f"\n🔹 测试案例 {i}: {test_case['description']}")
print("-" * 50)
# 运行客服处理流程
result = run_customer_service(
test_case["question"],
test_case["user_id"]
)
# 添加分隔线
if i < len(test_cases):
print("\n" + "=" * 80)
def show_architecture_info():
"""
显示系统架构信息 - 完整的技术文档
这个函数提供了系统的全面介绍:
1. 架构设计的总体思路
2. 各个组件的职责分工
3. 数据流和控制流
4. 技术栈和实现方案
5. 扩展方向和改进建议
文档价值:
- 新人快速理解系统
- 技术选型参考
- 系统改进指导
- 最佳实践分享
"""
print("""
🏛️ 智能客服助手系统架构:
┌─────────────────────────────────────────────────────────────┐
│ LangGraph 工作流 │
├─────────────────────────────────────────────────────────────┤
│ 用户输入 │
│ ↓ │
│ 1. 问题分类 (LLM) ← 技术支持/账户/产品/投诉/其他 │
│ ↓ │
│ 2. 情感分析 (LLM) ← 积极/中性/消极/沮丧/愤怒 │
│ ↓ │
│ 3. 知识库搜索 ← 关键词匹配 + 分类过滤 │
│ ↓ │
│ 4. 智能回答生成 (LLM) ← 上下文 + 知识库信息 │
│ ↓ │
│ 5. 升级决策 ← 情感/紧急度/置信度判断 │
│ ↓ │
│ 6. [条件分支] │
│ ├─ AI回答 → 结束 │
│ └─ 转人工 → 生成交接信息 │
└─────────────────────────────────────────────────────────────┘
🎯 核心特性:
• 真实LLM集成 (OpenAI/通义千问/文心一言等)
• 多维度问题分析 (分类+情感+知识匹配)
• 智能升级决策 (基于多因素判断)
• 状态全程追踪 (每一步都有记录)
• 灵活配置支持 (不同LLM提供商)
🔧 技术栈:
• LangGraph: 工作流编排和状态管理
• LangChain: LLM集成和提示工程
• TypedDict: 状态类型安全和结构化
• JSON解析: 结构化LLM输出处理
• 知识库: 基于关键词的智能搜索匹配
💡 扩展可能:
• 集成向量数据库 (更好的语义搜索)
• 添加语音识别/合成 (多模态交互)
• 集成CRM系统 (客户信息管理)
• 多轮对话上下文 (对话历史记忆)
• 实时情感监控 (情绪变化追踪)
• A/B测试框架 (效果评估优化)
• 机器学习排序 (个性化推荐)
• 知识图谱集成 (关系推理)
""")
主函数
主函数 - 系统启动和演示入口,这个主函数展示了:
- 系统初始化和检查
- 配置验证和提示
- 演示流程的执行
- 使用指导和建议
运行模式:
- 开发模式:显示详细调试信息
- 演示模式:运行预设测试用例
- 生产模式:处理真实用户请求
最佳实践展示:
- 环境检查和降级策略
- 错误处理和用户提示
- 详细的使用说明
- 性能和成本优化建议
if __name__ == "__main__":
# 显示系统架构信息
show_architecture_info()
# 检查LLM可用性并提供配置指导
print(f"🔧 LLM状态:{LLM_AVAILABLE or '使用模拟模式'}")
if not LLM_AVAILABLE:
print("⚠️ 未检测到可用的LLM库,将使用模拟模式演示")
print("💡 要使用真实LLM,请安装并配置:")
print(" pip install langchain-openai # OpenAI")
print(" pip install langchain-community # 其他提供商")
print(" export OPENAI_API_KEY=your_key_here")
print("\n" + "="*80)
# 运行完整的演示流程
demo_customer_service()
print("\n🎉 智能客服助手演示完成!")
print("\n💡 使用建议:")
print("1. 配置真实的LLM API密钥以获得更好效果")
print("2. 可以修改 test_cases 来测试更多场景")
print("3. 可以扩展知识库内容和搜索算法")
print("4. 可以调整升级判断的条件和阈值")
print("5. 可以集成向量数据库提升搜索效果")
print("6. 可以添加用户反馈机制改进服务质量")
print("7. 可以实现多轮对话和上下文记忆")
print("8. 可以集成实时监控和性能分析")
更多推荐


所有评论(0)