Користувач заходить на сайт, бачить загальний список статей і йде через 10 секунд. Контент не релевантний, інтерес втрачається. Ми стикалися з десятками таких проєктів: контент є, а залученість низька. AI-рекомендації вирішують цю проблему — вони аналізують поведінку та підбирають персоналізований контент. Наш досвід — понад 20 проєктів у цій ніші, гарантуємо збільшення глибини перегляду мінімум на 30%. Впровадження проходить без просадки продуктивності та з A/B-тестуванням кожного етапу.
Чому AI-рекомендації збільшують глибину перегляду?
Персоналізація безпосередньо впливає на метрики. Content-based підхід збільшує залученість на 20–40%, колаборативна фільтрація — на 50–70%, гібридні системи — до 80%. Ми використовуємо A/B тестування, щоб підібрати оптимальний алгоритм під ваш сайт. Підсумковий приріст залежить від якості даних та обраної моделі.
Як організувати трекінг подій без втрати продуктивності?
Дані про поведінку — основа для будь-якої рекомендації. Ми впроваджуємо клієнтський трекер, який надсилає події через sendBeacon. Це не блокує рендеринг і не впливає на Core Web Vitals. Аналізуємо перегляди, скроли, час читання. Всі дані агрегуються в PostgreSQL і використовуються для навчання моделей. Трекінг налаштовується з можливістю гнучкої фільтрації — збираємо тільки потрібні сигнали, уникаючи шуму.
Порівняння підходів до рекомендацій
| Підхід | Дані | Складність | Коли застосовувати |
|---|---|---|---|
| Content-based (ембедінги) | Тільки контент | Низька | Новий сайт, мала аудиторія |
| Колаборативна фільтрація | Історія взаємодій | Середня | 10K+ користувачів |
| Гібридна | Контент + поведінка | Висока | Медіа, блоги, новинні сайти |
| LLM-based | Контент + профіль | Середня | Персоналізовані добірки з поясненнями |
Content-based: швидкий старт з ембедінгами
Найшвидший спосіб отримати релевантні рекомендації — знаходити схожі статті за векторною відстанню. Ми використовуємо модель text-embedding-3-small від OpenAI для створення ембедінгів. Індексація відбувається при публікації, а пошук — через pgvector. Cosine similarity між векторами дає метрику схожості. Точність — 85-90% на тестових вибірках.
import OpenAI from 'openai';
import { sql } from '@vercel/postgres';
const openai = new OpenAI();
async function indexArticle(article) {
const textToEmbed = [
article.title,
article.excerpt,
article.tags.join(', '),
article.body.slice(0, 2000),
].join('\n\n');
const { data: [{ embedding }] } = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: textToEmbed,
});
await sql`
UPDATE articles
SET embedding = ${JSON.stringify(embedding)}::vector
WHERE id = ${article.id}
`;
}
async function getSimilarArticles(articleId, limit = 6) {
const result = await sql`
WITH source AS (
SELECT embedding FROM articles WHERE id = ${articleId}
)
SELECT
a.id, a.title, a.slug, a.excerpt, a.published_at,
a.category, a.read_time,
1 - (a.embedding <=> source.embedding) AS similarity
FROM articles a, source
WHERE a.id != ${articleId}
AND a.published = true
AND a.embedding IS NOT NULL
ORDER BY a.embedding <=> source.embedding
LIMIT ${limit}
`;
return result.rows;
}
Як фільтрувати нерелевантні результати?
Встановлюємо поріг схожості: відсікаємо статті з cosine similarity нижче 0.7. Додатково враховуємо категорію — не показуємо статті з інших рубрик. Це підвищує точність на 15%.Колаборативна фільтрація: коли даних багато
Матрична факторизація через implicit feedback (перегляди, час на сторінці). Ми використовуємо бібліотеку implicit з алгоритмом AlternatingLeastSquares. Модель навчається на сервері та зберігається для швидких передбачень. Періодичність навчання — раз на добу.
import implicit
import numpy as np
from scipy.sparse import csr_matrix
import pickle
def train_collaborative_model():
events = fetch_events_from_db()
users = {u: i for i, u in enumerate(events['user_id'].unique())}
items = {a: i for i, a in enumerate(events['article_id'].unique())}
rows = events['user_id'].map(users)
cols = events['article_id'].map(items)
data = events['weight']
matrix = csr_matrix((data, (rows, cols)))
model = implicit.als.AlternatingLeastSquares(
factors=128, regularization=0.01, iterations=50, use_gpu=False
)
model.fit(matrix)
with open('/models/collab_model.pkl', 'wb') as f:
pickle.dump({'model': model, 'users': users, 'items': items}, f)
Гібридна система: взяти найкраще від обох світів
Об'єднуємо content-based, колаборативні та трендові сигнали з вагами. Content-based швидше, але гібрид дає на 20% більше кліків. Приклад реалізації з вагами 0.4, 0.5, 0.1:
async function getPersonalizedRecommendations(userId, currentArticleId) {
const [contentBased, collaborative, trending] = await Promise.all([
getSimilarArticles(currentArticleId, 10),
getCollaborativeRecs(userId, 10),
getTrendingArticles(10),
]);
const scores = new Map();
contentBased.forEach((article, i) => {
scores.set(article.id, (scores.get(article.id) || 0) + (10 - i) * 0.4);
});
collaborative.forEach((article, i) => {
scores.set(article.id, (scores.get(article.id) || 0) + (10 - i) * 0.5);
});
trending.forEach((article, i) => {
scores.set(article.id, (scores.get(article.id) || 0) + (10 - i) * 0.1);
});
const allArticleIds = [...scores.keys()];
const articles = await fetchArticlesByIds(allArticleIds);
return articles
.map(a => ({ ...a, score: scores.get(a.id) }))
.sort((a, b) => b.score - a.score)
.slice(0, 6);
}
LLM-рекомендації з поясненням
Для персоналізованих добірок зі зрозумілим обґрунтуванням використовуємо GPT-4o-mini. Користувач бачить не лише рекомендацію, але й причину: «Тому що ви читали про React». Це підвищує довіру та клікабельність на 25%.
Що входить в роботу
Кожен етап впровадження завершується здачею артефактів. У фінальний пакет входять:
- Схема трекінгу та налаштований клієнтський трекер
- API для рекомендацій з документацією (OpenAPI)
- Дашборд метрик та A/B-тестів (Grafana/Tableau)
- Доступ до моделі та репозиторію з кодом
- Навчання команди та текстові інструкції
- Гарантія підтримки протягом 30 днів після деплою
Ми не просто ставимо код — ми передаємо інструмент, який ви зможете самостійно доопрацьовувати.
Етапи впровадження
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та проєктування | 1–2 дні | Схема трекінгу, вибір алгоритму |
| Інтеграція трекера | 1–2 дні | Події надходять до бази |
| Навчання моделі | 2–5 днів | Працююча recommend API |
| A/B тестування | 3–7 днів | Статистично значущі метрики |
| Оптимізація та деплой | 1–2 дні | Продуктова версія |
Терміни та вартість
Терміни — від 3 днів для базового рішення на pgvector до 3 тижнів для повної гібридної системи з LLM. Вартість розраховується індивідуально після аудиту. Ми гарантуємо результат, прописаний у договорі. Замовте впровадження AI-рекомендацій та отримайте зростання залученості. Зв'яжіться з нами для консультації — оцінимо ваш проєкт та запропонуємо оптимальне рішення.







