Паттерны агентных интерфейсов, которые реально конвертируют
В октябре 2024 года я подключил ИИ-помощника записи на сайт сети из четырёх стоматологических клиник рядом с Порту. Владелец хотел разгрузить ресепшн от звонков. Пациенты звонили по вопросам страховки, окон на пятницу и цен на чистку. Я выпустил чат, который закрывал все три вопроса. Он читал API расписания, называл цены из таблицы тарифов и записывал на приём через эндпоинт администраторов. Демо выглядело отлично. Через две недели цифры рассказали более холодную историю. Каждую неделю чат открывали около четырёхсот посетителей. Записывался тридцать один человек. Остальные закрывали окно посреди разговора. Я разобрал двадцать записей сессий и увидел, что люди уходят в одни и те же три момента. Чат выстреливал пятью вопросами сразу. Он молчал девять секунд, пока опрашивал календарь. Он сдавался с плоской ошибкой, когда пациент печатал название страховой с опечаткой. Эти три точки выхода дали мне три паттерна, которые я переиспользую в каждой сборке агента с тех пор.
Почему большинство чат-ботов теряет пользователей
Большинство чат-ботов теряет людей в разрыве между чтением сообщения и действием. Простой чат скрывает всё. Посетитель печатает запрос и смотрит на три прыгающие точки. Интерфейс молчит о следующем шаге и о времени ожидания. Через четыре секунды посетитель решает, что страница зависла. Я замерил это на стоматологической сборке до любых изменений. Медиана времени от вопроса до подтверждения записи составила одиннадцать секунд. Чат всё время показывал точки. Семьдесят процентов посетителей, ждавших дольше шести секунд, закрывали окно. Ответ их устраивал. Они его не увидели.
Утечка имеет форму. Во-первых, бот сразу просит слишком много, и посетитель чувствует себя на допросе. Во-вторых, бот работает молча, и посетитель чувствует себя брошенным. В-третьих, бот ломается плоско, и посетитель винит мелкую опечатку в тупике. У каждого ощущения есть лекарство. Я показываю один вопрос за раз. Я показываю каждый вызов инструмента в момент работы. Каждую ошибку я превращаю в меньшее предложение. Дальше разберу каждое лекарство.
Паттерн 1: прогрессивное раскрытие
Моя первая сборка задавала пять вопросов в одном пузыре: имя, телефон, страховая, предпочитаемый врач, удобный день. На телефоне это читалось как налоговая декларация. Двенадцать из двадцати моих записей закончились ровно там. Люди отвечали на одно поле и уходили.
Я заменил стену цепочкой. Чат задаёт один вопрос, ждёт, затем задаёт следующий. Каждый ответ сужает продолжение. Пациент выбирает чистку: бот полностью пропускает вопрос про врача и предлагает ближайшее окно гигиениста. Пациент выбирает лечение канала: бот спрашивает фамилию врача. Правило, которого я держусь: запрашивать у человека только то, чего система ещё держит, плюс задавать второй вопрос лишь после ответа на первый, раз ответ меняет его.
Код остаётся простым. Я держу объект слотов с пятью ключами и функцию next, которая возвращает ровно один вопрос по заполненным слотам. React рисует одну строку ввода и ряд быстрых чипов. Чипы забирают большинство нажатий: выбор чипа занимает один тап, набор текста занимает девять. После перехода завершение шагов с вопросами выросло с тридцати восьми процентов до семидесяти девяти. Старты записей удвоились за неделю. Каждый агентский сценарий теперь спрашивает по одному и добирает остальное из контекста.
Паттерн 2: видимые вызовы инструментов
Девять секунд тишины убили вторую группу. Бот проверял правила страховой, затем опрашивал календари трёх врачей, затем удерживал слот. Вся работа шла по делу. Вся работа оставалась невидимой. Посетители видели точки и думали, что ничего происходит. Шесть записей показали, как посетитель печатает «hello?» в пустоту, затем закрывает вкладку.
Я сделал работу видимой. Когда бот проверяет покрытие, чат печатает маленькую карточку: «Проверяю вашу страховку в ClinicPlus». Когда стартует опрос календаря, появляется вторая карточка: «Смотрю окна на пятницу у доктора Соузы». Когда удержание проходит, карточка переворачивается в галочку со временем слота. Каждая карточка приплывает поверх чата, посетитель наблюдает, как прогресс прибывает шаг за шагом.
Сборка использует server-sent events из роута Next.js. Каждый вызов инструмента шлёт статус-событие с подписью, которую я написал вручную. Сырые имена функций я прячу. Внутреннее имя check_calendar превращается в «Смотрю окна на пятницу». Видимых шагов держу максимум четыре на ход, всё более глубокое схлопывается в одну карточку. Отвал на вызовах инструментов упал с сорока одного процента до девяти. Показывай работу, и люди ждут.
Паттерн 3: мягкая деградация
Плоская ошибка убила третью группу. Пациент напечатал «ClinikPlus» с буквой K. Бот нашёл ноль провайдеров и ответил «I don't understand. Please rephrase». Пациент попробовал ещё раз, упёрся в ту же стену и позвонил в клинику. Журнал звонков показал: администратор записала его за две минуты. Слот у бота имелся с самого начала. Его подвела орфография.
Я заменил стену лестницей. Шаг первый: нечёткое сравнение. «ClinikPlus» совпадает с ClinicPlus на одну букву, поэтому бот спрашивает «Вы имели в виду ClinicPlus?» с двумя чипами. Шаг второй: сужение области. Когда бот не может разобрать запрос целиком, он предлагает три самых частых действия чипами: проверить страховку, найти окно, узнать цену чистки. Шаг третий: человек с именем и сроком. Когда оба шага мимо, бот говорит: «Марта с ресепшна записывает такие случаи вручную. Оставьте номер, она перезвонит в течение одного рабочего часа». Каждый тупик заканчивается чипом или обратным звонком, тупиков без выхода больше нет.
Каждый тупик я пишу в Postgres с номером шага. Промахи первого уровня закрываются внутри чата в восьмидесяти процентах случаев. Обратные звонки третьего уровня конвертируются в пятьдесят пять процентов в тот же день. Бот продолжает ошибаться. Ошибка теперь вручает посетителю меньшее рабочее предложение.
Метрики, которые я отслеживаю: завершение задач, частота тупиков, время до ценности
Три числа показывают, заслуживает ли агентский интерфейс своё место. Завершение задач: доля открытых чатов, закончившихся записью. Стоматологический чат стартовал с восьми процентов и сегодня держится на двадцати четырёх. Я считаю метрику еженедельно по таблице записей, соединённой с сессиями чата. Всё ниже пятнадцати процентов значит: сценарий просит слишком много или прячет слишком много.
Частота тупиков: доля ходов, упёршихся в лестницу. Каждый уровень считаю отдельно. Первый уровень выше тридцати процентов значит: сравнению нужны синонимы. Третий уровень выше десяти процентов значит: сценарий пропускает живой интент, ему нужна новая ветка. После правки опечаток тупики первого уровня упали с двадцати двух процентов до шести.
Время до ценности: секунды от первого сообщения до подтверждения записи. Медиана стартовала с одиннадцати минут живого времени вместе с паузами, теперь держится около трёх. Семьдесят пятый перцентиль я тоже смотрю: средние прячут медленный хвост, где пациенты печатают одним пальцем в автобусе.
Три числа мы разбираем каждый понедельник с управляющей клиникой. Выбираем одну правку, выпускаем её к пятнице, затем снова читаем числа. Этот ритм дал конверсии больше, чем любой редизайн из предложенных мной. Паттерны на слайде выглядят мелко. На живом сайте они решают, превратятся ли четыреста еженедельных посетителей в тридцать записей или в девяносто.