Разработка AI-системы автоматической оценки звонков операторов
Автоматическое скоринг-система присваивает числовую оценку каждому звонку по стандартизированной методологии, создаёт рейтинги операторов и обнаруживает паттерны, требующие корректирующего обучения.
Многомерная модель оценки
from pydantic import BaseModel
from typing import Optional
class CallScorecard(BaseModel):
call_id: str
operator_id: str
duration_seconds: float
# Compliance (соответствие требованиям)
greeting_score: float # 0-10
hold_procedure_score: float # 0-10
farewell_score: float # 0-10
gdpr_compliance: float # 0-10
# Quality (качество обслуживания)
problem_understanding: float # 0-10
solution_accuracy: float # 0-10
empathy_score: float # 0-10
# Efficiency (эффективность)
aht_relative: float # 0-10 (относительно целевого AHT)
first_call_resolution: float # 0 или 10
# Sales/Upsell (если применимо)
offer_made: Optional[float] = None
offer_quality: Optional[float] = None
@property
def total_score(self) -> float:
scores = [
self.greeting_score * 0.10,
self.hold_procedure_score * 0.05,
self.farewell_score * 0.05,
self.gdpr_compliance * 0.10,
self.problem_understanding * 0.20,
self.solution_accuracy * 0.25,
self.empathy_score * 0.15,
self.aht_relative * 0.05,
self.first_call_resolution * 0.05,
]
return round(sum(scores), 1)
Автоматическая оценка через LLM
async def score_call_llm(transcript: dict) -> CallScorecard:
full_dialog = format_dialog(transcript["turns"])
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": """Ты эксперт по оценке качества обслуживания.
Оцени звонок по каждому критерию от 0 до 10.
Будь объективен, основывай оценку только на тексте.
Верни JSON с полями: greeting_score, hold_procedure_score, farewell_score,
gdpr_compliance, problem_understanding, solution_accuracy, empathy_score,
first_call_resolution. Для каждого поля добавь comment_FieldName с пояснением."""
}, {"role": "user", "content": full_dialog[:6000]}],
response_format={"type": "json_object"}
)
data = json.loads(response.choices[0].message.content)
return CallScorecard(
call_id=transcript["call_id"],
operator_id=transcript["operator_id"],
duration_seconds=transcript["duration"],
**{k: v for k, v in data.items() if not k.startswith("comment_")}
)
Рейтинг операторов
async def calculate_operator_ratings(period: str) -> list[dict]:
"""Расчёт рейтингов за период (неделя/месяц)"""
calls = await db.get_scored_calls(period=period)
operator_stats = {}
for call in calls:
op_id = call["operator_id"]
if op_id not in operator_stats:
operator_stats[op_id] = {"scores": [], "call_count": 0}
operator_stats[op_id]["scores"].append(call["total_score"])
operator_stats[op_id]["call_count"] += 1
ratings = []
for op_id, stats in operator_stats.items():
ratings.append({
"operator_id": op_id,
"avg_score": np.mean(stats["scores"]),
"min_score": np.min(stats["scores"]),
"call_count": stats["call_count"],
"trend": calculate_trend(stats["scores"]) # рост/снижение
})
return sorted(ratings, key=lambda x: x["avg_score"], reverse=True)
Calibration: согласованность AI и людей
Периодически сравниваем AI-оценки с ручными оценками QA-менеджеров. Целевой показатель: корреляция Пирсона > 0.85.
Сроки: система скоринга с 15 критериями — 4–6 недель. С рейтингами и дашбордами — 2–3 месяца.







