Разработка AI-системы детекции негатива в разговоре и эскалации на супервайзера

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы детекции негатива в разговоре и эскалации на супервайзера
Средняя
~5 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Разработка AI-системы детекции негатива в разговоре и эскалации на супервайзера

Система автоматически обнаруживает критические ситуации в звонках: нарастающий негатив, угрозы, жалобы, риск оттока — и немедленно уведомляет супервайзера для вмешательства в реальном времени.

Детектируемые события

from enum import Enum

class EscalationTrigger(Enum):
    SUSTAINED_ANGER = "sustained_anger"        # злость >30 сек
    THREAT_LEGAL = "threat_legal"              # угроза судом/жалобой
    CHURN_RISK = "churn_risk"                  # намерение уйти
    COMPLAINT_ESCALATION = "complaint_esc"    # жалоба нарастает
    OPERATOR_CONFUSION = "operator_confused"   # оператор теряется
    SILENCE_ISSUE = "silence"                  # долгое молчание
    PROFANITY = "profanity"                    # нецензурная лексика

Детектор с накопленным контекстом

class NegativeEscalationDetector:
    def __init__(self, call_id: str):
        self.call_id = call_id
        self.sentiment_history = []
        self.consecutive_negative = 0
        self.escalated = False

    LEGAL_THREAT_PATTERNS = [
        "роспотребнадзор", "прокуратура", "суд", "иск",
        "жалоба", "претензия", "юрист", "адвокат"
    ]
    CHURN_PATTERNS = [
        "расторгну договор", "уйду", "другой оператор",
        "больше не буду", "отключусь"
    ]

    async def process_utterance(self, text: str, speaker: str) -> list[dict]:
        triggers = []

        if speaker != "customer":
            return []

        text_lower = text.lower()

        # Юридические угрозы
        if any(p in text_lower for p in self.LEGAL_THREAT_PATTERNS):
            triggers.append({
                "trigger": EscalationTrigger.THREAT_LEGAL,
                "severity": "critical",
                "evidence": text
            })

        # Риск оттока
        if any(p in text_lower for p in self.CHURN_PATTERNS):
            triggers.append({
                "trigger": EscalationTrigger.CHURN_RISK,
                "severity": "high",
                "evidence": text
            })

        # Накопленный негатив
        sentiment = await analyze_sentiment(text)
        if sentiment["label"] == "NEGATIVE":
            self.consecutive_negative += 1
        else:
            self.consecutive_negative = 0

        if self.consecutive_negative >= 3:
            triggers.append({
                "trigger": EscalationTrigger.SUSTAINED_ANGER,
                "severity": "high",
                "evidence": f"{self.consecutive_negative} негативных реплик подряд"
            })

        if triggers and not self.escalated:
            await self.notify_supervisor(triggers)

        return triggers

    async def notify_supervisor(self, triggers: list[dict]):
        self.escalated = True
        await notification_service.send({
            "call_id": self.call_id,
            "urgency": max(t["severity"] for t in triggers),
            "triggers": triggers,
            "operator_id": self.operator_id,
            "call_url": f"/monitor/calls/{self.call_id}"
        })
        # Push уведомление + звуковой сигнал на рабочем месте супервайзера
        await websocket_manager.notify_supervisors(self.call_id, triggers)

Дашборд супервайзера

Real-time список активных звонков с индикаторами тональности. При эскалации — карточка поднимается наверх с красной меткой и историей диалога.

Сроки: детектор негатива + уведомления — 3–4 недели. Дашборд супервайзера — +2–3 недели.