实战项目一:智能客服工单分类系统
目录
项目概述
客服工单每天涌入,人工分拣费时费力还容易出错——这正是 NLP 自动分类的用武之地。智能工单分类系统可以自动将问题分配到“咨询”“投诉”“售后”“技术”“其他”等对应部门,大幅降低运营成本,提升响应速度。
本项目追求轻量且可落地,核心目标如下:
- 支持五大通用类别:咨询、投诉、售后、技术、其他
- 准确率 > 90%,加权 F1 > 85%
- 单条推理耗时 < 0.5 秒,支持批处理
- Docker 一键部署,内置健康检查与标准化分类接口
整个技术栈经过精心挑选,力求简单高效:
数据预处理
1. 数据加载与可视化
假设原始数据保存在 customer_tickets.csv 中,包含 title(标题)、content(内容)和 category(所属类别)三个关键字段。先做基本检查,了解数据分布。
许多客服场景中,“咨询”类工单可能占 60% 以上,而“投诉”类极少,这会直接影响模型训练效果,后面我们会专门处理。
2. 文本清洗与标签编码
为了让模型聚焦语义,需要将标题和内容合并成完整文本,同时去除 URL、邮箱、手机号等无关噪音,并移除中英文标点。
小提示:如果数据中包含敏感信息(如身份证号),建议在清洗阶段一并脱敏。此处根据实际业务调整即可。
3. 不平衡数据的轻量级处理
类别分布倾斜会引导模型偏向多数类。传统做法是过采样(如 SMOTE),但对文本数据容易生成无意义的“假”样本,破坏语义。这里我们采用分层抽样 + 类别权重的组合策略:
- 分层抽样:保证训练集、验证集、测试集中各类别的比例与全量数据一致
- 类别权重:在损失函数中提升少数类的权重,让模型“更在意”少样本类别
模型选型与对比
1. 先选两条路快速摸底
在投入大模型之前,用一个简单方案(TF‑IDF + 线性 SVM)和预训练模型(RoBERTa)做一次基准对比,直观感受效果差异。
显然,RoBERTa 在 F1 和准确率上完胜,而且单条 0.3 秒完全满足业务需求,所以将它作为最终方案。
2. RoBERTa 模型训练实战
我们直接使用 Hugging Face 的 Trainer,它能帮我们自动管理训练循环、评估、保存最佳模型等,非常方便。
训练完成后,./best_ticket_classifier 目录下就保存了最佳的模型权重,可以直接用于部署。
快速部署API
为了将模型变成可供调用的服务,我们用 FastAPI 搭建一个轻量级 RESTful 接口,并提供健康检查和单条/批量分类两个核心端点。
1. FastAPI 接口代码
2. Docker 容器化一键部署
编写 Dockerfile 和 requirements.txt,保证环境一致性。
构建并启动容器:
访问 http://localhost:8000/docs 即可看到自动生成的交互式文档,直接在线测试接口。
监控与优化
生产环境上线后,还需持续监控和改进,确保服务稳定可靠。
1. 添加请求日志与耗时监控
我们可以在 FastAPI 中增加一个简单的中间件,记录每次请求的路径、状态码和处理时间,方便后期排查问题。
这样,任何请求都会在控制台输出日志,便于通过 docker logs 或日志采集系统查看。
2. 性能与错误告警
- 健康检查接口
/health可配合容器编排工具(如 K8s)自动重启异常实例。 - 如果单条分类耗时持续超过 0.5 秒,建议增加 GPU 资源或考虑模型蒸馏。
- 对分类接口返回的
confidence进行监控,若大量请求置信度过低(如 <0.6),表示模型遇到未见过的新类型,需及时收集样本进行迭代训练。
3. 模型迭代与 A/B 测试
- 将真实生产数据定期导出,与原始训练数据合并后重新训练模型,保持对新工单模式的适应。
- 部署新版本时可采用 A/B 测试:同一流量部分导向旧模型,部分导向新模型,对比准确率后再全量切换,平滑升级。
通过上述监控与优化措施,你的智能工单分类系统就能从“能跑”升级为“稳跑”,真正为企业创造长期价值。

