Как мы превращаем звонок риэлтора в карточку лида за 15 секунд: ИИ-автолид изнутри

4 июня 2026 г.

Риэлтор за рулём. Звонит собственник трёшки на Соколе: «Видел ваше объявление, хочу обсудить продажу». Двадцать минут живого разговора — район, перепланировка, срочность, вилка по цене. Разговор кончается, риэлтор едет на показ, к вечеру у него ещё пять звонков. Утром он помнит, что «был кто-то по трёшке», но не помнит ни имени, ни цены, ни телефона. Лид потерян не потому, что плохо отработали, а потому, что между звонком и CRM стоит человек с памятью и руками, которые в этот момент держат руль.

Мы сделали так, чтобы между звонком и карточкой лида не стояло ничего, кроме кода. Это инженерный разбор того, как у нас в CRM SmartAgent устроен ИИ-автолид: звонок превращается в готовую карточку — с контактом, заметкой и задачей — за время, которое риэлтор тратит на то, чтобы дойти от машины до подъезда. Без выдуманных цифр и маркетинговых обещаний: только то, что реально работает в проде, и грабли, на которые мы наступили по дороге.

Схема ИИ-автолида: звонок риэлтора превращается в карточку лида

Проблема: самое дорогое — это то, что между ушами

В недвижимости лид — не строчка из формы на сайте. Лид — это разговор. Собственник за 15 минут вываливает контекст, который не лезет ни в одно выпадающее меню: «продаю, но не срочно», «соседи сверху топили — отремонтировал», «торг небольшой, но дочери надо доплатить за ипотеку». Этот контекст и есть актив. И именно он испаряется первым.

Классический сценарий «после звонка зайду в CRM и всё запишу» не работает по простой причине: между звонком и моментом, когда у риэлтора освободятся руки и голова, проходят часы и ещё несколько звонков. Память не диктофон. К вечеру остаётся «кто-то по трёшке».

Можно было пойти лёгким путём — прикрутить кнопку «надиктуй заметку голосом» и сложить аудио в карточку. Но аудиофайл в CRM — это та же потерянная информация, просто в другом формате: его всё равно никто не переслушивает. Нам нужно было не сохранить звук, а превратить его в структуру: имя, телефон, тип объекта, район, бюджет, потребность — и сразу задачу «перезвонить».

Архитектура пайплайна: четыре шага и ни одного человека посередине

Логически путь от звука до карточки выглядит так:

аудио (голос риэлтора / запись разговора)
     │
     ▼
[1] Speech-to-Text  ──  Deepgram (модель nova-2, ru, 16 кГц)
     │  «Звонил Николай, телефон 7-888..., интересуется двушкой на Арбатской, бюджет до 18»
     ▼
[2] LLM-структурирование  ──  извлечение полей по схеме (JSON)
     │  { name: "Николай", phones: ["7888..."], property_type: "2к",
     │    district: "Арбатская", budget: "до 18 млн", comment: "..." }
     ▼
[3] Сборка сущностей  ──  карточка лида + контакты + заметка
     │
     ▼
[4] Задача  ──  «Перезвонить Николаю» с привязкой к лиду

Важная архитектурная развилка в самом начале: распознавание у нас работает в двух режимах, и это не дублирование, а сознательный выбор под условия связи.

Режим 1 — потоковая транскрибация (WebSocket)

Когда сеть стабильная, клиент открывает сессию (POST /ai/transcribe/session), получает параметры подключения к стриминговому распознаванию и гонит аудио в реальном времени. Сервер отдаёт язык, частоту дискретизации (по умолчанию 16 000 Гц) и endpointing — паузу в речи, после которой кусок считается завершённым. Так текст появляется почти синхронно с речью.

Режим 2 — файловый fallback (REST)

Риэлтор в лифте, в подвале новостройки, в зоне «одна палка» — WebSocket рвётся. Тогда работает второй путь (POST /ai/transcribe/file): запись целиком уходит на REST-эндпоинт распознавания, и в том же запросе мы просим извлечь поля. В коде операции это буквально один комментарий, который описывает весь SLA:

// Аудио → Deepgram REST (2-3 сек) → текст → LLM ExtractFields (2-3 сек) → поля

Два-три плюс два-три. Вот откуда берутся те самые секунды: не «магия ИИ», а две последовательные сетевые операции, каждая из которых уложена в единицы секунд. Наличие fallback'а — не перестраховка, а признание реальности: риэлтор работает в полях, а не за стабильным офисным Wi-Fi, и пайплайн обязан доезжать до карточки даже когда стрим невозможен.

Двухэтапное «понимание»: сначала намерение, потом поля

Текста мало — его надо понять. Мы не суём распознанную фразу в одну гигантскую модель «сделай хорошо». Сначала отдельный шаг классифицирует намерение (создать лид, создать объявление, найти объект), и только если намерение требует данных — запускается извлечение полей под нужную схему:

classify_intent  →  action = "create_lead"
                          │
                          ▼
extract_fields(type: "lead")  →  поля карточки

Под каждый тип — свой промпт из реестра промптов (extract_lead_fields для лида, extract_ad_fields для объявления). Разделение даёт две вещи: промпт под лид не размывается полями объявления, и каждый шаг можно версионировать и чинить отдельно, не задевая остальное.

Инженерные грабли, на которые мы наступили

Грабля 1. LLM любит обернуть JSON в Markdown

Мы просим модель вернуть чистый JSON по схеме. Модель регулярно возвращает его внутри блока кода — с тройными апострофами и иногда подписью json. Если такой ответ скормить парсеру как есть — он падает. Лечится не уговорами в промпте («верни только JSON, пожалуйста»), а постобработкой: перед разбором мы срезаем обёртку регуляркой и только потом делаем json_decode. Прагматичный вывод: на выход LLM нельзя смотреть как на API с гарантированным контрактом — это всегда «почти структурированный» текст, и финальную валидацию делает код, а не вера в модель.

Грабля 2. Распознанный телефон ≠ телефон

Голос «семь восемьсот восемьдесят восемь...» распознаётся как угодно: цифрами, словами, с пробелами и без. А в карточке лида телефон — это сущность с проверкой дублей: на одного лида до пяти номеров, и система предупреждает, если номер уже привязан к другому клиенту. Между «строкой из распознавания» и «валидным номером в CRM» — слой нормализации, без которого автолид плодил бы дубли и битые контакты. Сам формат лида при этом не специальный: голосом создаётся ровно такая же карточка, как руками, с тем же набором полей (имя, источник, телефоны до 5, email до 5, привязка объявления).

Грабля 3. ИИ — это деньги и риск каскадного отказа

Каждый звонок — это запросы к внешним провайдерам (распознавание + LLM), а у них есть лимиты, тарификация и плохие дни. Поэтому шлюз к ИИ у нас обёрнут защитой ещё до бизнес-логики:

  • Цепочка гардов — лимит частоты запросов, бюджетный потолок и контроль одновременных операций: один пользователь не может случайно (или намеренно) выжечь общий лимит.
  • Circuit breaker — если провайдер начал стабильно отваливаться, мы перестаём долбить его запросами и не вешаем интерфейс на таймаутах.
  • Учёт расхода — каждая операция логируется, стоимость секунды распознавания и токенов известна заранее, расход виден.

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

Грабля 4. «Скажи имя» против «надиктуй три минуты»

Голосовой ввод мы ограничили тремя минутами на запись и принимаем основные браузерные форматы (webm, ogg, mp3) — то, что реально отдаёт микрофон в браузере и в мобильном приложении. Ограничение не от жадности: чем длиннее аудио, тем дороже распознавание и тем больше «воды», из которой модель пытается выудить поля. Три минуты — это потолок, в который укладывается осмысленный пересказ разговора, и при этом извлечение остаётся точным.

Что в итоге получил пользователь

С точки зрения риэлтора весь этот пайплайн выглядит до обидного просто. На форме создания лида есть иконка микрофона. Он жмёт, говорит человеческим языком: «Звонил Николай, телефон такой-то, интересуется двушкой на Арбатской», жмёт ещё раз — и через секунды поля формы заполнены сами: имя, источник, комментарий, телефоны, email. Что-то распозналось криво — поправил руками. На мобильном это работает прямо из шторки уведомления: после звонка приходит пуш «Новый звонок от +7XXX», кнопка «Создать лид» открывает карточку с уже подставленным номером, дальше — тот же микрофон.

Отдельная ветка — не диктовка, а сам разговор. Запись звонка уходит в распознавание, а ИИ вытаскивает из расшифровки то, что важно риэлтору: тип объекта, район, бюджет, потребности клиента. Эта же транскрипция потом питает другие наши инструменты — анализ звонков и телефонию в CRM: тональность, возражения, обещания «перезвоню в среду». Один звук — несколько источников пользы.

Главный результат не в секундах, а в том, что исчезает. Исчезает вечерний ритуал «вспомнить и записать». Исчезает ящик из стикеров и аудиозаметок. Исчезает категория «лид, который был, но потерялся». Контекст разговора — самый скоропортящийся актив в недвижимости — фиксируется, пока он ещё свежий, и ложится туда, где ему место: в карточку клиента рядом с его контактами и объектами.

Это, кстати, часть большего подхода: мы и сам сервис, и собственный маркетинг строим на стеке ИИ-агентов — об этом мы отдельно рассказывали в материале «Как мы автоматизировали маркетинг, продажи и контроль стеком ИИ-агентов». Автолид — тот же принцип, направленный наружу, на риэлтора: пусть рутину делает код, а человек занимается людьми.

Коротко о стеке

  • Распознавание речи: Deepgram, модель nova-2, русский язык, 16 кГц. Два режима — потоковый (WebSocket, real-time) и файловый (REST, fallback для слабой связи).
  • Структурирование: LLM с извлечением полей по схеме, через реестр промптов (отдельные промпты под лид и под объявление) и двухэтапную логику «намерение → поля».
  • Обвязка надёжности: цепочка гардов (rate limit / бюджет / конкурентность), circuit breaker на провайдеров, учёт расхода по каждой операции.
  • Выход: штатная карточка лида CRM — контакты с дедупликацией, заметка, задача на перезвон. Никакого «особого формата для голоса».

Вопросы и ответы

За сколько реально создаётся карточка?

Файловый путь по нашему SLA — это распознавание (2-3 сек) плюс извлечение полей (2-3 сек), то есть единицы секунд от конца записи до заполненной формы. В потоковом режиме текст появляется почти синхронно с речью.

Что, если ИИ ошибся в поле?

Поля остаются обычными редактируемыми полями карточки. ИИ заполняет черновик, риэлтор глазами проверяет и правит — это не «чёрный ящик, который сам всё решил», а ускоритель ручного ввода.

Это работает с записью разговора или только с надиктовкой?

С обоими. Можно надиктовать суть после звонка, а можно прогнать через распознавание саму запись разговора — тогда ИИ вытащит из неё тип объекта, район, бюджет и потребности клиента.

Нужна ли особая телефония?

Автолид — часть связки с IP-телефонией SmartAgent и мобильным приложением: входящий звонок ловится, номер подставляется в карточку автоматически, дальше подключается распознавание и извлечение полей.

Если вы строите похожий пайплайн — главный совет из нашего опыта: относитесь к выходу LLM как к «почти структурированному тексту», а не к надёжному API, и закладывайте обвязку надёжности (гарды, circuit breaker, учёт расхода) с первого дня, а не когда провайдер впервые ляжет в прайм-тайм. Посмотреть, как автолид работает в живой CRM, можно в SmartAgent.ru.

Попробуйте SmartAgent бесплатно

3 дня полного доступа — без карты и без звонков от менеджеров

Начать бесплатно