智能客服留言质检系统架构

simon
4
2025-10-15

1. 打分维度

  • 互斥性:每个行为只归属一个维度

  • 可观测性:所有判断必须基于对话文本中明确出现的语言行为

  • 可解释性:每个维度对应明确的改进方向(如“需加强产品培训” vs “需提升情绪管理”)

维度

聚焦点

排除内容

典型可观测行为

1. 服务态度与主动性
(原“服务意识”精简)

行为动机与语气
——客服是否“愿意服务”

不涉及问题是否解决、知识是否正确

- 使用“您好”“请”“感谢”等礼貌用语
- 主动问候或跟进(如“还有其他问题吗?”)
- 未出现冷漠、敷衍、推诿语句(如“你自己看”“没办法”)
- 即使无法解决,仍保持积极语气

2. 沟通与表达能力
(原“服务技巧”拆解)

语言组织与信息传递效率
——客服是否“说清楚”

不评价内容对错,只看表达是否清晰

- 语句简洁、逻辑连贯
- 无歧义、无冗余重复
- 能用用户能理解的语言解释(避免堆砌术语)
- 有效使用分段、标点、列表提升可读性

3. 业务知识准确性
(原“业务能力”聚焦)

事实性内容的正确性
——客服是否“说对了”

不评价态度、表达方式、是否主动

- 产品功能、价格、规则描述准确
- 流程步骤(如退款、认证)无错误
- 政策条款引用正确(如“根据XX规定…”)
- 未编造信息或回避专业问题

4. 问题解决有效性
(新增独立维度)

是否真正推动问题闭环
——客服是否“帮到位”

不评价态度或知识,只看结果导向

- 准确识别用户核心诉求
- 提供具体、可操作的解决方案
- 引导用户提供必要信息以推进解决
- 对话结束时问题已解决或明确下一步

5. 情绪识别与回应
(原“同理心”明确化)

对用户情绪的感知与反馈
——客服是否“懂情绪”

不包含一般礼貌,仅针对情绪场景

- 识别用户负面情绪(如“着急”“生气”“困惑”)
- 明确回应情绪(如“理解您着急”“抱歉让您不便”)
- 在用户表达不满后主动安抚
- 未对用户情绪视而不见或火上浇油

2. 提示词

你是一名客服质检专家。请根据以下对话,从5个互斥维度对客服表现评分(0–100分,整数)。评分必须严格基于对话文本中**明确出现的语言行为**,不得推测未提及内容。

【对话内容】

{{对话}}

【评分维度】

1. 服务态度与主动性:是否礼貌、积极、主动服务?(不看问题是否解决)

2. 沟通与表达能力:语言是否清晰、简洁、易懂?(不看内容对错)

3. 业务知识准确性:产品/流程/政策描述是否正确?(不看语气或表达方式)

4. 问题解决有效性:是否准确理解问题并推动有效解决?(不看态度)

5. 情绪识别与回应:是否识别并恰当回应用户情绪?(仅在用户有情绪时评分,如无情绪则为 100 分)

输出标准JSON,无其他内容: { "service_attitude": 90, "communication": 85, "business_accuracy": 95, "problem_resolution": 88, "emotional_response": 80 }

3. 质检流水线架构图

┌──────────────────────┐
│   1. 原始对话数据源    │
│  (客服系统/CRM/工单)  │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│   2. 数据预处理模块    │
│  - 对话清洗(去广告、脱敏)│
│  - 角色标注(区分客服/用户)│
│  - 分段/截断(适配LLM上下文)│
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│   3. 质检任务调度器     │
│  - 批量/流式任务分发    │
│  - 优先级队列(如VIP对话优先)│
│  - 失败重试 & 限流控制   │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│   4. LLM 质检评分引擎   │
│  - 加载标准化Prompt模板 │
│  - 调用大模型API(Qwen/GPT等)│
│  - 输出结构化JSON评分   │
│  - 支持多模型投票(可选) │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│   5. 后处理与校验模块   │
│  - JSON解析 & 异常值检测 │
│  - 逻辑一致性检查(如:用户愤怒但emotional_response=100?)│
│  - 置信度过滤(低置信样本标记复核)│
│  - 自动填充缺失维度(如无情绪→emotional_response=100)│
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│   6. 质检结果存储       │
│  - 写入数据库(MySQL/ClickHouse)│
│  - 字段:对话ID、5维度分、整体分、模型版本、时间戳 │
│  - 关联客服ID、用户ID、业务类型等元数据 │
└──────────┬───────────┘
           │
           ▼
┌──────────────────────┐
│   7. 应用与反馈层       │
│  - 客服绩效看板(BI工具)│
│  - 自动预警(低分对话触发督导)│
│  - 人工复核队列(异常样本)│
│  - 模型效果监控(与人工标注对比)│
└──────────────────────┘

以下是为解耦后的五大质检维度设计的 人工质检对照表(Human QA Rubric),专用于:

  • 人工质检员打分时统一标准

  • 校准大模型自动评分结果

  • 培训新质检人员

  • 构建高质量标注数据集

每个维度按 0分、50分、100分 三个锚点给出具体、可观察、无歧义的行为描述,确保评分客观、一致、可解释。

4. 客服服务质量人工质检对照表(五维度无交叉版)

4.1. 1. 服务态度与主动性

聚焦:语气是否积极、礼貌、主动?不看问题是否解决。

分数

行为标准(必须基于对话文本)

100分

- 全程使用“您好”“请”“谢谢”“抱歉”等礼貌用语
- 主动问候或结束语(如“还有其他问题吗?”)
- 即使无法解决,仍表达愿意协助(如“我帮您反馈”)
- 无任何冷漠、命令式、推诿语句

50分

- 礼貌用语缺失或偶尔使用
- 仅被动回应,无主动服务行为
- 出现轻微敷衍(如“稍等”后长时间无回复,但未说明原因)
- 语气中性,无明显积极或消极

0分

- 使用命令式、质问式语气(如“你自己看规则”)
- 明确推诿(如“不归我管”“你找别人”)
- 出现讽刺、不耐烦语句(如“说了多少遍了”)
- 无任何礼貌用语


4.2. 2. 沟通与表达能力

聚焦:语言是否清晰、简洁、易懂?不评价内容对错。

分数

行为标准

100分

- 语句简短、逻辑清晰、分段合理
- 用用户能理解的语言解释(避免堆砌术语)
- 无重复、啰嗦、自相矛盾
- 关键信息突出(如步骤用“1. 2. 3.”列出)

50分

- 表达基本可懂,但有轻微冗余或语序混乱
- 偶尔使用用户可能不懂的术语但未解释
- 回复较长但未分段,阅读体验一般

0分

- 语句混乱、逻辑断裂,用户难以理解
- 大量重复相同内容
- 使用大量缩写/黑话未解释(如“走KP流程”)
- 回答与问题明显不相关(非知识错误,而是表达跑偏)


4.3. 3. 业务知识准确性

聚焦:产品/流程/政策描述是否正确?不看语气或表达方式。

分数

行为标准

100分

- 产品功能、价格、时效等描述完全准确
- 业务流程步骤正确(如退款需“先申请→审核→到账”)
- 引用政策条款无误(如“根据《XX协议》第3条”)
- 专业问题正面回答,无回避或模糊

50分

- 部分信息模糊但未错误(如“大概3天”而非“1-3工作日”)
- 流程顺序基本正确但遗漏次要步骤
- 未引用具体条款但原则正确

0分

- 关键信息错误(如“退款7天到账”实际为24小时)
- 流程颠倒或缺失关键环节(如跳过验证直接退款)
- 编造不存在的政策或功能
- 遇专业问题直接转移话题或说“不知道”


4.4. 4. 问题解决有效性

聚焦:是否推动问题真正解决?不看态度或知识细节。

分数

行为标准

100分

- 准确识别用户核心诉求(非表面问题)
- 提供具体、可操作的解决方案(如“请点击订单页右上角‘申请售后’”)
- 有效引导用户提供必要信息(如“请提供订单号”)
- 对话结束时问题已解决或明确下一步责任人/时间

50分

- 理解部分问题但未抓核心
- 方案笼统(如“我们会处理”但无具体动作)
- 未引导用户提供关键信息,导致无法推进
- 问题未闭环,但承诺后续跟进

0分

- 完全误解用户问题
- 提供无效或错误解决方案(如让用户“重启路由器”解决账号问题)
- 未尝试解决,直接结束对话
- 多次来回仍未推进问题


4.5. 5. 情绪识别与回应

聚焦:是否识别并回应用户情绪?仅在用户有情绪时评分。

分数

行为标准

100分

- 用户表达负面情绪(如“太慢了!”“生气!”)
- 客服明确识别并回应(如“理解您着急”“抱歉让您久等”)
- 主动安抚并承诺加快处理
- 后续语气更温和,体现关怀

50分

- 用户有情绪,客服仅简单道歉(如“对不起”)但未共情
- 未明确提及用户情绪状态
- 安抚后未调整服务节奏

0分

- 用户明显不满,客服完全无视情绪
- 回应冷漠或火上浇油(如“规定就这样,没办法”)
- 质疑用户情绪(如“至于这么生气吗?”)

N/A(默认100)

- 用户全程无情绪表达(如纯咨询类对话)→ 本项不扣分,记为100

💡 质检员操作提示:若用户无情绪,直接打100分,不视为“缺失能力”。

4.6. 使用说明
  1. 逐维度独立打分,禁止因某一维度差而拉低其他维度。

  2. 仅依据对话文本,不得假设客服“本意是好的”或“可能系统卡了”。

  3. 50分是“及格线”:代表“基本完成但有明显提升空间”。

  4. 整体分建议:可计算加权平均(如各20%),或由质检员在五维基础上综合判断(用于人工复核场景)。

4.7. 📥 附:质检记录表示例(Excel/数据库字段)

对话ID

客服ID

服务态度

沟通表达

业务准确

问题解决

情绪回应

整体分

备注(典型语句)

S1001

AGT05

100

90

100

100

100

98

“理解您着急,马上加急处理!”

S1002

AGT12

60

80

40

50

100

66

错误告知退款需7天(实际24h)

5. 客服质检大模型评估体系(Kappa + MAE 联合分析)

5.1. 评估目标

目标

衡量指标

说明

1. 与人工对齐程度

Kappa(分类一致)
MAE(分数偏差)

大模型是否“像人一样打分”?

2. 自身稳定性

Kappa(多次运行一致性)
MAE(多次运行波动)

同一对话多次打分是否稳定?

3. 维度级诊断

分维度 Kappa/MAE

哪些维度可靠?哪些需优化?

5.2. 核心指标定义
5.2.1. Cohen’s Kappa 系数
  • 用途:衡量分类一致性(排除随机一致)

  • 输入:将 0–100 分离散为 3 类

  • 高(H):80–100 → 编码 2

  • 中(M):60–79 → 编码 1

  • 低(L):0–59 → 编码 0

  • 解读

  • ≥0.81:几乎完美

  • 0.61–0.80:高度一致(可接受)

  • <0.60:需优化标准或模型

5.2.2. MAE(Mean Absolute Error,平均绝对误差)
  • 公式

  • 单位:分数点(0–100)

  • 解读

  • MAE ≤ 5:几乎无偏差

  • MAE 5–10:可接受

  • MAE > 10:偏差显著,需干预

Kappa 看“判断逻辑是否一致”,MAE 看“分数是否接近”,二者互补。

5.3. 实验设计
5.3.1. 数据准备
  • 样本量:≥50 条对话(建议 100–200)

  • 覆盖性:包含不同业务、情绪、复杂度

  • 人工标注:2–3 名质检员独立打分,取平均或共识作为 黄金标准

5.3.2. 大模型运行设置
  • 运行次数:≥3 次(模拟多个“AI 质检员”)

  • 方式(任选其一):

  • 同一模型 + 不同随机种子(seed=1,2,3

  • 不同模型(Qwen-Max, GPT-4o, Claude-3.5)

  • 同一模型 + 微小 Prompt 变体(A/B 测试)

5.3.3. 输出格式

每条对话输出 5 个维度的 0–100 整数分:

{
  "service_attitude": 85,
  "communication": 90,
  "business_accuracy": 88,
  "problem_resolution": 82,
  "emotional_response": 100
}
5.4. 评估流程(完整步骤)
5.4.1. 步骤 1:数据预处理
  • 人工分 & AI 分 → 合并为 DataFrame

  • 对每个维度,生成分类标签(用于 Kappa)

5.4.2. 步骤 2:计算指标(按维度)

对每个维度(如 service_attitude):

指标类型

计算方式

AI vs Human Kappa

对每次 AI 运行,计算与人工的 Cohen’s Kappa,取平均

AI vs Human MAE

对每次 AI 运行,计算 MAE,取平均

AI Internal Kappa

所有 AI 运行两两计算 Kappa,取平均

AI Internal MAE

所有 AI 运行两两计算 MAE,取平均(衡量波动)

5.4.3. 步骤 3:汇总报告

维度

AI vs Human
Kappa

AI vs Human
MAE

AI Internal
Kappa

AI Internal
MAE

评估结论

服务态度

0.85

4.2

0.92

2.1

✅ 高度可靠

沟通表达

0.78

6.8

0.88

3.5

✅ 可用

业务准确

0.62

11.3

0.85

4.0

⚠️ 与人工分歧大,检查知识库

问题解决

0.71

8.5

0.80

5.2

⚠️ 需优化 Prompt

情绪回应

0.55

13.7

0.72

6.8

❗ 标准模糊,增加情绪样例

📌 决策阈值建议

  • 上线条件:所有维度 Kappa ≥ 0.6 且 MAE ≤ 10

  • 需优化:任一维度 Kappa < 0.6 或 MAE > 12

5.5. Python 自动化实现(完整代码框架)
import pandas as pd
import numpy as np
from sklearn.metrics import cohen_kappa_score
from itertools import combinations

# ----------------------------
# 1. 配置
# ----------------------------
DIMENSIONS = ["service_attitude", "communication", "business_accuracy", 
              "problem_resolution", "emotional_response"]
N_RUNS = 3
HUMAN_FILE = "human_scores.csv"
AI_FILES = [f"ai_run_{i}.csv" for i in range(1, N_RUNS + 1)]

# ----------------------------
# 2. 加载数据
# ----------------------------
human_df = pd.read_csv(HUMAN_FILE)
ai_dfs = [pd.read_csv(f) for f in AI_FILES]

# 确保 session_id 对齐
session_ids = human_df["session_id"].tolist()
for df in [human_df] + ai_dfs:
    df.set_index("session_id", inplace=True)
    df = df.reindex(session_ids)  # 保证顺序一致

# ----------------------------
# 3. 辅助函数
# ----------------------------
def score_to_cat(score):
    if score >= 80: return 2
    elif score >= 60: return 1
    else: return 0

def compute_kappa(y1, y2):
    # 处理全一致导致 Kappa=NaN 的情况
    if len(set(y1)) == 1 and len(set(y2)) == 1 and y1[0] == y2[0]:
        return 1.0
    return cohen_kappa_score(y1, y2)

# ----------------------------
# 4. 评估主循环
# ----------------------------
results = []

for dim in DIMENSIONS:
    # 获取人工评分(数值)
    human_scores = human_df[dim].astype(int).tolist()
    human_cats = [score_to_cat(s) for s in human_scores]
    
    # 获取所有 AI 运行结果
    ai_scores_list = [df[dim].astype(int).tolist() for df in ai_dfs]
    ai_cats_list = [[score_to_cat(s) for s in scores] for scores in ai_scores_list]
    
    # ---- AI vs Human ----
    ai_vs_human_kappas = []
    ai_vs_human_maes = []
    for ai_scores, ai_cats in zip(ai_scores_list, ai_cats_list):
        k = compute_kappa(human_cats, ai_cats)
        mae = np.mean([abs(h - a) for h, a in zip(human_scores, ai_scores)])
        ai_vs_human_kappas.append(k)
        ai_vs_human_maes.append(mae)
    
    # ---- AI Internal ----
    ai_internal_kappas = []
    ai_internal_maes = []
    for (s1, c1), (s2, c2) in combinations(zip(ai_scores_list, ai_cats_list), 2):
        k = compute_kappa(c1, c2)
        mae = np.mean([abs(a - b) for a, b in zip(s1, s2)])
        ai_internal_kappas.append(k)
        ai_internal_maes.append(mae)
    
    # ---- 汇总 ----
    results.append({
        "dimension": dim,
        "ai_vs_human_kappa": np.mean(ai_vs_human_kappas),
        "ai_vs_human_mae": np.mean(ai_vs_human_maes),
        "ai_internal_kappa": np.mean(ai_internal_kappas) if ai_internal_kappas else 1.0,
        "ai_internal_mae": np.mean(ai_internal_maes) if ai_internal_maes else 0.0
    })

# ----------------------------
# 5. 输出结果
# ----------------------------
result_df = pd.DataFrame(results)
print(result_df.round(3))

# 保存
result_df.to_csv("llm_qa_evaluation_report.csv", index=False)

# 整体通过判断
passed = all(
    (row["ai_vs_human_kappa"] >= 0.6) and (row["ai_vs_human_mae"] <= 10)
    for _, row in result_df.iterrows()
)
print(f"\n✅ 大模型质检系统 {'通过' if passed else '未通过'} 上线标准")

5.6. 结果应用建议

场景

行动

Kappa 高 + MAE 低

可全量替代人工质检

Kappa 低 + MAE 低

分数接近但判断逻辑不同 → 检查分类边界(如 59 vs 60)

Kappa 高 + MAE 高

分类一致但分数系统偏移 → 校准分数映射

Kappa 低 + MAE 高

模型不可靠 → 优化 Prompt / 微调 / 增加样例

5.7. 附:评估报告模板(Markdown)
# 大模型客服质检评估报告

- **样本量**:120 条对话  
- **人工标注**:3 名质检员,Kappa=0.78(内部一致)  
- **AI 运行**:Qwen-Max,3 次(seed=42, 100, 2025)

## 结果汇总

| 维度 | Kappa (vs Human) | MAE (vs Human) | 结论 |
|------|------------------|----------------|------|
| 服务态度 | 0.85 | 4.2 | ✅ 优秀 |
| 业务准确 | 0.62 | 11.3 | ⚠️ 需优化知识库 |

## 建议
1. 对“业务准确”维度,补充 10 条典型错误案例到 Prompt
2. 上线初期,对 MAE > 15 的对话自动触发人工复核

动物装饰