Перейти к содержимому
VC
Кейс 5 из 33 · Розница · AI-консультант

AI-консультант на сайте вместо платного виджета: 34 : 12 в слепом сравнении

У бренда товаров для активного отдыха из США на витринах стоял платный чат-виджет по подписке за каждый магазин — и переспрашивал вместо того, чтобы отвечать. Для российского сайта к этому добавлялись жёсткие требования ФЗ-152. Собрал свой чат по описаниям товаров на российских языковых моделях и проверил его слепым сравнением с платным виджетом.

Отрасль
Розница, товары для активного отдыха
Стек
Python · FastAPI/SSE · RAG · YandexGPT
Сроки
4 недели до запуска, дальше сопровождение
Итог
34 : 12 в слепом сравнении
01 · Боль

Платишь подписку за каждый магазин — а бот переспрашивает вместо ответа

У бренда две витрины на Shopify и отдельный российский сайт. На витринах стоял платный чат-виджет по подписке: платить надо за каждый магазин отдельно, то есть цена умножается на число витрин и растёт вместе с бизнесом.

Претензия менеджеров была к качеству ответов. Виджет не отвечал по существу: на конкретный вопрос про подбор модели он задавал встречный уточняющий вопрос, а когда всё-таки отвечал — тянул клиента к тем позициям, которые есть в наличии у него в фиде, мимо задачи покупателя.

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

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

02 · Решение

Своя база фактов, свой сервис, свой сервер

Отдельный подпроект: база фактов о товарах, поиск по ней (RAG), промежуточный сервис на FastAPI и встраиваемый в сайт виджет. Ответ собирается из фактов, которые можно показать пальцем, а качество проверяется строгим тестом по эталону.

01
База фактов

562 факта: каталог, частые вопросы, доставка, гарантия и формулировки из живых переписок менеджера

02
Поиск фактов

Векторный поиск по базе: под конкретный вопрос отбираются подходящие факты

03
Промежуточный сервис

FastAPI, потоковая отдача ответа, единый интерфейс к трём моделям, обновление токенов, повторные попытки, предохранители

04
Ответ

Текст печатается по мере готовности, следом отдельно приходят карточки товара с картинками

05
Что остаётся после

Разговоры и контакты сохраняются в файл, копия вопросов и ответов уходит живому человеку в Telegram

База фактов собрана из каталога и живых переписок

562 факта: характеристики позиций, частые вопросы, условия доставки и гарантии. Плюс — и это оказалось важнее всего — 335 живых переписок менеджера с покупателями, из них 131 про наличие. Оттуда взяты и ответы, и реальные формулировки вопросов: как человек на самом деле спрашивает про размер, вес, зимнюю эксплуатацию и сроки. Бот, обученный на маркетинговых текстах, этих вопросов просто не узнаёт.

Один сервис — три модели под ним

Ответ отдаётся потоком: человек видит текст по мере того, как модель его пишет. За единым интерфейсом спрятаны три поставщика — в работе YandexGPT, плюс GigaChat и DeepSeek для сравнения и дешёвой отладки. Смена модели не затрагивает сам сайт. В этом сервисе живёт вся неромантичная часть:

  • обновление токенов доступа и повторные попытки с учётом заголовка Retry-After
  • блокировка на сессию — один пользователь не запускает пять генераций параллельно
  • предохранитель по бюджету — расход не улетает в потолок при злоупотреблении
  • персональные данные вычищаются до записи в журнал — телефоны и почты в файлы разговоров не попадают
  • защита от злоупотреблений через Cloudflare Turnstile
  • распознавание голосового ввода — вопрос можно надиктовать

Карточки товара отдельным кадром

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

Каталог с фотографиями

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

Заявка доходит до менеджера вместе с разговором

Менеджер перезванивает именно по заявке — значит разговор, который к ней привёл, должен приходить вместе с ней. Раньше диалог сохранялся только в журнале, который со временем перезаписывается, и под настоящей заявкой с телефоном разговора уже не находилось. Теперь заявка несёт весь разговор сессии внутри себя: диалог и заявка связываются по идентификатору сессии, в отчёте над диалогом стоит имя того, кто оставил заявку, а усечение отчёт печатает прямо — «показаны 2 реплики из 5, ещё 3 не поместились».

Качество проверяет строгий тест по эталону

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

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

Сами тесты тоже пришлось чинить. Семь проверок падали с ошибкой типа и потому не проверяли ничего: заглушка модели осталась с двумя аргументами, когда в рабочей версии появился третий — учёт расхода токенов. Без покрытия оказались капча, суточный бюджет и защита от повторов. Заодно выяснилось, что прогон тестов съедал 810 из 1000 суточных вызовов, предназначенных посетителям сайта; локальные вызовы освобождены от общего потолка.

Жёсткие правила поверх модели

После запуска три недели ушли на точность ответов и целостность данных. Магазин прислал разбор ошибок текстом и голосовыми сообщениями — голосовые расшифровываются автоматически и попадают в ту же очередь правок. Две ошибки из разбора стоили бы покупателю денег. Для надувной палатки бот первым предлагал слабый насос на 2 PSI, которым её не надуть. И уверенно отвечал, что прозрачная торцевая стенка входит в комплект, путая её с окнами из того же материала строкой выше в спецификации.

Обе ошибки закрыты кодом. Слабый насос в ответе про палатку больше не называется; в общем списке насосов он идёт с пометкой о назначении. По торцевой стенке заведена таблица трёх моделей, по которым есть данные, для остальных ответ один: «данных нет, уточнит менеджер».

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

Индекс знает ровно то, что в него внесли

Шесть файлов базы, написанных специально под жалобы магазина — наличие и отгрузка, манера консультации, комплектация, совместимость, эксплуатация, доставка и оплата, — отсутствовали в списке разрешённых источников, и сборщик молча их пропускал. Сколько бы раз индекс ни пересобирали, бот из этих шести файлов не знал ничего. Список источников пополнен.

Честное ограничение рядом: индекс лежит вне репозитория, пересборка требует человека и облачного ключа. Правки базы вступают в силу после пересборки.

Выкладка на живой сайт по одной странице

Сайт собран в конструкторе, правки идут по живому — поэтому выкладка была пошаговой. Резервная копия снята до правки. Код дописан в конец HEAD, прежний код не тронут — это проверено сравнением префикса. Сначала одна главная страница → проверка на живом сайте → остальные страницы (их около шестидесяти). Откат описан в три шага и лежит рядом с инструкцией.

03 · Стек

Российский контур по умолчанию

Python · FastAPI · uvicorn

Сервис, который отдаёт ответ потоком; работает как служба на своём сервере

Поиск по своей базе (RAG)

562 факта с векторным поиском, карточки товара отдельным указателем

YandexGPT

Основная модель — данные остаются внутри российского контура

GigaChat · DeepSeek

Запасные модели за тем же интерфейсом: для сравнения и дешёвой отладки

Yandex SpeechKit

Голосовой ввод — вопрос можно надиктовать

Cloudflare Turnstile

Защита от злоупотреблений без капчи в лицо покупателю

Виджет для сайта

Один фрагмент кода, встраивается в сайт на конструкторе без доступа к исходникам

Трассировка по разметке OpenTelemetry GenAI

Каждый ответ виден целиком: поиск фактов, вызов модели, расход токенов

systemd

Службы и таймеры на своём сервере, алерты на падение

pytest — 134 теста

Проверка опоры на факты, защита от злоупотреблений, строгий эталон вместо оценки другой моделью

PythonFastAPISSERAGYandexGPTGigaChatDeepSeekSpeechKitTurnstileOpenTelemetrysystemdpytest
04 · Результат

Слепое сравнение с платным виджетом

Счёт по вопросам
34 : 12

свой движок / платный виджет, при 3 ничьих

Уклонения от ответа
43% 0

встречный вопрос вместо ответа: 21 из 49 у виджета, ни одного у нас

Оценка полезности
4,14 / 2,96

по полноте — 3,98 против 2,90

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

Главная разница оказалась в готовности отвечать. На 21 вопросе из 49 платный виджет задал встречный вопрос вместо ответа — ровно то, на что жаловались менеджеры. Свой чат ответил по существу на все 49.

Чат выкачен на боевой сайт. Контур обратной связи замкнулся за сутки: замечание владельца бизнеса вечером — два исправляющих коммита к утру. Бот перестал выдумывать популярность позиций и стал опираться на реальные продажи. Это, пожалуй, лучший показатель того, что система собрана правильно: правку видно на сайте на следующий день.

Отдельный эффект — предсказуемость расходов. Вместо подписки, которая множится на число витрин, остаётся оплата токенов по факту использования плюс свой сервер; лицензий нет, а потолок расхода задан предохранителем прямо в сервисе.

05 · Применимость

Где ещё ложится та же методология

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

  • Магазины со сложным выбором — техника, оборудование, снаряжение: там, где покупка требует объяснения
  • B2B-сайты с длинным циклом сделки — чат уточняет, что нужно клиенту, и передаёт менеджеру заявку вместе с историей разговора
  • Внутренний ассистент поддержки — тот же корпус, но интерфейс для операторов: подсказка ответа вместо поиска по регламентам
  • Любая ниша с требованиями ФЗ-152 — медицина, финансы, госсектор: контур на российских моделях собирается тем же способом
  • Замена любого виджета по подписке — когда плата умножается на число точек, витрин или брендов, своё решение окупается арифметикой
Что переиспользуется на следующих проектах
  • Сервис с единым интерфейсом к нескольким моделям — смену модели сайт не замечает
  • Схема базы фактов: каталог, регламенты и живые переписки
  • Строгий тест по эталону вместо оценки другой моделью — модель-судья пропускает ровно те провалы, ради которых её звали
  • Слепое сравнение двух ботов на вопросах, составленных из реальных: сетка типов покупателей и этапов воронки
  • Осторожная выкладка виджета: резервная копия → одна страница → проверка на живом сайте → остальные, откат в три шага
  • Копия разговоров живому человеку в Telegram на первые недели — чтобы кто-то видел, что отвечает бот
Похожая задача?

Если ваш чат-виджет переспрашивает вместо ответа — это чинится

Начинаем с корпуса и способа проверки: что бот обязан знать и как мы докажем, что он это знает. От прототипа до запуска на боевом сайте — четыре недели, дальше сопровождение: надёжность и точность ответов.

Готовы начать?

Аудит за 9 900 ₽ — с конкретным отчётом и сметой

Расскажу что внедрить в вашем бизнесе в первую очередь, какая будет окупаемость, и нужен ли вообще AI для вашей задачи (иногда — нет).

Или просто напишите свой вопрос — отвечу в течение 2 часов