TicketFlow AI 项目实践(七):项目复盘、技术选型与 NLP 面试问题总结 📅 2026/7/17 2:26:20 前六篇文章分别介绍了 TicketFlow AI 的项目架构、工单数据处理、RandomForest基线、FastText、BERT微调、模型压缩、LLM分类和Flask部署。本篇作为系列总结从技术选型和面试表达两个角度对整个项目进行一次完整复盘。一、项目解决什么问题TicketFlow AI 面向企业客服和 IT 运维工单场景将口语化中文短文本识别为固定业务意图为自动派单、工单统计和人工复核提供结构化标签。项目定义了十个类别account_login 账号登录permission_apply 权限申请system_error 系统故障data_exception 数据异常payment_issue 支付问题product_consult 产品咨询after_sales 售后服务complaint 投诉升级feature_request 功能需求other 其他问题公开演示版使用5000条模拟工单其中训练集4000条、验证集500条、测试集500条不包含企业内部数据、生产模型权重和敏感配置。二、为什么先做 RandomForest 基线项目没有一开始就使用BERT而是先用jieba、TF-IDF和RandomForest建立基线原因包括训练速度快便于快速检查数据和标签。特征流程容易解释适合作为后续模型的参照。能够先跑通模型保存、批量预测、Flask API和Streamlit页面。如果复杂模型没有明显超过基线需要重新检查数据质量和任务设计。参考工程保存的500条测试预测中有446条正确对应Accuracy约89.2%。该结果只对应当前数据与代码版本修改划分或参数后应重新评估。三、FastText、BERT和LLM如何选择方案优势局限适用场景RandomForest训练快、可解释上下文能力有限基线和CPU快速分类FastText轻量、推理快受分词和标签边界影响标注辅助和轻量部署BERT语义和上下文能力较强模型较大、成本较高主分类模型LLM零样本、规则灵活延迟、费用和稳定性长尾兜底和对比实验真实系统可以采用分层策略高置信度工单由本地模型自动路由低置信度样本交给人工或LLM复核而不是所有请求都调用大模型。四、为什么要看 Macro-F1工单类别通常不均衡。如果账号登录样本很多而other或投诉样本较少只看Accuracy可能掩盖少数类别识别差的问题。Macro-F1先分别计算每个类别的F1再进行等权平均因此每个类别都具有相同权重。评估时还应结合分类报告、混淆矩阵和BadCase文本。五、最容易混淆的类别system_error 与 payment_issue“支付页面报错”同时包含支付和系统错误应根据核心诉求判断。system_error 与 data_exception页面白屏属于系统故障导出金额错误属于数据异常。product_consult 与 feature_request询问现有能力是咨询明确要求新增能力是功能需求。原始故障类别与 complaint当用户重点表达多次未处理、态度差和升级诉求时应考虑投诉类别。这些问题往往不仅是模型能力问题也可能来自标签规范不清或标注人员口径不一致。六、模型压缩的核心认识方案核心思路关键认识动态量化部分Linear层由FP32转换为INT8需要在目标CPU重新测量精度和延迟非结构化剪枝把不重要的权重置零稀疏度提高不等于文件缩小或自动加速知识蒸馏BERT教师指导BiLSTM学生应与直接训练学生模型进行对照本地实验文件中原始BERT约390.23 MiB动态量化模型约145.58 MiB蒸馏后的BiLSTM学生模型约25.39 MiB。模型大小之外还需要同时比较Macro-F1、平均延迟、P95延迟和峰值内存。七、Flask接口为什么设计成三个GET /healthPOST /predictPOST /predict_batch/health用于服务健康检查和部署探针。/predict用于在线单条工单预测。/predict_batch用于离线批量分类和数据回填。接口还需要校验JSON格式、空文本、批量大小和异常输出。LLM返回结果必须经过固定标签白名单校验不能直接进入派单系统。八、面试中可能被追问的15个问题1. 为什么选择工单分类而不是普通新闻分类参考回答工单分类与企业业务流程联系更紧密分类结果可以直接用于派单、优先级判断、统计分析和人工兜底。相比新闻分类工单文本更短、更口语化而且经常包含错别字、否定表达和混合意图因此更能体现标签设计、BadCase分析、模型部署和业务闭环能力。2. 十类标签是如何定义的类别边界如何统一参考回答标签不是单纯按关键词划分而是根据工单最终应流转到的业务处理模块设计。先为每个类别编写定义、正例、反例和冲突处理规则再针对易混淆类别规定优先级。例如支付链路故障优先归入payment_issue数据值错误归入data_exception通用页面崩溃归入system_error。发现标注分歧后更新规范并重新复核历史样本。3. 为什么训练集、验证集和测试集必须分开参考回答训练集用于学习模型参数验证集用于选择超参数、阈值和最佳模型测试集只用于最终独立评估。如果反复根据测试结果调整模型测试集就会间接参与训练最终指标会偏高。对于模板化工单还应按原始模板或业务来源分组划分避免相似文本同时进入训练集和测试集。4. TF-IDF为什么只能在训练集上fit参考回答fit会学习词表以及IDF统计信息。如果在全部数据上fit就提前使用了验证集和测试集的词频分布产生数据泄漏。正确流程是训练集fit_transform验证集和测试集只调用transform线上推理也必须加载训练阶段保存的同一份向量器。5. 为什么先做RandomForest基线参考回答基线模型训练快、实现简单能够快速验证数据格式、标签映射、评估代码和API流程是否正确。如果BERT等复杂模型没有明显超过基线就需要检查数据质量、类别边界或训练过程而不是盲目增加模型复杂度。基线也能为精度、速度和资源成本提供比较参照。6. FastText字符级和词级输入有什么区别参考回答字符级输入不依赖中文分词对错别字、新词和口语化表达更稳健但单个字符语义较弱、序列更长。词级输入可读性和语义表达更好但效果受到分词词典和切分质量影响。项目分别生成字符级和词级数据在同一验证集上比较Macro-F1、速度和模型大小。7. BERT为什么不需要jieba分词参考回答BERT使用与预训练模型配套的Tokenizer和WordPiece词表把文本转换为模型认识的Token。手动使用jieba会改变预训练阶段的输入分布并可能产生词表中不存在的切分结果。因此BERT直接使用BertTokenizer同时仍需完成文本清洗、长度截断和标签校验。8. input_ids和attention_mask分别是什么参考回答input_ids是每个Token在BERT词表中的数字编号包含CLS、SEP和PAD等特殊Token。attention_mask用于区分真实Token和Padding真实位置通常为1补齐位置为0使注意力计算忽略无意义的PAD内容。9. 为什么学习率设置为5e-5最大长度设置为64参考回答BERT微调通常使用较小学习率5e-5属于常见起点可以减少对预训练参数的破坏。工单大多是短文本长度64能够覆盖多数样本同时降低显存和推理开销。这两个值不是固定答案应根据验证集表现、文本长度分布和硬件资源继续调节。10. Accuracy和Macro-F1有什么区别参考回答Accuracy计算全部样本中预测正确的比例容易受到大类别影响。Macro-F1先计算每个类别的F1再进行等权平均因此少数类别与多数类别具有相同权重。在工单类别不均衡时需要同时查看Accuracy、Macro-F1、分类报告和混淆矩阵。11. 如何分析system_error和data_exception的误判参考回答先从混淆矩阵筛选这两个类别的互相误判样本再逐条查看原文、真实标签、预测标签和置信度。核心边界是系统无法使用、报错和白屏偏向system_error数据缺失、重复、金额不一致偏向data_exception。如果样本本身同时包含两种意图需要根据主要诉求统一标注规则必要时增加混合意图或多标签方案。12. 动态量化、剪枝和知识蒸馏分别解决什么问题参考回答动态量化把部分FP32权重转换为INT8主要降低CPU推理成本和模型体积剪枝把不重要的权重或结构移除目标是减少计算量和参数冗余知识蒸馏让小模型学习大模型的软概率分布在较小体积下保留更多教师模型能力。三种方案都需要重新评估精度、延迟和内存。13. 为什么剪枝后文件可能反而更大参考回答非结构化剪枝只是把部分权重置零权重矩阵的形状没有改变默认保存方式仍可能按稠密矩阵存储。如果同时保存weight_orig和weight_mask还会增加掩码参数因此文件可能不降反升。真正减小体积或加速需要移除剪枝重参数化、使用稀疏格式并配合支持稀疏计算的运行库和硬件。14. 如何保证LLM只返回固定类别参考回答首先在System Prompt中明确列出允许标签、类别定义、边界规则和“只输出一个英文标签”的格式要求并设置较低temperature。其次在代码中执行白名单校验去除空格和多余标点非法输出可以重试一次仍失败则回退到other、本地模型或人工队列。不能只相信Prompt而不做程序校验。15. 如何实现低置信度人工兜底和后续增量训练参考回答先在验证集上分析置信度与准确率的关系为不同类别设置统一或分类型阈值。高于阈值的工单自动路由低于阈值的工单进入人工复核队列并保存模型预测、置信度和人工最终标签。定期对新增数据去重、脱敏和抽样质检再与历史数据混合训练同时保留固定回归测试集防止新模型效果退化。九、项目还可以如何完善输出分类置信度并设计人工兜底阈值。增加混淆矩阵和可复现的模型对比报告。按工单模板分组划分数据减少模板泄漏。增加手机号、邮箱、订单号和内部URL脱敏。加入相似工单检索和RAG解决方案推荐。使用Docker统一封装不同模型服务。十、前六篇文章导航企业工单智能分类与派单系统总览工单数据清洗、标签体系与数据划分TF-IDF RandomForest 工单分类基线FastText 轻量分类与辅助标注BERT 微调与工单 BadCase 分析模型压缩、LLM 分类与 Flask 部署十一、总结TicketFlow AI 的价值不只在于训练一个分类模型而是完整覆盖了标签设计、数据处理、传统基线、轻量模型、预训练模型、大模型、模型压缩、API封装和可视化展示。分类结果还可以继续作为自动派单、相似工单检索、知识库推荐和客服Agent的入口。GitHub项目TicketFlow AI 公开演示版