
(2026.08.20)
摘要:企业AI陪练系统的核心价值,不仅在于"让学员有地方练",更在于"练完知道哪里差"。本文从实战角度出发,拆解一套完整的语音-语义-情绪三维评分模型,涵盖特征提取、多模态融合、权重调优与业务落地全流程,并附关键代码片段。适合正在搭建或优化AI陪练评分体系的技术与产品同学参考。
早期AI陪练系统的评分逻辑很简单:学员说了某句标准话术,命中即得分。这种"关键词匹配"模式在Demo阶段跑得很顺,但一上真实业务场景就露馅:
职行力在服务安踏、玛氏等头部客户的过程中发现:一线销售的对话质量,是语音表现、语义准确、情绪管理三个维度共同作用的结果。任何一个维度的短板,都会直接拉低成交转化。这也是我们从单一关键词评分,演进为多模态三维评估体系的初衷。
我们将对话质量拆解为三个独立评估维度,每个维度输出0-100分,最终通过可配置权重融合为综合得分:
| 维度 | 评估对象 | 核心技术 | 业务意义 |
|---|---|---|---|
| 语音维度 (V) | 语速、停顿、音量、流利度、发音清晰度 | 音频信号处理 + ASR置信度 | 专业感与可理解性 |
| 语义维度 (S) | 话术命中、意图识别、逻辑连贯、信息完整 | 大模型NLU + 知识图谱 | 内容准确性与SOP执行度 |
| 情绪维度 (E) | 情绪倾向、共情表达、对抗/安抚程度 | 语音情绪识别 + 文本情感分析 | 客户体验与关系维护 |
综合得分公式:
Score = w_v × V + w_s × S + w_e × E
其中 w_v + w_s + w_e = 1,默认权重可根据行业特性动态调整(详见第五节)。
语音维度的核心是把"听起来专不专业"量化。我们提取以下关键指标:
| 指标 | 计算方法 | 理想区间 | 异常表现 |
|---|---|---|---|
| 语速 | 字/分钟 | 180-220字/分钟 | 过快(>260)显紧张,过慢(<120)显拖沓 |
| 停顿合理性 | 句间停顿占比 | 15%-25% | 过多显犹豫,过少显压迫 |
| 音量稳定性 | 音量标准差 | <5dB | 波动大显不自信 |
| 流利度 | ASR插入/删除/替换率 | WER < 15% | 高WER显准备不足 |
| 填充词频率 | "嗯""啊""那个"占比 | <3% | 过多显不专业 |
使用 librosa 进行基础音频特征提取:
import librosa
import numpy as np
def extract_voice_features(audio_path):
y, sr = librosa.load(audio_path, sr=16000)
# 语速估算:基于ASR结果的字数 / 音频时长(分钟)
# 此处假设 asr_text 为已转写的文本
duration_min = len(y) / sr / 60
speech_rate = len(asr_text) / duration_min
# 音量稳定性
rms = librosa.feature.rms(y=y)[0]
volume_std = np.std(rms)
# 停顿检测:基于能量阈值识别静音段
intervals = librosa.effects.split(y, top_db=25)
total_pause = duration_min * 60 - sum((e-s)/sr for s,e in intervals)
pause_ratio = total_pause / (duration_min * 60)
return {
"speech_rate": speech_rate,
"volume_std": volume_std,
"pause_ratio": pause_ratio
}
每个指标按"越接近理想区间中心得分越高"的原则映射到0-100分,再取加权平均:
def rate_speech_rate(value):
"""语速评分:理想区间180-220,过高过低均扣分"""
if 180 <= value <= 220:
return 100
elif value < 180:
return max(0, 100 - (180 - value) * 1.5)
else:
return max(0, 100 - (value - 220) * 1.2)
def compute_voice_score(features):
scores = {
"speech_rate": rate_speech_rate(features["speech_rate"]),
"volume_stability": rate_volume_stability(features["volume_std"]),
"pause_quality": rate_pause_quality(features["pause_ratio"]),
"fluency": rate_fluency(features["wer"]),
"filler_words": rate_filler_words(features["filler_ratio"])
}
# 权重可根据业务调整
weights = {"speech_rate": 0.25, "volume_stability": 0.15,
"pause_quality": 0.20, "fluency": 0.25, "filler_words": 0.15}
return sum(scores[k] * weights[k] for k in scores)
传统方案用正则表达式匹配关键词,比如:
# 旧方案:死板的关键词匹配
if "包邮" in response and "七天无理由" in response:
score += 20
这种方案的致命伤是无法识别同义表达(如"免运费""可以退货"),也无法评估逻辑顺序(卖点先后顺序对成交影响很大)。
我们升级后的方案基于大模型的语义理解能力,将评估拆分为四个子维度:
| 子维度 | 评估内容 | 技术实现 |
|---|---|---|
| 话术命中率 | 标准卖点/话术是否被表达 | Embedding相似度 + 大模型NLI |
| 意图匹配度 | 是否准确识别客户意图并响应 | 意图分类模型 |
| 逻辑连贯性 | 回答是否有条理、因果关系是否清晰 | 大模型Chain-of-Thought评估 |
| 信息完整度 | 必要信息是否无遗漏 | 结构化抽取 + 规则校验 |
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
def semantic_hit_rate(response, standard_phrases, threshold=0.75):
"""
计算学员回答与标准话术的语义命中率
standard_phrases: [("话术A", weight), ("话术B", weight), ...]
"""
resp_emb = model.encode(response, normalize_embeddings=True)
hits = []
for phrase, weight in standard_phrases:
phrase_emb = model.encode(phrase, normalize_embeddings=True)
similarity = np.dot(resp_emb, phrase_emb)
hits.append({
"phrase": phrase,
"matched": similarity > threshold,
"similarity": float(similarity),
"weight": weight
})
# 加权命中率
total_weight = sum(h["weight"] for h in hits)
hit_weight = sum(h["weight"] for h in hits if h["matched"])
return (hit_weight / total_weight) * 100, hits
对于逻辑和表达的评估,我们采用"大模型评大模型"的LLM-as-a-Judge模式:
EVALUATION_PROMPT = """你是一位资深销售培训导师。请对以下销售对话进行评分。
【客户问题】{customer_question}
【学员回答】{response}
【评分标准】
1. 是否直接回应了客户问题?(0-25分)
2. 回答结构是否清晰(总-分-总/痛点-方案-利益)?(0-25分)
3. 卖点阐述是否有说服力?(0-25分)
4. 是否引导了下一步行动(邀约/成交/留资)?(0-25分)
请以JSON格式输出:{"dimension_scores": {...}, "total": xx, "suggestions": "..."}"""
def evaluate_by_llm(customer_question, response, model_client):
prompt = EVALUATION_PROMPT.format(
customer_question=customer_question,
response=response
)
result = model_client.complete(prompt, temperature=0.2)
return parse_json(result)
实战提示:LLM-as-a-Judge需要控制temperature较低(0.1-0.3),并在Prompt中给出明确的评分细则和示例,才能保持评估结果的一致性。建议对同一对话多次采样取平均,降低随机性。
同一个回答"这个款式确实有点贵",搭配不同的语气和情绪,含义截然不同:
纯文本语义分析无法捕捉语音中的情绪信息,因此情绪维度必须语音+文本双通道融合。
基于语音的情绪识别使用声学特征(pitch、energy、speaking rate变化、MFCC等)训练分类模型:
# 基于openSMILE提取声学特征
# 我们实际使用微调的wav2vec 2.0 + 情感分类头
from transformers import Wav2Vec2ForSequenceClassification, Wav2Vec2FeatureExtractor
class VoiceEmotionRecognizer:
def __init__(self, model_path):
self.model = Wav2Vec2ForSequenceClassification.from_pretrained(model_path)
self.processor = Wav2Vec2FeatureExtractor.from_pretrained(model_path)
self.emotion_map = {0: "neutral", 1: "positive", 2: "negative", 3: "anxious"}
def predict(self, audio_path):
y, sr = librosa.load(audio_path, sr=16000)
inputs = self.processor(y, sampling_rate=16000, return_tensors="pt")
logits = self.model(**inputs).logits
pred = torch.argmax(logits, dim=-1).item()
confidence = torch.softmax(logits, dim=-1)[0][pred].item()
return self.emotion_map[pred], confidence
文本侧使用大模型进行细粒度情感分析,不只输出"正/负",而是分析情绪策略是否得当:
| 场景 | 学员应有的情绪策略 | 系统检测维度 |
|---|---|---|
| 客户抱怨 | 安抚、共情、降低对抗 | 共情词使用、道歉诚意度 |
| 客户犹豫 | 耐心引导、消除顾虑 | 催促感vs引导感平衡 |
| 客户满意 | 趁热打铁、推进成交 | 积极情绪呼应、行动号召 |
def compute_emotion_score(voice_emotion, text_emotion, context):
"""
综合语音情绪和文本情绪策略,输出0-100分
context: 当前对话场景(complaint/hesitation/interest/...)
"""
# 基础情绪一致性:语音和文本情绪是否一致
consistency = 1.0 if voice_emotion["label"] == text_emotion["label"] else 0.6
# 场景适配度:当前情绪策略是否符合场景要求
scene_fit = check_emotion_scene_fit(
emotion=voice_emotion["label"],
context=context
) # 返回0-1
# 情绪稳定性:对话过程中情绪波动是否过大
stability = emotion_stability_score(history_emotions)
return (consistency * 0.3 + scene_fit * 0.5 + stability * 0.2) * 100
静态权重适合通用场景:
# 默认权重:语义最重要,语音和情绪并重
DEFAULT_WEIGHTS = {"voice": 0.25, "semantic": 0.50, "emotion": 0.25}
动态权重适合垂直行业精细化运营。例如:
| 行业/场景 | 语音权重 | 语义权重 | 情绪权重 | 原因 |
|---|---|---|---|---|
| 电话销售 | 0.30 | 0.45 | 0.25 | 话术准确性优先 |
| 客服投诉处理 | 0.20 | 0.30 | 0.50 | 情绪安抚是核心 |
| 高端门店导购 | 0.35 | 0.35 | 0.30 | 专业感与亲和力并重 |
| 保险合规双录 | 0.25 | 0.55 | 0.20 | 合规话术必须命中 |
权重的行业适配可以通过A/B测试+业务专家反馈迭代优化。
融合时引入"短板保护"机制:任一维度低于60分,综合得分封顶80分。避免"语义满分但情绪对抗"的伪高分。
def fuse_scores(v, s, e, weights, floor=60, cap_if_below=80):
base = weights["voice"] * v + weights["semantic"] * s + weights["emotion"] * e
if min(v, s, e) < floor:
return min(base, cap_if_below)
return base
AI陪练的价值在于"练完立刻知道哪里差"。我们的系统架构确保:对话结束3秒内,三维评分报告+改进建议推送至学员端。
评分报告示例:
{
"overall": 78,
"dimensions": {
"voice": {"score": 82, "highlights": ["语速适中", "停顿自然"], "improvements": ["减少'然后'等填充词"]},
"semantic": {"score": 75, "highlights": ["话术命中3/5"], "improvements": ["遗漏'售后保障'卖点", "建议补充FABE中的Benefit部分"]},
"emotion": {"score": 76, "highlights": ["整体情绪积极"], "improvements": ["客户提出异议时安抚不够及时"]}
},
"suggestions": [
"本次对话话术命中率为60%,建议重点练习'售后保障'话术分支",
"当客户说'我再考虑一下'时,尝试使用'我理解您的谨慎,很多客户最初也有顾虑...'的共情话术"
]
}
评分结果不是终点,而是下一轮训练的起点:
这就是"诊断-训练-再诊断"的飞轮闭环。
AI陪练的评分体系正在从"有没有说到关键词"进化到"说得对不对、好不好、客户感受如何"。语音-语义-情绪三维评估模型,本质上是用技术手段量化"对话质量"这个曾经只能靠师傅坐旁边听的模糊标准。
三个关键经验:
未来,随着多模态大模型(如GPT-4o、Qwen-Audio)的成熟,语音-语义-情绪的边界将进一步模糊,端到端的对话质量评估会成为新方向。但在当前落地阶段,拆解清晰的三维评估体系,依然是业务效果与工程成本的最佳平衡点。
本文基于职行力「职慧AI陪练」产品实战经验撰写。职行力,数字化人效运营平台,提高成交率就找职行力。