כל מבקר שלישי בחנות מקוונת עוזב ללא רכישה בגלל המלצות לא רלוונטיות. גרוע מכך, הצגת אותם סוגי מוצרים פוגעת באמון בפלטפורמה. בפרויקט אחד — חנות אלקטרוניקה עם 50,000 פריטים — גילינו שבלוק ה"מוצרים דומים" המבוסס על קטגוריות החזיר פריטים כמעט זהים: 8 מתוך 8 היו סמארטפונים מאותו מותג. שיעור הקליקים ירד ל-0.3%. הבעיה אינה חוסר בנתונים, אלא בחירת האלגוריתם. גישה מבוססת תוכן לפי מאפיינים נותנת תוצאות מצומצמות, סינון שיתופי סובל מבעיית התחלה קרה, והיברידי דורש ערבוב נכון. עם ניסיון של למעלה מ-5 שנים במסחר אלקטרוני, יישמנו מערכות המלצה ל-15+ חנויות (מחזור מ-10 מיליון רובל לחודש) ומצאנו את האיזון: עלייה ממוצעת בהמרות של 18%, ולקוח אחד קיבל +34% באמצעות הכנסת כללי אסוציאציה של "נקנה יחד לעתים קרובות." פרסונליזציה במסחר אלקטרוני היא לא רק טרנד — היא הכרח לשימור לקוחות. הצוות המוסמך שלנו מבטיח פתרונות מותאמים לאופטימיזציה של שיעור ההמרה. זה בדרך כלל מביא לעלייה חודשית בהכנסות של $5,000–$10,000 לחנויות עם 1000 הזמנות יומיות.
איזה אלגוריתם המלצה לבחור?
הבחירה תלויה בנתונים ובמטרות. חיפוש מבוסס תוכן לפי מאפיינים — מהיר להפעלה, אך נותן תוצאות הומוגניות. סינון שיתופי (ALS) חושף דפוסים נסתרים — מדויק יותר, אך דורש היסטוריית התנהגות. הגישה ההיברידית משלבת את הטוב משני העולמות: 25% יותר קליקים מאשר גישה מבוססת תוכן בלבד. לחנות חדשה ללא היסטוריה, אנו ממליצים להתחיל עם גישה מבוססת תוכן באמצעות embeddings, ולהוסיף בהדרגה ALS ככל שנצברים נתונים.
| אלגוריתם | נתונים נדרשים | יתרונות | חסרונות | זמן יישום |
|---|---|---|---|---|
| מבוסס תוכן (embeddings) | תיאורי מוצרים | עובד מיד, אין צורך בהיסטוריה | תוצאות הומוגניות | 2–3 ימים |
| סינון שיתופי (ALS) | התנהגות משתמשים | דיוק גבוה, דפוסים נסתרים | בעיית התחלה קרה למשתמשים חדשים | 1–2 שבועות |
| המלצות היברידיות | שני הסוגים | שיעור הקליקים הטוב ביותר (20%+), מחליק את בעיית ההתחלה הקרה | כוונון משקלים מורכב | 2–3 שבועות |
מדוע הגישה ההיברידית יעילה יותר?
היא לא סובלת מבעיית התחלה קרה: מוצרים חדשים מקבלים המלצות דרך embeddings, ומוצרים ותיקים דרך התנהגות משתמשים. המגוון גבוה יותר — הבלוק לא מתמלא בפריטים זהים. אנו משתמשים בערבוב דינמי: אם למשתמש יש מעט נתונים, אנו שמים דגש על תוכן, ולהיפך. בפועל, זה נותן עלייה של 15–20% בשיעור הקליקים בהשוואה לפלט הומוגני. בנוסף, הגישה ההיברידית יכולה להעלות את ערך ההזמנה הממוצע ב-12–15% באמצעות מכירות צולבות. לחנות טיפוסית עם 1000 הזמנות יומיות, זה מתורגם לעלייה חודשית בהכנסות של $5,000–$10,000.
מבנה נתונים ואינדוקס
עבור embeddings, אנו אוספים ייצוג טקסטואלי של המוצר:
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)]);
}האינדוקס רץ על כל עדכון מוצר. ה-embeddings מאוחסנים ב-pgvector — מהירות חיפוש <10ms עבור 100K מוצרים.
מציאת מוצרים דומים
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'])תועלת מעשית: כשמוסיפים סמארטפון לעגלה, אנו מציעים נרתיק ומגן מסך — המרת ה-upsell עולה ב-40%. לחנות בגדים, מצאנו שקונים של ג'ינס קונים לעתים קרובות גם חגורה — זה העלה את ערך ההזמנה הממוצע ב-12%. חיזוק נאמנות באמצעות הצעות רלוונטיות מפחית עלויות רימרקטינג ב-20–25%, וחוסך עד $5,000 לחודש בהוצאות פרסום.
המלצות מותאמות אישית עם 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 פריטים המובילים ומערבבים עם תוכן למגוון.
מגוון המלצות
בלוק של 8 מחשבים ניידים זהים פוגע בחוויית המשתמש. מנגנון גיוון מסדר מחדש את הפלט, ומעניש קטגוריות דומות:
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 של המלצות הראו שפלט מגוון מעלה את שיעור הקליקים ב-22% ללא פגיעה בהמרות.
כיצד מכוונים מגוון בפועל?
ניתן להוסיף משקלים של פופולריות או רווחיות כדי לאזן בין רלוונטיות למדדים עסקיים.תהליך היישום
- ניתוח — בחינת מבחר, תרחישי התנהגות, נתונים.
- עיצוב — בחירת אלגוריתמים למשימות עסקיות.
- אב-טיפוס — הרצה על נתונים אמיתיים, מדידת איכות.
- בדיקת A/B — השוואה לגרסה הנוכחית (או היעדרה).
- פריסה וניטור — הגדרת דשבורדים, תיעוד קו בסיס.
מה כלול
- תיעוד ארכיטקטורה ותיאורי מודלים
- הדרכת צוות על עבודה עם המערכת
- דשבורד של מדדים מרכזיים (CTR, המרות, הכנסות)
- תמיכה לחודש אחד לאחר ההשקה
לוח זמנים ועלות משוערים
| רכיב | לוח זמנים | עלות (USD) |
|---|---|---|
| מוצרים דומים מבוססי תוכן (pgvector) | 3–4 ימים | $2,000–$3,000 |
| כללי אסוציאציה (נקנה יחד לעתים קרובות) | +2–3 ימים | +$1,500–$2,000 |
| המלצות מותאמות אישית (ALS) – שירות Python | +4–5 ימים | +$3,000–$5,000 |
| מערכת מלאה + A/B + אנליטיקה | 3–4 שבועות | $8,000–$12,000 |
העלות מחושבת באופן אישי לאחר ניתוח הפרויקט שלך. קבל ייעוץ ממהנדס — נכין הצעה מסחרית עם לוחות זמנים ושלבים מדויקים. צור קשר כדי לדון בפרטים ולהתחיל להעלות את ההמרות בחנות שלך.







