P paper2skillsPlaybook
AI 路线图 →

Personalized Search Ranking — 个性化搜索排名:用户历史驱动的搜索结果重排

Skill-Personalized-Search-Ranking · 05-推荐系统

causalexperimentrecommendationdata_collectionpricing广告与投放供应链与补货客服与VOC推荐与搜索数据采集与治理定价与利润WF-A 智能补货WF-B 广告优化WF-C 客服分诊WF-D 选品扫描WF-E Review监控WF-F 动态定价WF-G Listing内容优化WF-J DTC 独立站增长
年化 ROI¥10-30 万
实现难度⭐⭐⭐☆☆
业务视角
适用角色运营负责人 / 选品负责人 · 产品经理 · 广告优化师
适用平台Amazon · DTC 独立站 · 邮件/SMS 个性化
什么情况下用老客来了只买一件就走,相关产品没被推出去;Bundle 商品连带销售做不起来;站内推荐位点击率低
成功是什么样的老客连带购买率提升 20-35%,客单价提升,品类交叉销售做起来
业务痛点
老客复购率上不去相关产品没有被看到Bundle 凑单没人用新品没有曝光机会

1. 解决的问题

独立站搜索"吸奶器"所有用户看同样排序导致CVR仅3.5%低于行业均值——用户历史偏好驱动的LTR个性化重排,老用户便携款和配件优先展示CVR从3.5%提升到5-7%年化增益10-30万元

2. 核心算法逻辑

统一排名 vs 个性化排名:

3. 业务应用场景

业务问题:独立站月均 5,000 次搜索,搜索转化率 3.5%(低于行业 6-8% 均值)。分析发现:搜索"吸奶器"时,老用户(已购买便携款)和新用户看到完全一样的结果,老用户通常是来找配件/升级款,但被通用排序埋没了。

数据要求: - 用户搜索历史(查询词 + 点击商品) - 用户购买历史(品类偏好/价格档位) - 商品特征(标题/品类/评分/库存)

预期产出: - 个性化搜索排名模型 - 搜索 CVR 提升估计(A/B 测试对比) - 用户段差异化策略(新用户/老用户/高意图用户)

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估
  • 搜索 CVR 提升(3.5% → 5-7%):月增收 ¥3-8 万
  • 用户满意度提升(搜索更精准):长期留存提升
  • 减少用户搜索放弃率:降低 bounce rate
  • 年化综合 ROI:¥10-30 万
  • 实施难度:⭐⭐⭐☆☆(需要用户行为数据和 LTR 模型;冷启动降级逻辑;约 3-4 周)

7. 代码模板

代码块数量:3 · 路径:未检测到

"""
Personalized Search Ranking
个性化搜索排名:用户历史 + LTR 模型
"""
import numpy as np
from dataclasses import dataclass
from collections import defaultdict


@dataclass
class Product:
    """商品"""
    product_id: str
    title: str
    category: str
    price: float
    rating: float
    review_count: int
    in_stock: bool = True


@dataclass
class UserSearchProfile:
    """用户搜索画像"""
    user_id: str
    preferred_categories: dict   # {category: score}
    price_preference: float      # 0-1(越高越倾向高价)
    brand_preferences: dict      # {brand: affinity}
    search_history: list         # [(query, clicked_product_id, converted)]


def compute_text_relevance(query: str, product: Product) -> float:
    """简化的文本相关性评分(生产用BM25/BERT)"""
    query_terms = set(query.lower().split())
    title_terms = set(product.title.lower().split())
    category_terms = set(product.category.lower().split())

    # Jaccard + 品类匹配
    title_match = len(query_terms & title_terms) / max(len(query_terms | title_terms), 1)
    cat_match = len(query_terms & category_terms) / max(len(query_terms), 1)

    return 0.6 * title_match + 0.4 * cat_match


def compute_user_preference_score(user: UserSearchProfile, product: Product) -> float:
    """计算用户对商品的个性化偏好分"""
    # 品类偏好
    cat_score = user.preferred_categories.get(product.category, 0.3)

    # 价格契合度(用户价格偏好 vs 商品价格档位)
    max_price = 300.0
    price_tier = min(1.0, product.price / max_price)
    price_fit = 1 - abs(user.price_preference - price_tier)

    return 0.6 * cat_score + 0.4 * price_fit


def personalized_search_rank(query: str, products: list[Product],
                               user: UserSearchProfile | None,
                               alpha: float = 0.4, beta: float = 0.4,

8. 论文来源

  • 2406.08126