Пользователь заходит на сайт, видит общий список статей и уходит через 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-рекомендаций и получите рост вовлечённости. Свяжитесь с нами для консультации — оценим ваш проект и предложим оптимальное решение.







