Продуктовый кейс

AI-чат, который квалифицирует лидов и пишет их в CRM

Многостадийная диалоговая система на локальной LLM: 6 этапов разговора, автоматическая квалификация (BANT), лид-скоринг, передача оператору и мгновенная запись в CRM.

PHP 8.2 JavaScript IIFE LLM (Selektel) Twenty CRM Bitrix24 GraphQL
chat_api.php — action=chat
AI
Здравствуйте! Расскажите, какие задачи вы хотите автоматизировать?
Нужно внедрить CRM и автоматизировать обработку заявок с сайта
AI
У нас есть опыт внедрения Twenty CRM с интеграцией форм и чата.

📊 Статус: квалификация 🟡 Тёплый
Введите сообщение...
1 397
строк PHP (ядро)
602
строки JS (виджет)
6
стадий разговора
10
секций базы знаний
3
уровня лид-скоринга

Было

  • Заявки с сайта падают в Bitrix24 без квалификации — менеджер разбирает мусор вместо горячих лидов
  • Ночью и в выходные сайт «молчит» — никто не отвечает, лид уходит к конкурентам
  • Ручное выяснение: отрасль, бюджет, кто ЛПР — по 10 минут на каждого входящего
  • Нет прозрачности: что спрашивают клиенты? На каком этапе уходят? Какие возражения?

Стало

  • AI-бот квалифицирует каждого лида: выясняет отрасль, бюджет, кто принимает решение
  • Работает 24/7 — ни один лид не уходит без ответа в нерабочее время
  • Авто-скоринг: горячий лид сразу создаёт сделку в CRM и уведомляет менеджера
  • Полная аналитика: темы вопросов, этапы отвала, частота возражений

Архитектура чат-системы

Четыре компонента — виджет в браузере, PHP-бэкенд на хостинге, LLM-движок на выделенном сервере, и CRM-адаптер.

chat_widget.js 602 строки · IIFE
chat_api.php 1 397 строк · 12 endpoints
kb_engine.php 451 строка · NLP поиск
crm_adapter.php 935 строк · dual-write

Поток данных

  1. 1. Виджет захватывает контакт (имя + телефон/email)
  2. 2. PHP создаёт сессию, отправляет PII в Bitrix24 (152-ФЗ)
  3. 3. kb_engine.php ищет релевантные секции KB по ключевым словам (биграммы + униграммы)
  4. 4. Формируется system-prompt: роль + KB + стадия + профиль лида
  5. 5. LLM на Selektel генерирует ответ (температура 0.7)
  6. 6. Из ответа извлекаются BANT-сигналы (бюджет/ЛПР/срочность)
  7. 7. kb_calculate_score → hot/warm/cold
  8. 8. crm_sync_lead → Person + Note в Twenty CRM

152-ФЗ: порядок имеет значение

  1. Сначала сбор PII (имя, телефон/email) — отправляется в CRM + локальный файл
  2. Только потом AI-диалог — LLM видит обезличенные бизнес-вопросы
  3. История: максимум 12 сообщений, файловые сессии `session_{uuid}.json`
  4. Rate limit: 20 запросов/мин/IP

6 стадий разговора

Разговор не «просто отвечает» — он ведёт лида по воронке. Каждая стадия имеет свои инструкции для LLM и правила перехода на следующую.

1

Discovery — Выяснение

«Задай 1-2 открытых вопроса. Выясни: отрасль, задачу, как работают сейчас. Не предлагай решение сразу.»

Переход: проблемные ключевики ≥2 ИЛИ длина сообщения >90 символов ИЛИ ≥6 сообщений
2

Qualification — Квалификация

«Мягко уточни: бюджет, кто принимает решение, сроки. Не дави. Если клиент не готов — переходи к решению.»

Переход: ≥3 BANT-сигналов ИЛИ ≥12 сообщений
3

Solution Matching — Подбор

«Расскажи о 1-2 релевантных услугах 0101. Приведи кейс из отрасли клиента. Объясни как это работает для него.»

Переход: ключевики возражений (дорого, подумаем, сами) ИЛИ интереса (интересно, давайте)
4

Objection Handling — Возражения

«Клиент сомневается. Используй факты, кейсы и цифры из базы знаний. Не будь навязчивым. Покажи понимание.»

Возражения из KB: дорого, нет бюджета, сами сделаем, ChatGPT, облако безопаснее
5

Consultation Offer — Консультация

«Предложи бесплатный аудит (30 мин). Объясни ценность: дорожная карта + точный расчёт ROI. Спроси удобное время.»

Авто-создание сделки в CRM для hot/warm лидов на этой стадии
6

Human Handoff — Оператор

«Сообщи что подключается специалист. Поблагодари за ожидание. Передай контекст разговора оператору.»

Защита от ложных срабатываний: «не надо оператора», «без менеджера» — не триггерит

Лид-скоринг (BANT-lite)

Система автоматически извлекает сигналы из ответов пользователя и вычисляет score. Никаких ручных статусов.

💬 Бюджет (budget) +3 балла
Паттерны: «бюджет», «рублей», «тысяч», цифры с ₽/руб, «бесплатно», «пилот»
👤 ЛПР (authority) +3 балла
«директор», «я принимаю решение», «собственник», «руководитель», «отдел»
⏱ Срочность (timeline) +2 балла
«срочно», «вчера», «на этой неделе», «завтра», «как можно быстрее»
📝 Детализация запроса +1–2 балла
Длинные сообщения с конкретикой ценятся выше чем «сколько стоит?»
0–3
COLD 🔵
4–6
WARM 🟡
7+
HOT 🔥

База знаний

10 секций структурированной информации. Поиск — NLP-токенизация (униграммы + биграммы), русские стоп-слова, веса: keyword ×4, title ×3.

🏢 О компании
5 полей: keywords, content, priority
📦 Продукты
3 продукта с keywords
🛠 Услуги
2 услуги с keywords
🏭 Отрасли
6 отраслей
💰 Цены
pricing_rule, keywords
🔌 Интеграции
4 поля
📋 152-ФЗ
compliance
⭐ Преимущества
competitive advantages
🛡 Возражения
5 паттернов с ответами
❓ FAQ
7 вопросов с keywords

Human Handoff — передача оператору

Триггеры переключения, защита от ложных срабатываний, и панель оператора с историей разговора.

Триггеры handoff

  • • «позови оператора»
  • • «нужен человек»
  • • «переключи на менеджера»
  • • «хочу поговорить с живым»

Защита от ложных срабатываний

  • • «НЕ надо оператора» → skip
  • • «БЕЗ менеджера» → skip
  • • «не нужен человек» → skip
  • • Regex с негацией перед проверкой

Панель оператора

  • • 888 строк HTML/CSS/JS (SPA)
  • • Список активных сессий
  • • Полная история разговора
  • • Статус: ai / waiting_human / human
  • • Флаги: good / bad / missing_knowledge
  • • AI-подсказки ответов

Интеграция с CRM — лид не теряется

Каждый захваченный контакт мгновенно создаётся в CRM. Стадии разговора и лид-скоринг синхронизируются в реальном времени.

Dual-write архитектура

Режим CRM_MODE=dual — заявка идёт одновременно в Twenty и Bitrix24. Если Twenty недоступен — данные не теряются, Bitrix24 работает как fallback.

// chat_api.php → crm_adapter.php → GraphQL
chat_api.php crm_create_person()
chat_api.php crm_sync_lead()
// Stage changes → Note in Twenty
// Score changes → Note in Twenty
// Hot/Warm → auto Opportunity

Жизненный цикл лида в CRM

  1. 1. Чат захватывает контакт → Person в Twenty
  2. 2. Дедупликация: поиск по телефону (local digits) перед созданием
  3. 3. Стадия меняется → Note в Twenty с деталями перехода
  4. 4. Score растёт → Note с историей изменений
  5. 5. Hot/Warm + consultation_offer → Opportunity создаётся автоматически
  6. 6. Human handoff → уведомление оператору

Виджет на 602 строках чистого JS

IIFE-паттерн, ни одной зависимости. Подключается одной строкой на любую страницу.

Mobile-first

Адаптивная верстка с slide-in анимацией. Кнопка 58×58px, круглый градиент. Полноэкранный режим на телефоне.

CSS-in-JS (inline)

Все стили инжектятся из JS (injectCSS). 4 keyframe-анимации: fadeInUp, pulse, bounce, shimmer. Без внешних CSS-файлов.

Состояния (стейт-машина)

ai → waiting_human → human. Polling каждые 3 секунды в режиме ожидания. Авто-reconnect при обрыве.

Локальная LLM на Selektel

В отличие от типовых чат-ботов на OpenAI API, здесь используется мощная языковая модель, развёрнутая на выделенном сервере Selektel. Никаких внешних API — все данные остаются внутри контура компании.

  • Выделенный сервер — никаких rate limit и разделения ресурсов с другими клиентами
  • Данные не покидают периметр — 152-ФЗ compliance на уровне инфраструктуры
  • Фиксированная стоимость сервера — без поминутной тарификации API-токенов
  • Selektel — российский провайдер GPU-серверов с дата-центрами в РФ
// Вызов LLM — chat_api.php:173
function deepseek_chat($history, $user_msg) {
  $system = kb_build_system_prompt(...);
  $resp = http_post('https://api.selektel.ru/v1/chat', [
    'model' => 'local-llm',
    'messages' => [$system, ...$history],
    'temperature' => 0.7,
  ]);
}
// System prompt динамический:
// — Роль + инструкция стадии
// — Релевантные секции KB (≤1800 символов)
// — Профиль лида (BANT + score)
// — Паттерн возражения (если objection_handling)

Нужен AI-чат для сайта?

Спроектируем и внедрим кастомную диалоговую систему с квалификацией лидов и прямой интеграцией в вашу CRM. От 5 дней.

gaspar.rus@yandex.ru