欢迎光临
我们一直在努力

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

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

一、客服场景的意图识别挑战

某电商平台日均客服对话约8000次。传统方案是关键词匹配做意图分类——"退货"→退货流程,"发货"→物流查询。准确率72%,剩下28%是"问发货但不说发货二字"等复杂表达。

例如用户说"你们这速度也太慢了,隔壁家隔天就到了",意图是催发货,但关键词匹配不到。更复杂的如"上次买的那个型号这次还有活动吗"——同时涉及"商品"和"促销"两个意图。

目标明确:把意图识别准确率从72%提到90%以上,让AI正确路由大部分客服对话。

二、三个阶段的优化路径

V1期:关键词匹配(准确率72%,基线)

INTENT_KEYWORDS = {
"退货": ["退货", "退钱", "退款", "不要了", "想退"],
"物流": ["发货", "物流", "快递", "到哪", "什么时候到"],
"商品": ["价格", "优惠", "折扣", "活动", "推荐"],
"投诉": ["投诉", "差评", "态度", "骂人", "垃圾"],
}

问题:无法处理语义相近但表达不同的句子。

V2期:BERT分类器(准确率85%,+13pp)

from transformers import AutoModelForSequenceClassification

class IntentClassifier:
def __init__(self):
self.model = AutoModelForSequenceClassification.from_pretrained(
"bert-base-chinese",
num_labels=len(INTENT_LABELS)
)
self.labels = [
"退货退款", "物流查询", "商品咨询", "促销活动",
"投诉建议", "账号问题", "支付问题", "其他"
]

def classify(self, text: str) -> tuple[str, float]:
inputs = self.tokenizer(text, return_tensors="pt",
truncation=True, max_length=128)
with torch.no_grad():
logits = self.model(**inputs).logits

probs = torch.softmax(logits, dim=1)[0]
top_idx = torch.argmax(probs).item()

return self.labels[top_idx], probs[top_idx].item()

BERT的局限:对没见过的新表达泛化不足。用户说"上次买的那个还有货吗"——BERT可能不确定是"商品咨询"还是"促销活动"。

V3期:LLM多轮理解 + Chain-of-Thought(准确率93%,+8pp)

V3不再只分类单条消息,而是理解整段对话的上下文:

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, temperature=0.1,
max_tokens=300)
result = json.loads(response)

# 置信度分层
if result["confidence"] < 0.8:
return Intent.ESCALATE_TO_HUMAN
return Intent(result["primary_intent"])

三、数据增强:训练样本从2000到8000

BERT和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, temperature=0.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"], count=3
)
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费约$400(GPT-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天后即可加入模型。这个"自动发现新场景→采集数据→更新模型"的闭环是意图识别系统长期运行的核心能力。

赞(0)
未经允许不得转载:171主机测评 » AI工作流在电商客服场景的复盘:意图识别准确率从72%到93%的优化之路
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址