Кожен третій відвідувач інтернет-магазину йде без покупки через нерелевантні AI-рекомендації товарів. Гірше того, показ однотипних товарів знижує довіру до майданчика. На одному проекті — магазин електроніки з 50 000 SKU — ми зафіксували, що блок «схожі товари» на основі категорій видавав майже однакові позиції: 8 з 8 — смартфони тієї ж марки. Click-through rate впав до 0.3%. Проблема не у відсутності даних, а у виборі алгоритму. Content-based на атрибутах дає вузьку видачу, колаборативна фільтрація страждає від cold start, а гібрид вимагає грамотного міксу. Ми реалізували системи рекомендацій для 15+ магазинів і знайшли баланс: зростання конверсії в середньому 18%, а для одного клієнта — +34% за рахунок впровадження асоціативних правил «часто купують разом». Персоналізація e-commerce — це не просто тренд, а необхідність для утримання клієнтів.
Який алгоритм рекомендацій обрати?
Вибір залежить від даних і цілей. Content-based рекомендації шукають схожі за атрибутами — швидко запускається, але дає однотипні результати. Колаборативна фільтрація (ALS) виявляє приховані патерни — точніше, але вимагає історії дій. Гібридні рекомендації поєднують краще з обох: на 25% більше кліків, ніж чистий content-based. Для нового магазину без історії ми рекомендуємо починати з content-based рекомендацій на ембеддингах, поступово підключаючи ALS у міру накопичення даних.
| Алгоритм | Необхідні дані | Переваги | Недоліки | Швидкість впровадження |
|---|---|---|---|---|
| Content-based рекомендації (ембеддинги) | Описи товарів | Працює одразу, без історії | Однотипні результати | 2–3 дні |
| Колаборативна фільтрація (ALS) | Поведінка користувачів | Висока точність, приховані патерни | Cold start для нових користувачів | 1–2 тижні |
| Гібридні рекомендації | Обидва типи | Кращий CTR на 20%+, згладжує cold start | Складність налаштування ваг | 2–3 тижні |
Чому гібридний підхід ефективніший?
Він не страждає від cold start: нові товари отримують рекомендації через ембеддинги, а старі — через поведінку користувачів. Різноманітність вища — блок не забивається однаковими позиціями. Ми використовуємо динамічний мікс: якщо у користувача мало даних, робимо акцент на content-based, і навпаки. На практиці це дає зростання CTR на 15–20% порівняно з однорідною видачею. Крім того, гібрид дозволяє збільшити середній чек на 12–15% за рахунок крос-продажів. Таким чином, наш досвід показує, що гібридні рекомендації підвищують конверсію в 1.3 рази порівняно з однотипною видачею.
Структура даних та індексація
Для ембеддингів збираємо текстове представлення товару:
function buildProductText(product) {
return [
product.name,
product.brand,
product.category + ' > ' + product.subcategory,
product.description?.slice(0, 500),
product.tags?.join(', '),
Object.entries(product.attributes || {})
.map(([k, v]) => `${k}: ${v}`)
.join(', '),
].filter(Boolean).join('\n');
}
async function indexProduct(product) {
if (!product.active || product.stock === 0) return;
const text = buildProductText(product);
const { data: [{ embedding }] } = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: text,
});
await db.query(`
INSERT INTO product_embeddings (product_id, embedding, updated_at)
VALUES ($1, $2::vector, NOW())
ON CONFLICT (product_id) DO UPDATE
SET embedding = $2::vector, updated_at = NOW()
`, [product.id, JSON.stringify(embedding)]);
}
Індексація проходить при кожному оновленні товару. Ембеддинги зберігаємо в pgvector — це дає швидкість пошуку <10ms для 100К товарів.
Пошук схожих товарів
async function getSimilarProducts(productId, options = {}) {
const { limit = 8, minPrice, maxPrice, inStockOnly = true } = options;
const result = await db.query(`
WITH source AS (
SELECT pe.embedding, p.price, p.category_id
FROM product_embeddings pe
JOIN products p ON p.id = pe.product_id
WHERE pe.product_id = $1
)
SELECT p.id, p.name, p.slug, p.price, p.main_image, p.rating, p.reviews_count,
1 - (pe.embedding <=> source.embedding) AS similarity
FROM product_embeddings pe
JOIN products p ON p.id = pe.product_id
CROSS JOIN source
WHERE pe.product_id != $1 AND p.active = true
AND ($2::boolean IS FALSE OR p.stock > 0)
AND ($3::numeric IS NULL OR p.price >= $3)
AND ($4::numeric IS NULL OR p.price <= $4)
ORDER BY pe.embedding <=> source.embedding
LIMIT $5
`, [productId, inStockOnly, minPrice || null, maxPrice || null, limit]);
return result.rows;
}
Додали фільтри за ціною та наявністю — результати завжди актуальні та відповідають бізнес-правилам.
Асоціативні правила: «часто купують разом»
Аналізуємо історію замовлень за останні 90 днів через FP-Growth (швидше Apriori на великих даних):
from mlxtend.frequent_patterns import fpgrowth, association_rules
import pandas as pd
def compute_frequently_bought_together():
orders = fetch_orders_last_90_days()
basket = orders.groupby(['order_id', 'product_id'])['product_id'] \
.count().unstack().fillna(0)
basket = basket.map(lambda x: 1 if x > 0 else 0)
frequent_sets = fpgrowth(basket, min_support=0.005, use_colnames=True)
rules = association_rules(frequent_sets, metric='lift', min_threshold=1.5)
for _, rule in rules.iterrows():
antecedent = list(rule['antecedents'])[0]
consequent = list(rule['consequents'])[0]
save_association(antecedent, consequent, rule['confidence'], rule['lift'])
Практична користь: коли кладуть у кошик смартфон, пропонуємо чохол і скло — конверсія в допродаж зростає на 40%. Для магазину одягу ми виявили, що покупці джинсів часто беруть ремінь — це збільшило середній чек на 12%. Підвищення лояльності за рахунок релевантних пропозицій знижує витрати на ретаргетинг на 20–25%. Для магазину з 10 000 замовлень на місяць економія на ретаргетингу може сягати 3000 грн щомісяця.
Персональні рекомендації через ALS
Використовуємо implicit.ALS (64 фактори, 30 ітерацій) на поведінковій матриці (перегляд=1, кошик=3, покупка=10):
import implicit
from scipy.sparse import csr_matrix
def train_product_model(events):
users_idx = {u: i for i, u in enumerate(events['user_id'].unique())}
items_idx = {p: i for i, p in enumerate(events['product_id'].unique())}
matrix = csr_matrix((
events['weight'],
(events['user_id'].map(users_idx), events['product_id'].map(items_idx))
))
model = implicit.als.AlternatingLeastSquares(factors=64, iterations=30)
model.fit(matrix.T)
return model, users_idx, items_idx
Для кожного користувача отримуємо топ-N товарів, змішуючи з content-based для різноманіття.
Різноманітність рекомендацій (Diversity)
Блок з 8 однакових ноутбуків погіршує UX. Механізм диверсифікації пересортовує видачу, штрафуючи схожі категорії:
function diversify(recommendations, diversityFactor = 0.3) {
const selected = [recommendations[0]];
const remaining = recommendations.slice(1);
while (selected.length < 8 && remaining.length > 0) {
const scores = remaining.map(candidate => {
const maxSimilarity = Math.max(
...selected.map(s => categorySimilarity(s, candidate))
);
return { item: candidate, score: candidate.score * (1 - diversityFactor * maxSimilarity) };
});
scores.sort((a, b) => b.score - a.score);
selected.push(scores[0].item);
remaining.splice(remaining.indexOf(scores[0].item), 1);
}
return selected;
}
У результаті у видачі — товари різних категорій та цінових сегментів. A/B тестування рекомендацій показало, що різноманітна видача збільшує CTR на 22% без втрати конверсії.
Процес впровадження
- Аналіз — вивчаємо асортимент, сценарії поведінки, дані.
- Проектування — обираємо алгоритми під завдання бізнесу.
- Прототип — запускаємо на реальних даних, вимірюємо якість.
- A/B тест рекомендацій — порівнюємо з поточною версією (або її відсутністю).
- Деплой і моніторинг — налаштовуємо дашборди, фіксуємо базу.
Ми гарантуємо якість та підтримку — всі рішення проходять тестування та супроводжуються документацією. Завдяки 15+ реалізованим проектам ми маємо підтверджений досвід та гарантію результатів.
Що входить у роботу
- Документація архітектури та опис моделей
- Навчання команди роботі з системою
- Дашборд ключових метрик (CTR, конверсія, виручка)
- Підтримка протягом місяця після запуску
Орієнтовні терміни
| Компонент | Термін |
|---|---|
| Content-based схожі товари (pgvector) | 3–4 дні |
| Асоціативні правила («часто купують разом») | +2–3 дні |
| Персональні рекомендації (ALS) — Python-сервіс | +4–5 днів |
| Повна система + A/B + аналітика | 3–4 тижні |
Вартість розраховується індивідуально після аналізу вашого проекту. Отримайте консультацію інженера — ми підготуємо комерційну пропозицію з точними термінами та етапами. Зв'яжіться з нами, щоб обговорити деталі та почати підвищувати конверсію вашого магазину.







