电商智能客服实战(一)—概要设计
电商智能客服实战(二)需求感知模块模型微调实现
电商智能客服实战(三)-需求感知模块具体实现
电商智能客服实战(四)-规划模块实现
一、模块整体架构设计
情感驱动路由:
多轮会话机制:
反馈闭环设计:
# 与规划模块的接口定义
class PlanningRequest(BaseModel):
user_intent: str
entities: Dict[str, str]
dialog_context: List[Dict] # 复用对话历史数据结构
# 与工具模块的执行协议
class ToolInvocation(BaseModel):
tool_name: str
parameters: Dict[str, Any] # 严格匹配知识库API规范
采用对话上下文感知设计,实现三级状态管理:
class DialogState:
session_state: Enum = ACTIVE # 继承系统级状态机
user_profile: UserMeta # 对接用户中心数据
service_context: Dict # 业务上下文(如订单号)
def snapshot(self) -> str:
"""生成状态快照(用于断点续传)"""
return pickle.dumps(self.__dict__)
class StyleEngine:
def __init__(self, config_path: str):
self.style_config = self._load_config(config_path)
def apply_style(self, raw_text: str) -> str:
"""应用多维度风格规则"""
# 语气转换(参考前文语言表达参数)
if self.style_config['tone'] == 'formal':
text = self._convert_to_formal(raw_text)
# 句式处理
if self.style_config['response_length'] == 'short':
text = self._summarize_response(text)
return text
def _convert_to_formal(self, text: str) -> str:
"""敬语转换器"""
replacements = {
"你": "您",
"请": "烦请",
"吗?": "么?"
}
for k, v in replacements.items():
text = text.replace(k, v)
return text
def generate_clarification(context: DialogState) -> str:
"""
基于强化学习的追问策略(对应前文会话管理机制)
算法选择优先级:
1. 必填字段缺失 → 直接追问
2. 模糊实体 → 选项式提问
3. 冲突信息 → 确认式提问
"""
if context.missing_entities:
return _direct_question(context)
elif context.conflict_entities:
return _confirm_question(context)
else:
return _suggestive_question(context)
def format_response(plan_step: PlanStep,
result: ToolResult,
style: StyleConfig) -> str:
# 基础模板填充
base_text = apply_template(plan_step.template, result.data)
# 情感增强(对接情感分析模块)
if style.allow_emotional_enhancement:
base_text = add_emotion_words(base_text, result.sentiment)
# 知识增强(调用RAG系统)
if style.enable_knowledge_augment:
related_info = retrieve_related_knowledge(base_text)
base_text += f"\n\n相关知识:{related_info}"
return base_text
# style_config.yaml(对应前文JSON配置方案)
response_policies:
default:
tone: professional
emoji: false
detail_level: 2
vip_user:
tone: friendly
emoji: true
detail_level: 3
(实现前文建议的Redis集成)
class RedisStateManager:
def __init__(self, redis_conn):
self.redis = redis_conn
def save_state(self, state: DialogState):
self.redis.set(
state.session_id,
state.snapshot(),
ex=3600 # 1小时会话有效期
)
def load_state(self, session_id: str) -> DialogState:
data = self.redis.get(session_id)
return DialogState(**pickle.loads(data))
"""
智能客服用户交互模块完整实现
"""
from typing import Dict, List, Optional
from pydantic import BaseModel
import time
import json
from datetime import datetime
# region 基础数据结构(与规划模块、工具模块保持协议一致)
class PlanStep(BaseModel):
"""规划步骤数据结构(与规划模块输出协议对齐)"""
step_id: str
tool_required: str
parameters: Dict[str, str]
retry_policy: str = "default"
class ToolResult(BaseModel):
"""工具执行结果(与工具模块输出协议对齐)"""
status: str # success/partial/failure
data: Dict[str, str]
message: Optional[str] = None
# endregion
# region 核心交互引擎实现
class DialogState(BaseModel):
"""
对话状态模型
"""
session_id: str
created_at: float = time.time()
last_active: float = time.time()
context_stack: List[Dict] = []
pending_steps: List[PlanStep] = []
missing_entities: List[str] = []
def update_activity(self):
"""更新最后活跃时间戳"""
self.last_active = time.time()
class InteractionEngine:
"""
用户交互核心处理引擎
"""
def __init__(self, style_config: Dict):
self.states: Dict[str, DialogState] = {}
self.style_config = style_config
# 实体校验规则加载(可热更新)
self.entity_rules = self._load_entity_rules()
# 响应模板初始化
self.response_templates = {
'order_query': "订单{order_number}状态:{status}",
'refund': "退款申请已提交,金额:{amount}元"
}
def process_input(self, user_id: str, text: str) -> str:
"""
主处理流程
参数说明:
- user_id: 用户唯一标识符
- text: 纯文本输入(已通过前置校验)
"""
# 获取对话状态
state = self._get_or_create_state(user_id)
# 调用需求感知模块(模拟接口调用)
intent, entities, sentiment = self._call_perception_module(text)
# 实体完整性校验
if missing := self._validate_entities(intent, entities):
return self._generate_clarification(missing)
# 生成执行计划(调用规划模块)
plan_steps = self._call_planning_module(intent, entities, sentiment)
# 执行工具调用
try:
result = self._execute_tools(plan_steps[0])
except Exception as e:
return self._handle_error(e)
# 生成风格化响应
raw_response = self._format_response(plan_steps[0], result)
styled_response = self._apply_style(raw_response, sentiment)
# 更新对话历史
self._update_dialog_history(state, text, styled_response)
return styled_response
def _call_perception_module(self, text: str) -> tuple:
"""模拟需求感知模块调用(实际应替换为RPC调用)"""
# 此处简化实现,真实场景应调用独立模块
return ("order_query", {"order_number": "12345"}, {"sentiment": "neutral"})
def _call_planning_module(self, intent: str,
entities: Dict,
sentiment: Dict) -> List[PlanStep]:
"""调用规划模块生成执行步骤"""
# 示例生成订单查询步骤
return [PlanStep(
step_id="step1",
tool_required="order_query",
parameters=entities
)]
def _execute_tools(self, step: PlanStep) -> ToolResult:
"""执行工具调用(对接工具模块)"""
# 示例订单查询结果
return ToolResult(
status="success",
data={"status": "已发货", "order_number": "12345"}
)
def _get_or_create_state(self, user_id: str) -> DialogState:
"""对话状态管理(带自动清理机制)"""
if user_id not in self.states:
self.states[user_id] = DialogState(
session_id=f"{user_id}_{datetime.now().timestamp()}"
)
return self.states[user_id]
def _validate_entities(self, intent: str, entities: Dict) -> List[str]:
"""实体校验核心逻辑"""
required = self.entity_rules.get(intent, [])
return [field for field in required if field not in entities]
def _generate_clarification(self, missing: List[str]) -> str:
"""智能追问生成"""
field_map = {
"order_number": "订单号",
"product_code": "产品编码"
}
questions = [f"需要您提供{filed_map.get(f, f)}" for f in missing]
return "请补充以下信息:\n" + "\n".join(questions)
def _format_response(self, step: PlanStep, result: ToolResult) -> str:
"""响应正文生成"""
template = self.response_templates.get(step.tool_required, "处理结果:{data}")
return template.format(**result.data)
def _apply_style(self, text: str, sentiment: Dict) -> str:
"""应用风格配置"""
# 情感表情
emoji_map = {
"positive": " ",
"negative": " ",
"neutral": " "
}
# 敬语处理
if self.style_config.get("formal"):
text = text.replace("你", "您")
return f"{emoji_map.get(sentiment['sentiment'], '')}{text}"
def _update_dialog_history(self, state: DialogState,
input_text: str,
response: str):
"""对话历史管理(保留最近5轮)"""
state.context_stack.append({
"timestamp": datetime.now().isoformat(),
"input": input_text,
"response": response
})
if len(state.context_stack) > 5:
state.context_stack.pop(0)
def _load_entity_rules(self) -> Dict:
"""从配置文件加载实体规则"""
# 此处简化实现,实际应从配置中心加载
return {
"order_query": ["order_number"],
"refund": ["order_number", "amount"]
}
def _handle_error(self, error: Exception) -> str:
"""统一错误处理"""
return "服务暂时不可用,请稍后再试"
# endregion
# region 风格配置示例
STYLE_CONFIG = {
"formal": True, # 是否使用正式语气
"emoji_enabled": True, # 是否启用表情符号
"detail_level": 2 # 信息详细程度(1-3)
}
# endregion
# region 单元测试
if __name__ == "__main__":
engine = InteractionEngine(style_config=STYLE_CONFIG)
# 测试用例1:正常订单查询
print("测试1:正常查询")
response = engine.process_input("user1", "查订单12345状态")
print(response)
# 测试用例2:缺失必要实体
print("\n测试2:缺失实体")
engine.response_templates["refund"] = "退款申请需要金额{amount}元"
response = engine.process_input("user2", "我要退货")
print(response)
# endregion
tv-smart-service/
├── api/ # API接口层
│ ├── dependencies/ # FastAPI依赖项
│ ├── middleware/ # 限流/鉴权中间件
│ └── routers/ # 路由控制器
├── core/ # 业务核心
│ ├── demand/ # 需求感知
│ │ ├── analyzers/ # 分析器实现
│ │ └── processors/ # 文本处理流水线
│ ├── planning/ # 决策规划
│ │ ├── agents/ # LangChain智能体
│ │ └── rules/ # Drools规则库
│ └── interaction/ # 用户交互
│ ├── sessions/ # 会话管理
│ └── style_engine/ # 客服风格引擎
├── infrastructure/ # 基础设施
│ ├── db/ # 数据库访问
│ │ ├── models.py # SQLAlchemy模型
│ │ └── migrations/ # Alembic迁移脚本
│ ├── cache/ # Redis客户端
│ └── monitoring/ # 监控组件
├── services/ # 微服务
│ ├── order/ # 订单服务客户端
│ └── knowledge/ # 知识库RAG实现
└── config/ # 配置管理
├── feature_toggles.py # 功能开关
└── prompts/ # LangChain提示词模板