Разработка AI-системы оценки качества обслуживания (Quality Assurance AI)
AI-система QA автоматически прослушивает и оценивает 100% записей звонков по чек-листу — вместо выборочной ручной проверки 3–5% менеджером по качеству. Масштабирование контроля без роста штата.
Архитектура QA-системы
from dataclasses import dataclass
from typing import Callable
@dataclass
class QACriterion:
id: str
name: str
weight: float # вес в итоговой оценке
evaluator: Callable # функция оценки
class CallQAEvaluator:
def __init__(self, scorecard: list[QACriterion]):
self.scorecard = scorecard
async def evaluate_call(self, call_id: str, transcript: dict) -> dict:
scores = {}
total_weighted = 0
total_weight = sum(c.weight for c in self.scorecard)
for criterion in self.scorecard:
score = await criterion.evaluator(transcript)
scores[criterion.id] = {
"name": criterion.name,
"score": score, # 0-10
"weight": criterion.weight
}
total_weighted += score * criterion.weight
final_score = total_weighted / total_weight
return {
"call_id": call_id,
"final_score": round(final_score, 1),
"grade": self._score_to_grade(final_score),
"breakdown": scores,
"violations": [c for c in self.scorecard if scores[c.id]["score"] < 5]
}
Критерии оценки и их реализация
async def evaluate_greeting(transcript: dict) -> float:
"""Оценка приветствия (0–10)"""
first_agent_text = next(
(t["text"] for t in transcript["turns"] if t["speaker"] == "OPERATOR"), ""
)
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": """Оцени приветствие оператора от 0 до 10.
Критерии:
- Назвал имя компании (+2)
- Назвал своё имя (+2)
- Поздоровался уважительно (+2)
- Предложил помощь (+2)
- Тон доброжелательный (+2)
Верни только число."""
}, {"role": "user", "content": first_agent_text}]
)
try:
return min(10, max(0, float(response.choices[0].message.content.strip())))
except ValueError:
return 5.0
async def evaluate_hold_notification(transcript: dict) -> float:
"""Предупредил ли оператор о постановке на удержание"""
hold_keywords = ["подождите", "поставлю на удержание", "одну минуту"]
agent_texts = " ".join(t["text"].lower() for t in transcript["turns"]
if t["speaker"] == "OPERATOR")
return 10.0 if any(kw in agent_texts for kw in hold_keywords) else 0.0
Типовой чек-лист (20 критериев)
| Категория | Критерии | Вес |
|---|---|---|
| Приветствие | Имя, компания, доброжелательность | 15% |
| Идентификация | Верификация клиента | 10% |
| Понимание проблемы | Уточнение, активное слушание | 20% |
| Решение | Компетентность, правильность | 25% |
| Завершение | Резюме, удовлетворённость | 15% |
| Соответствие стандартам | Запреты, compliance | 15% |
Авторепорты операторам
Еженедельный отчёт оператору: динамика оценки, топ-3 сильных и слабых стороны, примеры лучших и худших звонков недели.
Сроки: базовый QA-модуль с 10 критериями — 4–6 недель. Полная система с дашбордами — 3 месяца.







