Задумывались, как сделать так, чтобы клиент мог спросить на сайте «Есть ли серые бархатные шторы 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 Batches — Batch 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, который знает весь ассортимент и не ошибается. А вы — базу реальных вопросов пользователей. Это золотая жила для маркетинга и ассортиментной политики.
