AI-консультант на сайте вместо платного SaaS-виджета: 34 : 12 в слепом бенчмарке
У US-бренда товаров для активного отдыха на витринах стоял платный SaaS-чат-виджет по подписке за каждый магазин — и переспрашивал вместо того, чтобы отвечать. Для российского сайта был ещё и жёсткий контур по 152-ФЗ. Собрал свой RAG-чат на российских LLM и проверил его слепым сравнением с платным виджетом.
Платишь подписку за каждый магазин — а бот переспрашивает вместо ответа
У бренда две витрины на Shopify и отдельный российский сайт. На витринах стоял платный SaaS-чат-виджет: подписка списывается за каждый магазин отдельно, то есть цена умножается на число витрин и растёт вместе с бизнесом, а не с пользой.
Претензия менеджеров была не к цене, а к качеству. Виджет не отвечал по существу: на конкретный вопрос про подбор модели он задавал встречный уточняющий вопрос, а когда всё-таки отвечал — тянул клиента к тем позициям, которые есть в наличии у него в фиде, а не к тем, которые подходят под задачу покупателя.
Отдельное жёсткое ограничение — для российского сайта. Данные пользователей не должны уходить из страны, значит зарубежные LLM-провайдеры отпадают целиком: и как прод-бэкенд, и как «временное решение на время пилота». Это сразу вычёркивает почти весь рынок готовых AI-виджетов.
Итого задача звучала так: получить консультанта, который отвечает по реальному каталогу и реальным условиям доставки/гарантии, работает на российском контуре, и при этом не хуже платного виджета — причём «не хуже» нужно доказать цифрами, а не ощущениями.
Свой корпус, свой gateway, свой сервер
Отдельный подпроект: корпус фактов, RAG-поиск по нему, SSE-gateway на FastAPI и встраиваемый JS-виджет. Никакой «магии модели» — ответ собирается из фактов, которые можно показать пальцем, а качество проверяется тестом, а не чутьём.
562 факта: каталог, FAQ, доставка, гарантия + формулировки из живых переписок менеджера
Эмбеддинги по корпусу, отбор релевантных фактов под конкретный вопрос
FastAPI + SSE, единый контракт для трёх LLM-бэкендов, IAM-токены, ретраи, предохранители
Потоковый текст, следом отдельный SSE-кадр с карточками товара и картинками
Диалоги и лиды в JSONL, копия вопросов и ответов — живому человеку в Telegram
Корпус собран из каталога и живых переписок
562 факта: характеристики позиций, FAQ, условия доставки и гарантии. Плюс — и это оказалось важнее всего — более 300 живых переписок менеджера с покупателями. Оттуда взяты не только ответы, но и реальные формулировки вопросов: как человек на самом деле спрашивает про размер, вес, зимнюю эксплуатацию и сроки. Бот, обученный на маркетинговых текстах, этих вопросов просто не узнаёт.
Gateway: один контракт, три LLM-бэкенда
SSE-API поверх RAG: ответ отдаётся потоком, пользователь видит текст по мере генерации. За единым контрактом спрятаны три провайдера — боевой YandexGPT, плюс GigaChat и DeepSeek как альтернативы для бенчмарка и дешёвых итераций. Переключение бэкенда не трогает фронт. В gateway живёт вся неромантичная часть:
- обновление IAM-токенов и ретраи с уважением к
Retry-After - блокировка на сессию — один пользователь не запускает пять генераций параллельно
- бюджетный предохранитель — расход на токены не уходит в потолок при абузе
- редакция PII до записи в лог — телефоны и почты не попадают в файлы диалогов
- анти-абуз через Cloudflare Turnstile
- распознавание голосового ввода — вопрос можно надиктовать
Карточки товара отдельным кадром
Текстовый ответ уходит первым — его начинают читать сразу. Следом gateway досылает отдельный SSE-кадр с карточками упомянутых товаров: картинка, название, ссылка. Так консультация не превращается в стену текста, а из чата есть прямой путь в корзину. Там же — захват лида: если разговор дошёл до конкретики, контакт сохраняется и уходит менеджеру.
Проверка качества — тест, а не LLM-судья
Первая версия проверки была на LLM-судье, и её пришлось выбросить. Слепой судья систематически пропускал провалы именно на категорийных вопросах — тех самых, на которые жаловались менеджеры: ответ выглядел связным, значит «ок». Заменил на детерминированный groundtruth-тест: для каждого вопроса известно, какие факты обязаны попасть в ответ, и проверка идёт по ним. Сверху — 76 тестов в pytest, включая grounding (ответ опирается на корпус, а не на фантазию модели) и анти-абуз.
Выкатка канарейкой на живой сайт
Сайт собран в конструкторе, правки идут по живому — поэтому выкатка была
пошаговой. Бэкап снят до правки. Сниппет дописан в конец HEAD,
прежний код не тронут — это проверено сравнением префикса, а не на глаз.
Сначала одна главная страница → проверка на живом сайте → остальные страницы
(их около шестидесяти). Откат описан в три шага и лежит рядом с инструкцией.
Российский контур по умолчанию, а не как компромисс
Gateway с SSE-стримингом, systemd-юнит на своём сервере
562 факта + эмбеддинги, карточки товара отдельным индексом
Боевой LLM-бэкенд — данные остаются в российском контуре
Альтернативные бэкенды за тем же контрактом: бенчмарк и дешёвые итерации
Голосовой ввод — вопрос можно надиктовать, а не печатать
Анти-абуз без капчи в лицо покупателю
Один сниппет, встраивается в сайт на конструкторе без доступа к исходникам
Grounding, анти-абуз, детерминированный groundtruth вместо LLM-судьи
Слепое сравнение с платным виджетом
свой движок / платный виджет, при 3 ничьих
встречный вопрос вместо ответа: 21 из 49 у виджета, ни одного у нас
по полноте — 3,98 против 2,90
Методика бенчмарка важнее цифры. 49 вопросов синтезированы из 174 реальных вопросов покупателей и разложены по сетке: 7 персон × 7 этапов воронки — от «первый раз на сайте» до «уже выбрал, уточняю гарантию». Каждый вопрос задан обоим ботам, ответы перемешаны, судейство слепое — судья не знает, где чей ответ.
Главная разница оказалась не в «уме», а в готовности отвечать. На 21 вопросе из 49 платный виджет задал встречный вопрос вместо ответа — ровно то, на что жаловались менеджеры. Свой чат ответил по существу на все 49.
Чат выкачен на боевой сайт. Контур обратной связи замкнулся за сутки: замечание владельца бизнеса вечером — два исправляющих коммита к утру. Бот перестал выдумывать популярность позиций и стал опираться на реальные продажи. Это, пожалуй, лучший показатель того, что система собрана правильно: правку видно в проде на следующий день, а не в следующем релизе вендора.
Отдельный эффект — предсказуемость расходов. Вместо подписки, которая множится на число витрин, остаётся оплата токенов по факту использования плюс свой сервер; лицензий нет, и потолок расхода задан бюджетным предохранителем в самом gateway.
Где ещё ложится та же методология
Кейс не про «чат на сайте». Это типовая задача «консультация по закрытой предметной области, где ответ обязан опираться на факты, а не на модель». Та же архитектура работает везде, где есть свой корпус знаний и цена ошибки выше, чем цена молчания:
- → Магазины со сложным выбором — техника, оборудование, снаряжение: там, где покупка требует объяснения, а не фильтра по цене
- → B2B-сайты с длинным циклом — квалификация лида в чате и передача менеджеру уже с контекстом разговора
- → Внутренний ассистент поддержки — тот же корпус, но интерфейс для операторов: подсказка ответа вместо поиска по регламентам
- → Любая ниша с требованием 152-ФЗ — медицина, финансы, госсектор: контур на российских LLM собирается тем же способом
- → Замена любого SaaS-виджета — когда подписка умножается на число точек/витрин/брендов, свой движок окупается арифметикой, а не верой
- SSE-gateway с единым контрактом на несколько LLM-провайдеров — смена бэкенда не трогает фронт
- Схема корпуса: каталог + регламенты + живые переписки, а не только маркетинговые тексты
- Детерминированный groundtruth-тест вместо LLM-судьи — судья пропускает ровно те провалы, ради которых его звали
- Слепой A/B-бенчмарк на вопросах, синтезированных из реальных: сетка персон × этапов воронки
- Канареечная выкатка виджета: бэкап → одна страница → проверка на живом сайте → остальные, откат в три шага
- Дубль диалогов живому человеку в Telegram на первые недели — чтобы кто-то видел, что отвечает бот
Если ваш чат-виджет переспрашивает вместо ответа — это чинится
Начинаем не с модели, а с корпуса и способа проверки: что бот обязан знать и как мы докажем, что он это знает. От прототипа до go-live на боевом сайте — около четырёх недель.
Аудит за 5 000 ₽ — с конкретным отчётом и сметой
Расскажу что внедрить в вашем бизнесе в первую очередь, какая будет окупаемость, и нужен ли вообще AI для вашей задачи (иногда — нет).
Или просто напишите свой вопрос — отвечу в течение 2 часов