Бесплатный ИИ-ассистент для интернет-магазина: ищет товары как живой человек (шаблон n8n)

Задумывались, как сделать так, чтобы клиент мог спросить на сайте «Есть ли серые бархатные шторы 200×270?» — и получить мгновенный ответ со ссылками на подходящие товары? Не по каталогу, не по фильтрам, а просто написать текстом, как живому консультанту?

Я сделал такого ассистента на n8n и в этой статье покажу, как повторить. Всё бесплатно (кроме расходов на API), шаблон приложу в конце.

Посмотреть, как это работает:

Смотреть видеообзор на YouTube →


Что умеет этот ассистент?

Клиент пишет на сайте:

Нужны шторы в гостиную, бархат, серые, 200 на 270

Ассистент отвечает:

«Отличный выбор! Вот что есть в наличии: штора бархатная серая, 200×270, арт. 12345 — ссылка на товар. Похожие варианты в сером: лён, велюр — ссылка.»

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


Что вам понадобится

  • n8n — локально, на сервере или в облаке
  • YML-файл вашего интернет-магазина (выгрузка из CMS)
  • Supabase — векторная база данных (бесплатный аккаунт)
  • OpenAI API — для эмбеддингов (векторизация текста)
  • DeepSeek API — языковая модель (можно заменить на любую другую)

Весь процесс разделён на две части. Часть 1 — загружаем товары из YML в векторную базу Supabase. Часть 2 — создаём чат-агента, который ищет по этой базе.

Часть 1. Загрузка товаров в Supabase

Создаём новый workflow в n8n. Первая часть — это конвейер: от запроса YML-файла до записи в векторную базу.

Шаг 1.1. Запуск

Ставим Manual Trigger — он нужен только для первичной загрузки. Потом заменим его на Schedule Trigger (например, раз в день), чтобы ассортимент обновлялся автоматически.

Шаг 1.2. Запрос к данным (HTTP Request)

Нам нужно скачать YML-файл. Добавляем ноду HTTP Request:

  • Method: GET
  • URL: ссылка на ваш YML-файл (обычно https://вашсайт.ru/yml-feed.yml)

Важно: в Options → Response → Response Format выбираем File. Иначе n8n попытается прочитать файл как текст, а нам нужен бинарник для распаковки.

Шаг 1.3. Распаковка XML

Добавляем Extract from File — Operation: XML. Нода извлечёт содержимое из бинарного файла.

Шаг 1.4. Конвертирование в JSON

Добавляем ноду XML. Дополнительных настроек не требуется. Она преобразует XML-структуру в JSON, с которым n8n умеет работать.

Шаг 1.5. Разделение на элементы

После конвертации получаем один большой объект с корнем yml_catalog.shop.offers.offer. Там могут быть тысячи товаров. Добавляем Split Out: Field to Split Out: yml_catalog.shop.offers.offer.

У меня получилось 1317 элементов — по одному на каждый товар.

Шаг 1.6. Подготовка к добавлению в БД (код)

Самая важная нода. Она превращает сырые данные в формат, который нужен векторной базе: поле content (текст для поиска) и metadata (структурированные данные).

Я попросил DeepSeek через Cursor написать код. Вот что получилось — копируйте один в один:

// Получаем ВСЕ items
const allItems = $input.all();

// Обрабатываем каждый товар
return allItems.map((item) => {
  const data = item.json;

  // Извлекаем параметры
  const params = {};
  if (Array.isArray(data.param)) {
    data.param.forEach(p => {
      if (p && typeof p === 'object' && p.name && p['_']) {
        params[p.name] = p['_'];
      }
    });
  }

  // Формируем текст для векторизации (content)
  const content = `Товар: ${data.name || 'Без названия'}
Цвет: ${params["Цвет"] || ''}
Ткань: ${params["Ткань"] || ''}
Размеры: ${params["Ширина"] || ''}x${params["Высота"] || ''}
Крепление: ${params["Крепление"] || ''}
Артикул: ${params["Артикул"] || ''}
Цена: ${data.price || 'не указана'} ${data.currencyId || 'RUB'}

Ключевые слова: ${data.name} ${params["Цвет"] || ''} ${params["Ткань"] || ''} шторы`;

  // Формируем metadata
  const metadata = {
    name: data.name || '',
    price: data.price || '',
    currency: data.currencyId || 'RUB',
    url: data.url || '',
    color: params["Цвет"] || '',
    fabric: params["Ткань"] || '',
    width: params["Ширина"] || '',
    height: params["Высота"] || '',
    mounting: params["Крепление"] || '',
    sku: params["Артикул"] || '',
    source: 'website.ru'
  };

  return {
    json: {
      content: content,
      metadata: metadata,
      originalUrl: data.url,
      originalSku: params["Артикул"] || ''
    }
  };
});

Что делает этот код

  • Пробегает по всем товарам
  • Извлекает характеристики из массива param[]
  • Собирает единый текстовый блок content — именно по нему LLM будет искать товары
  • Формирует metadata — структурированные данные, которые вернутся агенту вместе с результатом

Шаг 1.7. Настройка полей

После кода добавляем Set (Edit Fields), чтобы сопоставить поля для загрузчика:

  • content = {{ $json.content }}
  • metadata = {{ $json.metadata }}

Шаг 1.8. Цикл (Split In Batches)

Товаров могут быть тысячи. Добавляем Split In BatchesBatch Size: 100. Если поставить меньше — будет долго. Если больше — n8n может зависнуть на больших объёмах. 100 — золотая середина.

Шаг 1.9. База товаров в Supabase

Внутри цикла ставим Supabase Vector Store (нода из LangChain-пакета):

  • Mode: Insert
  • Table Name: documents (или как назвали свою таблицу)
  • Embedding Batch Size: 100

К ней подключаем две вспомогательные ноды:

OpenAI Embeddings: Model — text-embedding-3-small (самая дешёвая и быстрая модель OpenAI)

Document Default Data Loader: Json Data — {{ $json.content }}. Metadata Values: name = metadata, value = {{ $json.metadata }}

Настройка Supabase

Если у вас ещё нет базы:

  • Зарегистрируйтесь на supabase.com
  • Создайте проект
  • Перейдите в SQL Editor
  • Откройте Examples → LangChain
  • Ничего не меняйте — просто Run

Скрипт создаст таблицу с нужными полями: id, content, metadata, embedding. Вектор будет формироваться автоматически при вставке.

Запуск

Запускаем первую часть. Если всё настроено правильно — через несколько минут все товары окажутся в Supabase. После первого успешного запуска меняем Manual Trigger на Schedule Trigger (например, каждый день в 3:00), и ассортимент будет обновляться автоматически.


Часть 2. Создание чат-бота

Вторая часть — сам ассистент, который будет жить на сайте.

Шаг 2.1. Чат (Webhook Trigger)

Добавляем Chat Trigger (из LangChain-пакета):

  • Mode: Webhook
  • Public: On

Триггер создаёт публичный URL, который мы вставим на сайт. Важно: включаем Load Previous Session → From Memory. Иначе ассистент будет забывать историю диалога при каждом новом сообщении.

Шаг 2.2. Память диалогов (Postgres Chat Memory)

Подключаем ноду Postgres Chat Memory — Credentials: ваши данные от Supabase. Используйте ту же базу Supabase — у неё уже есть Postgres-доступ. История диалогов будет храниться в таблице, и ассистент сможет вспоминать, что говорил пользователь ранее.

Шаг 2.3. Мозги агента (Agent Node)

 

Центральная нода — Agent. System Message:

Ты — ассистент в интернет-магазине. Консультируй клиентов по ассортименту, бери информацию только из базы данных. Всегда давай ссылки на товары.

Шаг 2.4. Модель агента (LLM)

Я использую DeepSeek Chat — она отлично справляется и стоит копейки. Можно подключить любую другую модель через OpenRouter или напрямую: OpenAI (GPT-4o, GPT-4o-mini), Claude, Llama. DeepSeek — оптимальный вариант по соотношению цена/качество для этой задачи.

Шаг 2.5. База товаров (Vector Store как Tool)

Агенту нужен доступ к данным. Добавляем ещё один Supabase Vector Store — теперь в режиме Retrieve-as-Tool:

  • Table Name: documents
  • Top K: 3 (сколько товаров возвращать за один запрос)
  • Tool Description: «Используй этот инструмент для поиска товаров в базе данных интернет-магазина по запросам пользователей.»

Подключаем к нему OpenAI Embeddings — такую же модель, как в первой части. Она векторизует вопрос пользователя, чтобы найти самые похожие товары.


Встраивание на сайт

Когда воркфлоу опубликован, n8n даёт iframe-код для вставки:

<iframe src="https://ваш-n8n.ru/chat/ID_ВОРКФЛОУ" style="width: 100%; height: 600px; border: none;"></iframe>

Вставьте код в нужное место сайта — через админку, виджет HTML или прямо в шаблон.


Результат

Клиент заходит на сайт магазина штор. Пишет в чат:

Нужны шторы для высоких потолков:

Ответ агента:

Ассистент не просто ищет по ключевым словам — он понимает смысл. Написали «цвет осеннего неба» — поймёт, что речь о сером. Написали «что-то светлое» — покажет бежевые, кремовые, белые позиции.


Что важно знать

Защита от промпт-инъекций

Если вы выкладываете ассистента в открытый доступ, кто-то может попытаться взломать его через промпт-инъекцию. Обязательно настройте санитайзинг ввода и ограничение по IP.

  • Санитайзинг ввода (чистка спецсимволов)
  • Ограничение по IP (не больше N запросов в минуту)

Это тема отдельного видео, но имейте в виду.

Вызов менеджера

Если клиент пишет «Позовите менеджера» — ассистент пока не умеет отправлять уведомления. В следующей версии добавлю вызов через Telegram или почту.


Где взять шаблон

🚀 Как внедрить ИИ-ассистента на свой сайт?

Выберите подходящий вариант:

🔧

Сделать самому

Скачайте готовый шаблон n8n бесплатно — документация и видеоинструкция прилагаются

Скачать шаблон →

🚀

Внедрение под ключ

Закажите полную настройку: установим ассистента на ваш сайт, подключим YML, настроим базу данных

Заказать внедрение →

Если у вас нестандартная CMS или специфическая задача — пишите, сделаем индивидуальный шаблон.


Заключение

AI-ассистент на n8n — это рабочее решение, которое можно запустить за вечер. Никаких дорогих сервисов, никаких сложных интеграций. YML-файл есть у любого интернет-магазина, Supabase бесплатен, DeepSeek стоит копейки.

Клиенты получают консультанта 24/7, который знает весь ассортимент и не ошибается. А вы — базу реальных вопросов пользователей. Это золотая жила для маркетинга и ассортиментной политики.

Готовые автоматизации для бизнеса без кода