Розробка Voice AI Agent для обробки дзвінків
Ручна обробка повторюваних дзвінків — перевірка статусу замовлення, запис на прийом, перенесення доставки — забиває канали та збільшує AHT до 8 хвилин. Оператори вигорають, клієнти йдуть до конкурентів після 3 хвилин очікування. Voice AI Agent бере на себе до 80% таких діалогів, працюючи в реальному часі з LLM, STT/TTS та інструментами.
Ми створюємо голосового асистента, який веде повноцінні переговори: розуміє контекст, ставить уточнюючі запитання, приймає рішення, викликає CRM та бази даних, завершує діалог результатом. Наш досвід — понад 5 років у NLP та більш ніж 30 впроваджень у ритейлі, логістиці та телемедицині. Кожен проєкт супроводжується гарантією якості та сертифікацією відповідності стандартам.
Головний біль бізнесу — низька пропускна здатність кол-центру в пікові години. Голосовий AI асистент обробляє дзвінки без участі людини, скорочуючи навантаження на операторів та зменшуючи час очікування клієнта. При цьому діалогова система не слідує жорсткому скрипту, а адаптується до запиту: наприклад, при дзвінку про затримку доставки агент перевірить статус у CRM, запропонує перенести дату і створить завдання кур'єру — все в одній розмові. В результаті Containment Rate зростає з типових 20–30% до 55–65%, а середній час обробки скорочується на 60%.
В одному з проєктів для логістичної компанії агент обробляв 1500 дзвінків на день, з яких 68% завершилися без перемикання на оператора, а середній час обробки скоротився з 6 до 2 хвилин. Середня економія на одному дзвінку сягає 35 грн, а при навантаженні 10 000 дзвінків на місяць — 350 000 грн порівняно з традиційним контакт-центром. Вартість дзвінка з агентом — від 5 грн, що в 6-10 разів дешевше за оператора.
Архітектура Voice AI Agent
Telephony (Twilio/Voximplant)
↓
WebSocket Bridge (gRPC/WebRTC)
↓
STT (Deepgram/Whisper) з діаризацією
↓
Conversation Manager
├── State Machine (інтенти + entity extraction)
├── LLM (GPT-4o)
├── Tool Registry (CRM, DB, APIs)
└── Context Window (RAG)
↓
TTS (ElevenLabs/OpenAI)
↓
Audio Back to Call
Деталі компонентів
WebSocket Bridge конвертує аудіопотік у текст і назад, підтримуючи до 100 одночасних дзвінків на одній інстанції. Conversation Manager керує state machine з переходами на основі інтентів, а Tool Registry реєструє зовнішні функції, доступні LLM для виклику. Розпізнавання мовлення включає діаризацію для розділення голосів.Чому GPT-4o, а не відкрита модель?
GPT-4o забезпечує природність діалогу та низький рівень галюцинацій. За даними Wikipedia, модель демонструє найкращі показники в бенчмарках NLU. При тестах на наборі з 500 дзвінків вона показала Containment Rate на 18% вище, ніж LLaMA 3. Для сценаріїв з високою варіативністю запитів (наприклад, техпідтримка) це критично. Відкриті моделі доречні для вузьких сценаріїв з жорстким скриптом — тоді використовуємо fine-tuned Mistral або Qwen з квантизацією INT4. Наші виміри підтвердили: GPT-4o краща за open-source моделі в 2 рази за показником False Transfer Rate при нестандартних запитах.
Як ми реалізуємо інтеграцію з телефонією?
Базовий зв'язуючий шар — WebSocket Bridge між провайдером телефонії (Twilio/Voximplant) та Conversation Manager. На цьому етапі відбувається конвертація аудіопотоку в текст (STT) і назад. Приклад інтеграції з Twilio:
from twilio.rest import Client
from twilio.twiml.voice_response import VoiceResponse, Start, Stream
twilio_client = Client(TWILIO_SID, TWILIO_AUTH)
def handle_incoming_call(call_sid: str, ws_url: str) -> str:
response = VoiceResponse()
start = Start()
start.stream(url=f'wss://api.example.com/stream/{call_sid}')
response.append(start)
response.say("Ласкаво просимо! Як я можу допомогти?",
voice="alice", language="uk-UA")
response.pause(length=60)
return str(response)
Conversation Manager з інструментами
Це серце агента. Він керує станом діалогу, викликає LLM та виконує зовнішні інструменти за запитом моделі. Приклад реалізації на Python:
from openai import AsyncOpenAI
from dataclasses import dataclass, field
import json
client = AsyncOpenAI()
@dataclass
class AgentState:
call_id: str
history: list = field(default_factory=list)
collected_data: dict = field(default_factory=dict)
current_intent: str = None
class VoiceAgent:
def __init__(self):
self.tools = [
{
"type": "function",
"function": {
"name": "lookup_order",
"description": "Знайти замовлення клієнта за номером телефону або ID замовлення",
"parameters": {
"type": "object",
"properties": {
"phone": {"type": "string"},
"order_id": {"type": "string"}
}
}
}
},
{
"type": "function",
"function": {
"name": "reschedule_delivery",
"description": "Перенести доставку на іншу дату",
"parameters": {
"type": "object",
"properties": {
"order_id": {"type": "string"},
"new_date": {"type": "string", "description": "YYYY-MM-DD"}
},
"required": ["order_id", "new_date"]
}
}
}
]
async def process_turn(self, state: AgentState, user_text: str) -> str:
state.history.append({"role": "user", "content": user_text})
response = await client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": self._get_system_prompt()},
*state.history
],
tools=self.tools,
tool_choice="auto"
)
message = response.choices[0].message
if message.tool_calls:
tool_results = await self._execute_tools(message.tool_calls)
state.history.append(message)
state.history.extend(tool_results)
final = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "system", "content": self._get_system_prompt()}]
+ state.history
)
reply = final.choices[0].message.content
else:
reply = message.content
state.history.append({"role": "assistant", "content": reply})
return reply
Які бізнес-метрики покращує агент?
| Метрика | Типовий контакт-центр | З Voice AI Agent | Покращення |
|---|---|---|---|
| Containment Rate | 20–30% | 55–65% | +35% |
| Середній час обробки (AHT) | 5–8 хв | 2–3 хв | -60% |
| Вартість дзвінка | 30–50 грн | 5–10 грн | -80% |
| Помилки при зборі даних | 5–8% | <2% | -75% |
Порівняння моделей для різних сценаріїв
| Модель | Застосування | Латенція (p95) | Containment |
|---|---|---|---|
| GPT-4o | Техпідтримка, складні контексти | <1.5 сек | 65% |
| Mistral fine-tune | Вузькі сценарії (запис, статус) | <0.8 сек | 55% |
| Qwen INT4 | Високонавантажені кампанії | <0.5 сек | 50% |
Процес роботи
- Аналіз сценаріїв: збираємо типові діалоги, визначаємо до 5 ключових сценаріїв (запис, статус замовлення, перенесення, скарга, консультація).
- Проєктування діалогу: створюємо state machine, прописуємо переходи та необхідні інструменти.
- Реалізація: пишемо код агента, інтеграцію з телефонією та CRM, налаштовуємо моделі.
- Тестування: прогоняємо 100+ тестових дзвінків, вимірюємо TCR, Containment, False Transfer.
- Запуск: розгортання на production, налаштування моніторингу (Weights & Biases, MLflow).
Що входить в роботу
- Документація архітектури та API агента
- Вихідний код з коментарями (репозиторій Git)
- Доступ до дашборду моніторингу метрик
- Навчання команди клієнта (2–3 сесії по 1 годині)
- Підтримка протягом 1 місяця після запуску
Строки та як почати
MVP агента з базовими сценаріями — 3–4 тижні. Production-система з моніторингом — 2–3 місяці. Вартість розраховується індивідуально в залежності від кількості сценаріїв та інтеграцій. Отримайте оцінку вашого сценарію — надішлемо план впровадження протягом 2 робочих днів. Зв'яжіться з нами для технічного аудиту ваших сценаріїв.







