2026/4/18 10:00:57
网站建设
项目流程
宁波新亚建设内部网站,32岁学做网站,专业工厂网站建设,wordpress首页显示场景痛点#xff1a;规则引擎的“最后一公里”
去年双十一#xff0c;公司客服系统被“这件衣服有没有S码”和“这件衣服有S号吗”两句话彻底打败。人工维护的 3000 正则规则在 48 小时内膨胀到 5000#xff0c;仍然无法覆盖同义词、语序变换、口语省略。更尴尬的是#x…场景痛点规则引擎的“最后一公里”去年双十一公司客服系统被“这件衣服有没有S码”和“这件衣服有S号吗”两句话彻底打败。人工维护的 3000 正则规则在 48 小时内膨胀到 5000仍然无法覆盖同义词、语序变换、口语省略。更尴尬的是当意图被误分类后后续固定 FAQ 列表直接“鸡同鸭讲”转化率掉到谷底。传统方案的三座大山规则维护成本指数级增长生成问题与上文无关用户需要重复输入背景信息意图漂移导致多轮对话状态丢失无法形成有效漏斗痛定思痛我们决定用 AI 把“识别生成”这两步全部接管让客服系统自己“听懂”并“追问”。技术选型RNN 已老Transformer 当立意图识别赛道模型训练速度长程依赖线上延迟准确率(自建 32 类)Bi-LSTM慢衰减严重18 ms87.2 %TextCNN快3-gram 局限6 ms89.4 %BERT-base中等Self-Attention11 ms94.7 %结论BERT 在 F1 与延迟之间取得最佳平衡且微调代码量最小工程师心智负担最低。问题生成赛道GPT-3API 方便但 ① 输出不可控容易“满嘴跑火车”② 数据出境合规风险③ 按 Token 计费高并发下成本爆炸。T5-small可私有部署Beam Search Repeat Penalty 后事实一致性96%单机 QPS≈120成本趋近于零。最终方案BERT 做意图判别T5 做条件生成两者均基于 Transformer参数共享与量化策略统一运维只有一套 GPU 池。资产库核心实现1. 意图分类模型BERT PyTorch目录结构intent/ ├── data │ └── raw.csv # 原始语料text,label ├── train.py ├── infer.py └── tests └── test_model.pytrain.py 关键片段含注释符合 PEP8# -*- coding: utf-8 -*- import torch, random, numpy as np, pandas as pd from transformers import BertTokenizerFast, BertForSequenceClassification from sklearn.model_selection import train_test_split from torch.utils.data import Dataset, DataLoader from sklearn.preprocessing import LabelEncoder RANDOM_SEED 42 random.seed(RANDOM_SEED) np.random.seed(RANDOM_SEED) torch.manual_seed(RANDOM_SEED) MAX_LEN 64 BATCH 128 EPOCHS 4 LR 2e-5 class IntentDataset(Dataset): def __init__(self, texts, labels, tokenizer, max_len): self.texts, self.labels texts, labels self.tokenizer, self.max_len tokenizer, max_len def __len__(self): return len(self.texts) def __getitem__(self, idx): encoding self.tokenizer( self.texts[idx], truncationTrue, paddingmax_length, max_lengthself.max_len, return_tensorspt ) item {k: v.squeeze(0) for k, v in encoding.items()} item[labels] torch.tensor(self.labels[idx], dtypetorch.long) return item def main(): df pd.read_csv(data/raw.csv) le LabelEncoder() labels le.fit_transform(df[label]) train_texts, val_texts, train_labels, val_labels train_test_split( df[text], labels, test_size0.1, random_stateRANDOM_SEED ) tokenizer BertTokenizerFast.from_pretrained(bert-base-chinese) train_ds IntentDataset(train_texts, train_labels, tokenizer, MAX_LEN) val_ds IntentDataset(val_texts, val_labels, tokenizer, MAX_LEN) train_loader DataLoader(train_ds, batch_sizeBATCH, shuffleTrue) val_loader DataLoader(val_ds批 , batch_sizeBATCH) model BertForSequenceClassification.from_pretrained( bert-base-chinese, num_labelslen(le.classes_) ).cuda() optimizer torch.optim.AdamW(model.parameters(), lrLR) criterion torch.nn.CrossEntropyLoss() for epoch in range(EPOCHS): model.train() for batch in train_loader: batch {k: v.cuda() for k, v in batch.items()} outputs model(**batch) loss outputs.loss loss.backward() optimizer.step(); optimizer.zero_grad() # 验证 保存略 tokenizer.save_pretrained(output/) model.save_pretrained(output/) if __name__ __main__: main()单元测试示例tests/test_model.pyimport pytest, torch from transformers import BertTokenizer, BertForSequenceClassification pytest.fixture def setup(): tok BertTokenizer.from_pretrained(output/) model BertForSequenceClassification.from_pretrained(output/) return tok, model def test_predict_return_shape(setup): tok, model setup text 这件可以退货吗 inputs tok(text, return_tensorspt) with torch.no_grad(): logits model(**inputs).logits assert logits.shape[1] 32 # 32 类2. 问题生成 pipelineT5采用“上下文 意图”作为条件 prompt强制模型生成后续澄清问句。from transformers import T5Tokenizer, T5ForConditionalGeneration import torch tok T5Tokenizer.from_pretrained(ClueAI/T5-small-chinese) model T5ForConditionalGeneration.from_pretrained(ClueAI/T5-small-chinese) def build_prompt(context, intent): # 用[INTENT]做显式控制降低幻觉 return f上下文{context} [INTENT]{intent} 追问 def generate_question(context, intent, max_len64, num_beams4, repetition_penalty2.0): prompt build_prompt(context, intent) inputs tok(prompt, return_tensorspt) outputs model.generate( **inputs, max_lengthmax_len, num_beamsnum_beams, repetition_penaltyrepetition_penalty, early_stoppingTrue ) return tok.decode(outputs[0], skip_special_tokensTrue) # 示例 print(generate_question(用户问这件衣服有红色吗, 询问库存)) # 输出请问您需要多大尺码我们库存实时变动可帮您确认。性能优化三板斧1. 模型量化部署意图模型BERT 采用 ONNX Runtime 动态量化INT8延迟从 11 ms 降到 4.3 msF1 下降 0.4%可接受。生成模型T5 使用 PyTorch JIT 半精度FP16显存占用减半Beam Search 4 路并发 QPS≈120→230。2. 对话状态管理自研轻量级状态机以 Redis Hash 存储 sessionkey: cx:{uid} field: context, intent, slot, ttl每次请求只 O(1) 读写TTL 300 s 自动淘汰防止僵尸 key 堆积。3. 异步处理架构网关层 → Kafka → 推理微服务FastAPI Uvicorn→ 结果写回 WebSocket。通过 Prefect 做队列削峰单卡 A10 可抗 8000 并发99 线 180 ms。生产环境避坑指南冷启动意图模型初始无数据时先用规则兜底同时把用户日志实时回流到“待标注池”。每日凌晨主动学习Active Learning优先挑选熵最高的 5% 样本两周后线上准确率即可从 68% 提升到 91%。安全过滤T5 生成后过两层正则 敏感词 DFA 情绪模型中文 RoBERTa 微调出现辱骂/过度承诺直接丢弃并触发兜底回复。高并发缓存意图结果缓存 key 设计为hash(text)并加入“最近 7 天模型版本号”防止模型更新后旧缓存误用生成问题侧因上下文差异大缓存命中率仅 12%故采用 GPU 级缓存FasterTransformer而非业务缓存降低序列重复编译开销。开放性问题如何评估生成问题的质量目前我们离线用 BLEU-4 与人工“相关友好”双指标线上用“用户是否继续回复”作为弱监督。但 BLEU 高≠体验好人工贵且慢。是否可以用强化学习把“最终是否转人工”作为 reward引入对话级连贯性Coherence自动评分用对抗样本检测模型是否过度“安全”而生成无效问题欢迎读者动手实验在开源 Multi-Domain-WOZ 上训练 T5对比 Beam Search vs. Diverse Beam Search 的 Coherence 分数构建轻量级 rank 模型把“生成问题真实用户回复”作为正例“生成问题用户沉默 10 s”作为负例看 AUC 能否逼近人工标注。期待你的 PR 与实验报告。