Семантический поиск понимает смысл запроса, а не ищет точное совпадение слов. Покупатель пишет чем косить траву на даче
- магазин показывает газонокосилки и триммеры, даже если в названии товара нет слова косить
.
Пример работы и видео
Скоро добавлю
Штатный поиск 1С-Битрикс работает по прямому совпадению слов. Написал крем от морщин после 45
- получил пустую выдачу, потому что в названиях товаров нет слова морщин
, а есть антивозрастной
или anti-age
. Нейросеть понимает, что это одно и то же.
Как устроен модуль
Под капотом - модель intfloat/multilingual-e5-base. Она превращает текст в вектор из 768 чисел (эмбеддинг). Чем ближе векторы двух текстов - тем они похожее по смыслу, даже если слова совершенно разные.
Модель работает через Python-сервис (server.py), который крутится на 127.0.0.1:9876. При поиске PHP отправляет запрос пользователя в Python, получает вектор и сравнивает его с заранее проиндексированными векторами товаров через косинусное сходство. Весь поиск - 60-80 миллисекунд.
Индексация товаров запускается по cron раз в сутки CLI-скриптом. Скрипт собирает тексты товаров из b_search_content, отправляет пачками по 3 товара в Python-сервис, получает эмбеддинги и сохраняет в таблицу mib_smartconsultant_embedding.
Структура модуля
local/modules/mibazarow.smartconsultant/
├── .settings.php # Контроллеры
├── default_option.php # Настройки по умолчанию
├── options.php # Страница настроек в админке
├── include.php # Автозагрузка классов
├── install/ # Установщик и SQL
├── bin/
│ └── reindex.php # CLI-скрипт индексации (cron)
├── lib/
│ ├── Embedding/ # Векторизация: Engine, Repository, Math
│ ├── Index/ # Сбор текстов: SourceText, Pipeline
│ ├── Search/ # Поиск: Searcher, Result
│ └── Infrastructure/ # AJAX-контроллер SearchController
├── components/
│ └── mibazarow/smartconsultant.search/
└── python/
├── server.py # HTTP-сервис (Flask + модель в памяти)
├── embed.py # CLI-векторизация (устаревший)
└── requirements.txt
Требования к серверу
Модель multilingual-e5-base весит ~1.1 GB и загружается в RAM при старте Python-сервиса. Плюс torch runtime (~400 MB). Итого модуль потребляет 1.5 GB RAM сверх того, что уже занято системой, MySQL и PHP.
Минимальные требования для сервера с 10 000 товаров: 4 GB RAM, 2 ядра CPU. Рекомендуемые для 100 000 товаров: 8 GB RAM, 4 ядра. И обязательно Linux - Python-часть не работает на macOS (MAMP).
Место в БД: один товар = 3072 байта (768 float32). 10 000 товаров = 30 MB, 100 000 = 300 MB.
Установка и настройка
Подробная инструкция - в README.md модуля. Коротко:
# 1. Python-окружение
cd local/modules/mibazarow.smartconsultant/python
python3 -m venv venv
venv/bin/pip install torch --index-url https://download.pytorch.org/whl/cpu
venv/bin/pip install -r requirements.txt
# 2. Прогрев модели (загружает ~1.1 GB из HuggingFace)
sudo -u bitrix venv/bin/python -c \
"from sentence_transformers import SentenceTransformer; \
SentenceTransformer('intfloat/multilingual-e5-base')"
# 3. Systemd-сервис
systemctl enable --now mib-smartconsultant
# 4. Установка модуля в админке Битрикс
# Marketplace → Установленные решения → AI Консультант → Установить
# 5. Настройка: выбрать инфоблок каталога, порог релевантности
# Админка → Настройки → Настройки модулей → AI Консультант
# 6. Первая индексация
php local/modules/mibazarow.smartconsultant/bin/reindex.php
# 7. Cron (каждый день в 3:00)
0 3 * * * php /var/www/site/local/modules/mibazarow.smartconsultant/bin/reindex.php
Как работает индексация
Первая индексация - самая долгая. Для 60 000 товаров на 4-ядерном CPU это ~2-3 часа: каждый товар проходит через нейросеть (по 3 товара за раз, чтобы не перегружать модель).
Последующие запуски - секунды. Скрипт проверяет MD5-хеш текста каждого товара. Если текст не изменился - товар пропускается. Обрабатываются только новые и изменившиеся товары.
Если 2-3 часа ждать не хочется, можно проиндексировать товары на мощном сервере с GPU (там 60К товаров - 5-10 минут), сделать mysqldump таблицы mib_smartconsultant_embedding и залить дамп на продакшен. Эмбеддинги - это просто числа, они не зависят от железа.
Поисковый компонент
Компонент mibazarow:smartconsultant.search размещается на любой странице через визуальный редактор. Все настройки (инфоблок, порог релевантности, количество результатов) задаются в модуле, а не в параметрах компонента - так проще управлять.
Покупатель вводит запрос → AJAX-запрос к SearchController → Python-сервис → косинусное сходство → топ-20 товаров → выпадающий список с процентом релевантности.
Примеры поиска
| Каталог | Запрос покупателя | Что находит |
|---|---|---|
| Стройматериалы | штукатурка для влажных помещений | Влагостойкие штукатурки, гидроизоляционные смеси |
| Автозапчасти | масло в двигатель японского авто 5w30 | Моторные масла 5W-30 для азиатских двигателей |
| Зоотовары | корм для пожилой кошки с чувствительным пищеварением | Корма для ageing cats, sensitive digestion |
| Электроника | телефон с хорошей камерой до 40000 | Смартфоны с мощной камерой в бюджете до 40 000 |
| Бытовая техника | чем косить траву на даче | Газонокосилки, триммеры, сенокосилки |
| Косметика | крем от морщин после 45 лет | Антивозрастные кремы 45+ |
Ограничения и планы
Модуль работает только на Linux. Модель загружается из HuggingFace при первом запуске - нужен доступ к huggingface.co. Python-сервис должен работать постоянно (systemd), иначе при каждом поисковом запросе модель будет загружаться заново (500-800ms вместо ~10ms).
В планах: поддержка множественных инфоблоков (сейчас один), GPU-ускорение из коробки, фильтрация по свойствам инфоблока прямо в поисковом запросе, поиск по составным текстам (название + описание + свойства).
Исходный код: github.com/camouf/mibazarow.smartconsultant