Разработка AI-системы холодных звонков с квалификацией лида
AI-система холодного обзвона автономно квалифицирует потенциальных клиентов по BANT (Budget, Authority, Need, Timeline) и передаёт только «горячих» лидов на менеджеров по продажам. Масштаб: 500–2000 звонков в день на один экземпляр.
BANT-квалификация в диалоге
@dataclass
class BANTScore:
budget: int = 0 # 0-3: нет/возможно/да/высокий
authority: int = 0 # 0-2: рядовой сотрудник/влияет/ЛПР
need: int = 0 # 0-3: нет потребности/есть интерес/активный поиск/срочно
timeline: int = 0 # 0-3: >12 мес/6-12 мес/1-6 мес/<1 мес
@property
def total(self) -> int:
return self.budget + self.authority + self.need + self.timeline
@property
def is_qualified(self) -> bool:
return self.total >= 6 and self.authority >= 1 and self.need >= 1
class BANTQualifier:
QUALIFICATION_QUESTIONS = {
"need": [
"Вы сейчас используете [решение] для [задача]?",
"Какие основные сложности возникают с текущим решением?"
],
"authority": [
"Кто принимает финальное решение о [закупке] в вашей компании?",
"Вы участвуете в выборе поставщиков?"
],
"budget": [
"Есть ли у вас выделенный бюджет на данное решение?",
"В каком ценовом диапазоне вы рассматриваете решения?"
],
"timeline": [
"В какие сроки вы планируете принять решение?",
"Есть ли у вас дедлайны по внедрению?"
]
}
async def qualify_live(
self,
dialog_context: dict
) -> BANTScore:
"""Извлекаем BANT из диалога"""
full_dialog = format_dialog(dialog_context["history"])
response = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": """Оцени квалификацию лида по BANT.
Budget (0-3): 0=нет, 1=неизвестно, 2=есть, 3=большой
Authority (0-2): 0=не ЛПР, 1=влияет, 2=ЛПР
Need (0-3): 0=нет, 1=слабый, 2=есть, 3=срочно
Timeline (0-3): 0=>12мес, 1=6-12мес, 2=1-6мес, 3=<1мес
JSON: {budget, authority, need, timeline, reasoning}"""
}, {"role": "user", "content": full_dialog}],
response_format={"type": "json_object"}
)
data = json.loads(response.choices[0].message.content)
return BANTScore(**{k: data[k] for k in ["budget", "authority", "need", "timeline"]})
Динамическая стратегия вопросов
class AdaptiveQuestionStrategy:
def __init__(self, qualifier: BANTQualifier):
self.qualifier = qualifier
self.asked_dimensions = set()
async def get_next_question(self, bant: BANTScore) -> str | None:
"""Задаём вопросы по наиболее слабым измерениям BANT"""
priority_order = [
("need", bant.need, 2), # нужда важнее всего
("authority", bant.authority, 1),
("timeline", bant.timeline, 2),
("budget", bant.budget, 2)
]
for dimension, current_score, threshold in priority_order:
if current_score < threshold and dimension not in self.asked_dimensions:
self.asked_dimensions.add(dimension)
questions = self.qualifier.QUALIFICATION_QUESTIONS[dimension]
return questions[0] # или случайный из списка
return None # все измерения достаточно квалифицированы
Передача квалифицированного лида
async def transfer_qualified_lead(
call: ActiveCall,
lead_data: dict,
bant: BANTScore
) -> None:
"""Передаём горячий лид менеджеру с контекстом"""
summary = await generate_lead_summary(lead_data, bant)
# Уведомляем менеджера
await crm.create_lead({
**lead_data,
"bant_score": bant.total,
"qualification_summary": summary,
"hot": bant.is_qualified,
"source": "ai_cold_call"
})
# Соединяем с доступным менеджером
await call.say(
"Отлично! Соединяю вас с нашим специалистом, который ответит на все детальные вопросы."
)
available_agent = await get_available_sales_agent()
await call.transfer(available_agent.extension)
Метрики эффективности
| Метрика | Значение |
|---|---|
| Contact Rate | 25–35% |
| Qualified Lead Rate | 8–15% из дозвонов |
| Transfer to Sales | 5–10% из дозвонов |
| Cost per Qualified Lead | -70% vs ручной |
Сроки: MVP квалификатора — 4–6 недель. Полная система с CRM — 2–3 месяца.







