AI工作流在电商客服场景的复盘:意图识别准确率从72%到93%的优化之路

📅 2026/7/23 7:43:24
AI工作流在电商客服场景的复盘:意图识别准确率从72%到93%的优化之路
AI工作流在电商客服场景的复盘意图识别准确率从72%到93%的优化之路一、客服场景的意图识别挑战某电商平台日均客服对话约8000次。传统方案是关键词匹配做意图分类——退货→退货流程发货→物流查询。准确率72%剩下28%是问发货但不说发货二字等复杂表达。例如用户说你们这速度也太慢了隔壁家隔天就到了意图是催发货但关键词匹配不到。更复杂的如上次买的那个型号这次还有活动吗——同时涉及商品和促销两个意图。目标明确把意图识别准确率从72%提到90%以上让AI正确路由大部分客服对话。二、三个阶段的优化路径V1期关键词匹配准确率72%基线INTENT_KEYWORDS { 退货: [退货, 退钱, 退款, 不要了, 想退], 物流: [发货, 物流, 快递, 到哪, 什么时候到], 商品: [价格, 优惠, 折扣, 活动, 推荐], 投诉: [投诉, 差评, 态度, 骂人, 垃圾], }问题无法处理语义相近但表达不同的句子。V2期BERT分类器准确率85%13ppfrom transformers import AutoModelForSequenceClassification class IntentClassifier: def __init__(self): self.model AutoModelForSequenceClassification.from_pretrained( bert-base-chinese, num_labelslen(INTENT_LABELS) ) self.labels [ 退货退款, 物流查询, 商品咨询, 促销活动, 投诉建议, 账号问题, 支付问题, 其他 ] def classify(self, text: str) - tuple[str, float]: inputs self.tokenizer(text, return_tensorspt, truncationTrue, max_length128) with torch.no_grad(): logits self.model(**inputs).logits probs torch.softmax(logits, dim1)[0] top_idx torch.argmax(probs).item() return self.labels[top_idx], probs[top_idx].item()BERT的局限对没见过的新表达泛化不足。用户说上次买的那个还有货吗——BERT可能不确定是商品咨询还是促销活动。V3期LLM多轮理解 Chain-of-Thought准确率93%8ppV3不再只分类单条消息而是理解整段对话的上下文class LLMIntentRecognizer: async def recognize(self, messages: list[Message]) - Intent: # 构建包含历史上下文的Prompt context self._build_context(messages[-5:]) # 最近5轮 prompt f你是电商客服意图识别专家。 对话历史 {context} 当前用户消息{messages[-1].content} 请按以下步骤推理 1. 用户的核心诉求是什么 2. 这个诉求属于哪个类别 3. 如果涉及多个意图主意图是什么 请返回JSON {{ primary_intent: 意图名称, confidence: 0.0-1.0, reasoning: 推理过程, secondary_intents: [次要意图] }} response await self.llm.chat(prompt, temperature0.1, max_tokens300) result json.loads(response) # 置信度分层 if result[confidence] 0.8: return Intent.ESCALATE_TO_HUMAN return Intent(result[primary_intent])三、数据增强训练样本从2000到8000BERT和LLM都需要数据。但在客服场景标注数据稀缺。解决方案用大模型生成训练数据。class DataAugmenter: async def generate_variants(self, seed_text: str, intent: str, count: int 10) - list: 用GPT-4o生成同意图的不同表达方式 prompt f你是数据增强助手。请为以下客服场景生成{count}种不同的表达方式 表达同一个意图但换不同的说法。 原始句子「{seed_text}」 意图{intent} 要求 - 包含正式/非正式/口语化/方言化等多种风格 - 包含含情绪的表达如焦虑/愤怒/调侃 - 包含不完整句子如打字中途发送的 以JSON数组返回[{{text: ..., variation_type: ...}}] response await self.llm.chat(prompt, temperature0.8) variants json.loads(response) return [{text: v[text], intent: intent} for v in variants] # 核心数据集建设流程 async def build_training_dataset(seed_data: list, target_size: int 8000): augmenter DataAugmenter() dataset list(seed_data) # 初始2000条人工标注 # 每个种子样本生成3个变体 for sample in seed_data: variants await augmenter.generate_variants( sample[text], sample[intent], count3 ) dataset.extend(variants) # 额外生成多意图的边界样例 boundary_samples await augmenter.generate_boundary_cases() dataset.extend(boundary_samples) return dataset[:target_size] # 最终8000条数据增强后BERT准确率从78%提升到85%LLM从88%提升到93%。四、意图识别中的边界权衡准确率 vs 召回率的取舍在客服路由场景中误路由比不路由的危害更大。把退货用户路由到促销是体验灾难。因此高置信度时自动路由低置信度时默认转人工。95%的请求自动路由93%正确 2%误路由5%升级到人工。LLM成本控制如果8000次/天的对话全部用LLM做意图识别日均API费约$400GPT-4o单价$0.005/次。分层策略BERT处理80%的简单对话20%的复杂对话走LLM。成本从$400/天降到约$64/天。误路由的反馈机制用户说我被转错了时自动记录误判案例。每周人工Review误判top 10反馈到训练集。这个闭环让准确率在实际运行中从上线时的91%微涨到93%。五、总结意图识别准确率从72%到93%的核心经验关键词匹配是基线72%BERT分类是主力85%LLM是终审93%——每层处理自己能处理的问题用大模型做数据增强是稀缺标注数据的有效替代——2000人工样本 6000 LLM生成样本Chain-of-Thought推理让LLM的意图识别更可解释人工Review可以看推理过程而非只看结果准确率vs误路由的权衡要偏向不确定时转人工——因为误路由的代价高于转人工的代价反馈闭环是模型持续改进的驱动力——每周Review误判Top 10当前系统支持28个意图标签93%准确率。剩下7%的错误中3%是多意图混淆用户在一条消息中表达了两个意图4%是全新场景。对于新场景系统自动标记为置信度低转人工处理的同时采集标注数据3天后即可加入模型。这个自动发现新场景→采集数据→更新模型的闭环是意图识别系统长期运行的核心能力。