Разработка AI-системы подсказок оператору в реальном времени (Agent Assist)
Agent Assist слушает разговор в реальном времени и выводит на экран оператора подсказки: ответы на вопросы клиента, следующий шаг по скрипту, предупреждение о негативной тональности. Снижает AHT на 15–25%, повышает FCR на 8–12%.
Архитектура Agent Assist
Call Audio → STT (Streaming) → NLU Pipeline → Suggestions Engine → Operator UI
↓ ↓ ↓
Live Transcript Intent/Entities Knowledge Base
(100–300ms) CRM Context
Script State
Real-time NLU pipeline
import asyncio
from dataclasses import dataclass
@dataclass
class AssistSuggestion:
type: str # answer | next_step | warning | document | offer
content: str
confidence: float
source: str = None # knowledge base URL, CRM field, etc.
class AgentAssistProcessor:
def __init__(self):
self.kb = KnowledgeBase()
self.crm = CRMConnector()
self.llm = AsyncOpenAI()
async def process_utterance(
self,
speaker: str, # "customer" | "agent"
text: str,
session: dict
) -> list[AssistSuggestion]:
suggestions = []
if speaker == "customer":
# Клиент задал вопрос — ищем ответ
if "?" in text or await self.is_question(text):
kb_results = await self.kb.search(text, top_k=3)
if kb_results:
suggestions.append(AssistSuggestion(
type="answer",
content=kb_results[0]["answer"],
confidence=kb_results[0]["score"],
source=kb_results[0]["url"]
))
# Детектируем жалобу
sentiment = await self.analyze_sentiment(text)
if sentiment["label"] == "negative" and sentiment["score"] > 0.8:
suggestions.append(AssistSuggestion(
type="warning",
content="Клиент выражает недовольство. Рекомендуется эмпатийная реакция.",
confidence=sentiment["score"]
))
# Следующий шаг по скрипту
next_step = await self.get_next_script_step(session)
if next_step:
suggestions.append(AssistSuggestion(
type="next_step",
content=next_step,
confidence=1.0
))
return suggestions
База знаний с семантическим поиском
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
class KnowledgeBase:
def __init__(self):
self.encoder = SentenceTransformer("intfloat/multilingual-e5-large")
self.index = faiss.IndexFlatIP(1024)
self.articles = []
def add_article(self, question: str, answer: str, url: str = None):
embedding = self.encoder.encode(
f"query: {question}", normalize_embeddings=True
)
self.index.add(embedding.reshape(1, -1))
self.articles.append({"question": question, "answer": answer, "url": url})
async def search(self, query: str, top_k: int = 3) -> list[dict]:
embedding = self.encoder.encode(
f"query: {query}", normalize_embeddings=True
)
scores, indices = self.index.search(embedding.reshape(1, -1), top_k)
results = []
for score, idx in zip(scores[0], indices[0]):
if score > 0.7 and idx >= 0:
results.append({**self.articles[idx], "score": float(score)})
return results
UI для оператора (React)
const AgentAssistPanel: React.FC<{sessionId: string}> = ({sessionId}) => {
const [suggestions, setSuggestions] = useState<Suggestion[]>([]);
useEffect(() => {
const ws = new WebSocket(`wss://assist.api/session/${sessionId}`);
ws.onmessage = (e) => setSuggestions(JSON.parse(e.data));
return () => ws.close();
}, [sessionId]);
return (
<aside className="agent-assist-panel">
<h3>Подсказки AI</h3>
{suggestions.map(s => <SuggestionCard key={s.id} suggestion={s} />)}
</aside>
);
};
Сроки: Agent Assist с KB и real-time STT — 6–8 недель. С полной CRM-интеграцией и A/B тестами — 3–4 месяца.







