Разработка AI-дашборда аналитики контакт-центра (AHT, FCR, CSAT, NPS)
Аналитический дашборд контакт-центра агрегирует метрики из разных источников в единый интерфейс с drill-down по операторам, командам, продуктам, времени суток. AI-компонент добавляет автоматическую диагностику причин изменения метрик.
Ключевые метрики и их источники
from dataclasses import dataclass
from typing import Optional
@dataclass
class ContactCenterMetrics:
period: str
# Объёмные метрики
total_calls: int
answered_calls: int
abandoned_calls: int
# Скоростные метрики
average_speed_of_answer: float # ASA (секунды)
average_handle_time: float # AHT (секунды)
average_after_call_work: float # ACW (секунды)
# Качественные метрики
first_call_resolution: float # FCR (%)
customer_satisfaction: float # CSAT (1–5)
net_promoter_score: float # NPS (-100..100)
quality_score: float # Средний QA score
# Нагрузочные метрики
service_level: float # % звонков за N секунд
occupancy: float # % занятости операторов
agent_utilization: float # productive time %
# AI-метрики
containment_rate: Optional[float] = None # % закрытых ботом
deflection_rate: Optional[float] = None # % отклонённых в self-service
automation_accuracy: Optional[float] = None
API для дашборда
@app.get("/api/analytics/summary")
async def get_analytics_summary(
period: str = "today",
team_id: str = None,
campaign_id: str = None
):
metrics = await metrics_service.get_metrics(
period=period,
filters={"team_id": team_id, "campaign_id": campaign_id}
)
# AI-диагностика аномалий
anomalies = await anomaly_detector.detect(metrics)
# Тренды относительно предыдущего периода
trends = await calculate_trends(metrics, period)
return {
"metrics": metrics,
"anomalies": anomalies,
"trends": trends,
"alerts": [a for a in anomalies if a["severity"] == "high"]
}
AI-диагностика причин изменений
async def diagnose_metric_change(
metric: str,
current_value: float,
previous_value: float,
context_data: dict
) -> dict:
"""LLM объясняет почему метрика изменилась"""
change_pct = (current_value - previous_value) / previous_value * 100
if abs(change_pct) < 5:
return {"significant": False}
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "system",
"content": "Ты аналитик контакт-центра. Объясни изменение метрики."
}, {
"role": "user",
"content": f"""
Метрика: {metric}
Изменение: {previous_value:.1f} → {current_value:.1f} ({change_pct:+.1f}%)
Контекст:
- AHT: {context_data.get('aht_trend')}
- Staffing: {context_data.get('staffing')}
- New agents: {context_data.get('new_agents_count')}
- Recent training: {context_data.get('recent_training')}
Назови 2–3 вероятные причины. Кратко."""
}]
)
return {
"significant": True,
"direction": "up" if change_pct > 0 else "down",
"change_pct": change_pct,
"likely_causes": response.choices[0].message.content
}
React компонент дашборда
const ContactCenterDashboard: React.FC = () => {
const [metrics, setMetrics] = useState<CCMetrics>();
const [period, setPeriod] = useState('today');
return (
<div className="dashboard-grid">
<MetricCard title="AHT" value={metrics?.aht} unit="сек" trend={metrics?.trends?.aht} />
<MetricCard title="FCR" value={metrics?.fcr} unit="%" trend={metrics?.trends?.fcr} />
<MetricCard title="CSAT" value={metrics?.csat} unit="/5" trend={metrics?.trends?.csat} />
<MetricCard title="SLA" value={metrics?.service_level} unit="%" trend={metrics?.trends?.sl} />
<AnomalyAlert anomalies={metrics?.anomalies} />
<AgentPerformanceTable agents={metrics?.agents} />
<HourlyCallVolumeChart data={metrics?.hourly_volume} />
</div>
);
};
Сроки: базовый дашборд с 10 метриками — 3–4 недели. Полная аналитическая платформа с AI-диагностикой — 2–3 месяца.







