电商智能客服实战(五)-用户交互模块实现

电商智能客服实战(一)—概要设计
电商智能客服实战(二)需求感知模块模型微调实现
电商智能客服实战(三)-需求感知模块具体实现
电商智能客服实战(四)-规划模块实现

一、模块整体架构设计

1.1 核心流程

非常消极/消极
中性/积极
追问/否定
确认正确
原始输入
情感识别
情感等级
升级优先级队列
常规处理通道
语义识别
实体识别
结构化输出
用户反馈
多轮会话管理
流程结束

1.2 流程说明

  1. 情感驱动路由

    • 所有情感类型均继续后续流程
    • 差异点体现在处理优先级而非流程分支
  2. 多轮会话机制

    • 通过反馈回路实现对话延续
    • 会话管理器维护上下文状态
  3. 反馈闭环设计

    • 用户显式反馈(如"不对,我要问的是…")
    • 隐式反馈(连续追问相同问题)

1.3 模块通信机制

# 与规划模块的接口定义
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规范

1.2 数据流全景

User Interaction Perception Planning Tools 文本输入 获取意图/实体 NLU结果 生成执行计划 PlanStep列表 分步执行 ToolResult 风格化响应 User Interaction Perception Planning Tools

二、核心设计模式详解

2.1 状态管理模式

采用对话上下文感知设计,实现三级状态管理:

class DialogState:
    session_state: Enum = ACTIVE  # 继承系统级状态机
    user_profile: UserMeta        # 对接用户中心数据
    service_context: Dict        # 业务上下文(如订单号)
    
    def snapshot(self) -> str:
        """生成状态快照(用于断点续传)"""
        return pickle.dumps(self.__dict__)

2.2 风格引擎实现

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

三、关键算法实现细节

3.1 智能追问算法

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)

3.2 多策略响应生成

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

四、工程化实践指南

4.1 配置中心集成

# style_config.yaml(对应前文JSON配置方案)
response_policies:
  default:
    tone: professional
    emoji: false
    detail_level: 2
    
  vip_user:
    tone: friendly
    emoji: true
    detail_level: 3

4.2 性能优化方案

(实现前文建议的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))

五、建议演进路线图

5.1 短期优化

  1. 风格热加载:实现配置更新不重启服务
  2. 上下文压缩:采用LLM生成对话摘要

5.2 长期规划

  1. 个性化风格:建立用户-风格映射模型
  2. 多模态扩展:预留图片/语音接口

六、撒花第一阶段完结

6.1 用户交互模块完整代码

"""
智能客服用户交互模块完整实现
"""
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

6.2 项目目录结构

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提示词模板

6.3 测试结果

以上我们已经初步实现了第一版本的智能客服系统。
电商智能客服实战(五)-用户交互模块实现_第1张图片

你可能感兴趣的:(企业级AI项目实战,网络,人工智能,ai,agent,智能客服,大模型)