从零到一:人工客服系统全流程开发实践记录

一、项目背景与需求分析

在服务型业务快速发展的背景下,人工客服系统需解决两大核心问题:多渠道接入(网站、APP、社交媒体等)与高效工单流转。某企业提出以下需求:

  1. 实时通信能力:支持文本、图片、文件传输,延迟需控制在300ms以内;
  2. 智能路由分配:根据客服技能组、负载情况自动分配会话;
  3. 会话状态管理:支持转接、挂起、结束等操作,并记录完整会话日志;
  4. 扩展性要求:需兼容未来可能接入的语音、视频客服模块。

二、技术选型与架构设计

1. 通信层选型

  • WebSocket协议:基于TCP长连接实现实时双向通信,相比HTTP轮询降低80%带宽消耗;
  • 协议设计:自定义JSON格式消息体,示例如下:
    1. {
    2. "type": "message",
    3. "sender": "customer_123",
    4. "content": "请问退货流程是什么?",
    5. "timestamp": 1625097600000
    6. }
  • 负载均衡:采用Nginx+Lua脚本实现基于客服负载的路由,避免单点过载。

2. 业务层架构

  • 微服务拆分
    • 会话管理服务:处理会话创建、分配、状态变更;
    • 客服工作台服务:提供消息收发、工单操作界面;
    • 统计服务:实时计算客服响应时长、满意度等指标。
  • 数据存储方案
    • Redis集群:存储在线客服状态、会话临时数据(TTL=1小时);
    • MySQL分库分表:按客服ID哈希分库,存储会话历史、工单详情。

3. 关键技术挑战与解决方案

  • 长连接稳定性
    • 问题:移动网络频繁切换导致连接中断;
    • 方案:实现心跳机制(每30秒发送Ping包),断线后3秒内自动重连。
  • 消息顺序保证
    • 问题:多线程处理可能导致消息乱序;
    • 方案:为每条消息添加递增序列号,客户端按序渲染。

三、核心模块实现细节

1. 会话分配算法

采用加权轮询+技能匹配的混合策略:

  1. def assign_session(customer_id, skill_tags):
  2. # 获取可用客服列表(状态=在线)
  3. available_agents = get_agents_by_status("online")
  4. # 技能匹配度计算
  5. matched_agents = []
  6. for agent in available_agents:
  7. match_score = len(set(skill_tags) & set(agent.skills)) / len(skill_tags)
  8. matched_agents.append((agent, match_score))
  9. # 按匹配度+负载排序
  10. matched_agents.sort(key=lambda x: (x[1], x[0].current_sessions), reverse=True)
  11. # 分配给最优客服
  12. if matched_agents:
  13. return matched_agents[0][0].id
  14. return None

2. 实时消息推送

  • WebSocket消息格式
    1. {
    2. "type": "system",
    3. "action": "assign",
    4. "agent_id": "agent_456",
    5. "agent_name": "张三"
    6. }
  • 推送流程
    1. 客服状态变更时,会话服务发布事件到Redis Stream;
    2. 客服工作台订阅对应Stream,收到消息后更新UI。

3. 会话状态机设计

定义6种核心状态:
| 状态 | 触发条件 | 后续允许操作 |
|——————|———————————————|——————————————|
| 待分配 | 客户发起咨询 | 分配客服 |
| 沟通中 | 客服接受会话 | 转接、挂起、结束 |
| 已挂起 | 客服主动挂起或超时无操作 | 重新分配、结束 |
| 已结束 | 客户/客服点击结束按钮 | 归档、评价 |

四、性能优化与测试

1. 压测数据

  • 测试环境:4核8G虚拟机×3,模拟1000并发会话;
  • 关键指标
    • 消息送达率:99.97%;
    • 平均响应时间:187ms;
    • CPU使用率:峰值65%。

2. 优化策略

  • 连接池复用:客服工作台复用WebSocket连接,减少重复握手;
  • 异步日志写入:将会话日志写入Kafka,由后台服务批量存入数据库;
  • 缓存预热:每日高峰前加载常用客服信息到本地缓存。

五、上线与运维

1. 灰度发布方案

  • 分阶段放量
    1. 内部测试组(10人)→ 验证基础功能;
    2. 种子客户(50人)→ 收集真实使用反馈;
    3. 全量发布(监控报警阈值:错误率>0.5%自动回滚)。

2. 监控告警体系

  • Prometheus+Grafana:监控连接数、消息延迟、数据库查询耗时;
  • 自定义告警规则
    • 连续5分钟500错误率>1% → 触发钉钉机器人告警;
    • Redis内存使用率>80% → 自动扩展集群节点。

六、经验总结与避坑指南

  1. 协议设计陷阱:避免消息体过大(建议单条<10KB),否则易被防火墙拦截;
  2. 状态同步问题:客户端需实现本地消息队列,防止网络抖动导致消息丢失;
  3. 扩展性考虑:会话服务需预留插件接口,便于后续接入AI客服或CRM系统。

后续演进方向

  • 集成语音识别模块,支持电话客服转文字;
  • 引入机器学习模型预测客服负载,优化分配算法。

本次开发证明,通过合理的架构设计与细节优化,可构建出高可用、低延迟的人工客服系统,为业务提供稳定的服务支撑。