Классический план звучит уверенно: «добавим чат-бота». Через месяц виджет в углу открывают единицы. Ещё через месяц про него забывают даже в отчётах.

Проблема не в модели. Проблема в том, что человека притащили в отдельное окно, хотя он пришёл за товарами.

Другая механика

Ассистент встроен в витрину. Запрос обычным языком — и каталог перестраивается. Не «вот вам текст», а «вот вам карточки» плюс короткое объяснение у каждой.

Витрина после запроса: товары с пояснением why вместо пустого чата

Что это меняет на практике

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

Три грабли, на которые лучше не наступать

Весь каталог в промпт. На сотне SKU прокатит. На десятках тысяч — нет. Сначала shortlist, потом модель.

Ассистент, прибитый гвоздями к одному каталогу. Нужен тонкий слой между LLM и товарами — у меня это CatalogPort: сменился каталог, UX и API остались.

Только облако. Бывает, данные нельзя отдавать наружу. Локальный fallback (Ollama) спасает и нервы, и договор.

// Плохо: надеяться, что модель «сама найдёт» среди 30k SKU
// $llm->ask($query, $entireCatalog);

// Лучше: сузить, объяснить, отдать витрине
$shortlist = $search->find($query, 24);
$items = $llm->explain($query, $shortlist);
foreach ($items as $item) {
    // $item['sku'], $item['why']
}

Живой разбор этого подхода — в кейсе AI-ассистента для Битрикс.