AI-推荐产品的通用测试方法

推荐系统的简介:

  1. 推荐系统的本质:是解决信息过载下的“匹配”问题,其输入参数是用户对物品的行为记录,可理解为是一个稀疏矩阵。
  2.  其解决方案主要有2大类算法:协同过滤(CF)和序列推荐
    • 协同过滤是推荐系统的经典基础算法(解决“喜欢什么”)。

    • 序列推荐是协同过滤的重要升级和扩展(解决“下一个喜欢什么”)

  3.  协同过滤主要思想是“物以类聚,人以群分”,不关注商品,主要关注用户的行为。
    1. 基于以上思想又有两个经典的流派:一个是基于用户:根据行为相似的用户,把他喜欢的商品推荐给你;一个是基于商品:根据你历史购买的商品的相似产品,推荐给你
    2. 根据算法的思想都是找到相似性,在数学上,核心就是计算相似度的计算,可以使用余弦相似度/皮尔逊系数
    3. 注:该算法只关心共现矩阵。如果你的测试数据是冷启动用户(没有任何历史),CF 直接失效(输出为空)。这时就需要用矩阵分解/混淆矩阵,此时就只能通过 AUC(曲线下面积)等指标评估排序效果。
    4. 优点:
      • 只依赖交互数据(rating/click/purchase),无需商品属性
      • 能发现"意料之外"的推荐(serendipity)
      • 实现简单,可解释性尚可("和你相似的用户也买了...")
      5.痛点:
      • 冷启动:新用户/新商品没有交互记录,无法推荐
      • 稀疏性:电商场景下用户-物品矩阵通常 >99% 是空的
      • 流行度偏差:容易推荐热门商品,长尾挖掘差
      • 无法捕获时序动态:用户的兴趣是随时间变化的,CF 是静态的
  4.   序列推荐:为了解决协同过滤的一个问题:协同过滤假设用户的行为都是对立、无序的,但实际上用户的行为都是马尔科夫链(只依赖最近一次行为)

 核心思想:用户最近的行为,预测到下一次想做什么;即把用户的交互行为看成一个“句子”,商品是他“词”,用序列模型预测下一个“词”。

1. 主流技术演进

      • 马尔可夫链 (MC):只依赖最近一次行为(一阶马尔可夫假设)。简单但记忆短。

      • RNN/LSTM:按时间步处理,能捕捉长期依赖,但存在梯度消失,无法并行训练。

      • Transformer (SASRec)目前工业界 SOTA。利用自注意力机制,直接计算序列中任意两个位置的相关性。

         2. 数学直觉:注意力机制

序列推荐的核心是:当前时刻的推荐,应该对历史行为赋予不同的权重。

      • 通俗解释:在决定“现在推荐什么”时,模型会看你的历史点击序列,并给每个历史物品打分(注意力权重)。买“键盘”那次点击的权重可能很高,而浏览“袜子”那次权重很低。

3.优点:

      • ✅ 天然解决冷启动:即使只有当前 session 的几个点击也能推荐
      • 捕获兴趣漂移:用户看完手机再买手机壳,CF 做不到这种时序关联
      • 精度更高:尤其在 Session-based 场景(电商、短视频)
      • ✅ 对稀疏矩阵更鲁棒

4.痛点:

    • ❗ 训练成本高(尤其 Transformer 类)
    • ❗ 对长序列效率下降(需要截断/采样)
    • ❗ 容易被最近的 1-2 次点击过度主导(过度拟合近期行为)
    • ❗ 可解释性比 CF 差

 

推荐产品的评测分为算法、内容、功能和A/B测试(线上流量验证)、生态监控几个层级,分别看下具体的层级的验证点和方法.

一、算法离线指标评测表

评估维度 核心指标   基线值 实际值 是否达标 评估工具 备注
排序能力 AUC(ROC曲线下面积) 0.82     scikit-learn 主要衡量全局排序好坏
TopK的准确性 NDCG@K(归一化折损累计增益) 0.40    
sklearn
lightGBM
衡量前K个结果的质量
精确率 precision@K 0.35     内部脚本 评估前K个中相关的比例
召回率 recall@K 0.28     内部脚本 所有相关中被找出来的比例
稳定性 跨群体AUC差异 <0.02     分组分析 确保不同客群效果一致

 

注:NDCG(Normalized Discounted Cummulative Gain)即 归一化折损累积增益
物理意义:关心推荐的这些项目,是否放在用户更显眼的位置里,即强调“顺序性“ 。

公式:

image

理解NDCG需要从CG开始。

CG(cumulative gain,累计增益)可以用于评价基于打分/评分的个性推荐系统。假设我们推荐 k 个物品,这个推荐列表的计算公式如下:

CG_k{}=\sum_{i=1}^{k}rel_i{}

rel_i{})表示第k个物品的相关性或者评分。假设我们共推荐k个电影,rel_i{} 是用户对第i部电影的评分。

image

仍然是M_1{},M_2{},M_3{},M_4{},M_5{} ,评分是5, 3, 2, 1, 2

那么这个推荐列表的DCG是:

image

 NDCG(normalized discounted CG),顾名思义就是标准化之后的DCG,公式如下:

image

 

image

 计算NDCG@K:

import numpy as np
from sklearn.metrics import ndcg_score
def dcg_at_k(relevance_scores, k=10, method='standard'):
    """
    计算DCG@K (Discounted Cumulative Gain)

    Args:
        relevance_scores: 相关性分数列表,按推荐顺序排列
        k: 只计算前K个
        method: 'standard' 使用 log2(i+1),'industry' 使用 log2(i+2)

    Returns:
        DCG值
    """
    relevance_scores = np.asarray(relevance_scores)[:k]
    if len(relevance_scores) == 0:
        return 0.0

    if method == 'standard':
        # 标准公式:DCG = sum(rel_i / log2(i+1))
        gains = relevance_scores
        discounts = np.log2(np.arange(2, len(relevance_scores) + 2))
    else:
        # 工业界常用变体:DCG = sum((2^rel_i - 1) / log2(i+1))
        gains = 2 ** relevance_scores - 1
        discounts = np.log2(np.arange(2, len(relevance_scores) + 2))

    return np.sum(gains / discounts)


def ndcg_at_k(relevance_scores, k=10, method='standard'):
    """
    计算NDCG@K (Normalized DCG)

    Args:
        relevance_scores: 相关性分数列表,按推荐顺序排列
        k: 只计算前K个

    Returns:
        NDCG值,范围[0, 1]
    """
    # 计算实际DCG
    actual_dcg = dcg_at_k(relevance_scores, k, method)

    # 计算理想DCG(按相关性降序排列)
    ideal_scores = sorted(relevance_scores, reverse=True)
    ideal_dcg = dcg_at_k(ideal_scores, k, method)

    # 归一化
    if ideal_dcg == 0:
        return 0.0
    return actual_dcg / ideal_dcg

  测试NDCG计算:

 
def test_ndcg():
    """
    测试NDCG计算
    """
    # 场景:推荐系统返回10个物品,相关性分数如下
    # 3=高度相关, 2=相关, 1=一般, 0=不相关
    recommendations = [3, 2, 1, 0, 2, 1, 3, 0, 1, 2]

    # 计算不同K值的NDCG
    for k in [5, 10]:
        ndcg = ndcg_at_k(recommendations, k=k)
        print(f"NDCG@{k}: {ndcg:.4f}")

    # 对比:如果推荐结果很差
    poor_recommendations = [0, 0, 0, 0, 3, 2, 1, 0, 0, 0]
    print(f"\n差的结果 NDCG@5: {ndcg_at_k(poor_recommendations, k=5):.4f}")
    print(f"好的结果 NDCG@5: {ndcg_at_k(recommendations, k=5):.4f}")

    # 使用sklearn(推荐,更可靠)
    from sklearn.metrics import ndcg_score
    y_true = [recommendations]  # 真实相关性
    y_score = [list(range(10, 0, -1))]  # 预测分数(越高表示越推荐)
    sklearn_ndcg = ndcg_score(y_true, y_score, k=5)
    print(f"\n sklearn NDCG@5: {sklearn_ndcg:.4f}")

  

二、内容质量评测

内容质量四维度评测表(单条)
评测维度 评分标准(5分制) 评分 扣分原因(如有) 优秀案例参考
相关性

5-完全匹配意图

4-高度相关

3-部分相关

2-略有相关

1-完全不相关

4 与用户兴趣匹配,但非当前最急需  
有用性/质量

5-专业准确、逻辑清晰

4-基本准确、有信息量

3-价值有限

2-有明显问题

1-无用/低质量

5 专业深入,引入权威  
满意度

5-阅读体验极佳

4-体验良好

3-体验一般

2-体验较差

1-体验很差

4 表述清晰,但专业术语略多  
安全性

一票否决制

通过

不通过

通过 无违规内容  

 

批量评测汇总表
对比维度 新模型 基线模型 胜率/提升 统计显著性
平均相关性得分 4.2 4.1 +2.4% p=0.12
平均有用性得分 4.3 4.0 +7.5% p=0.008

平均满意度得分

4.1 4.0 +2.5% p=0.15

安全性通过率

100% 100% 0 -

整体胜率

57% 30% 胜率+27% p=0.003

 

注:

1)胜率:指 获胜的概率,即成功的可能性。比如,如果你投资100次,有60次是盈利的,那么你的胜率就是60%。

2)显著性P值:一般来说,如果p值小于预先设定的显著性水平(通常为0.05),则拒绝原假设,认为结果具有统计学显著性;如果p值大于显著性水平,则不能拒绝原假设,即没有足够的证据表明存在显著差异或关系。

三、新模型内容评测实战

评测设计:

1.构建评测集:构建一定数量个典型查询(生活、科技、热点等各占一定比例),新模型和基线模型各生成topK个结果

2.评测任务设计:任务A(效率优先):AB列表对比,选更好的;任务B(质量优先):单条内容四维度深度评分

3.评测员管理:领域专家(30%占比):评估专业准确性;深度用户(50%):评估可读性;安全审核(20%):一票否决

4.评测结果分析

四、功能与体验评测

1.从算法到产品功能

算法和内容都测试通过了,现在需要把新模型做成线上功能,需验证哪些点。

2.功能评测的三个层次

核心转变:评测对象从内容变成系统功能

三个评测层次:

  1. 基础质量:系统是否正常运行?
  2. 策略逻辑:功能是否符合产品设计?
  3. 用户体验:用户用起来是否顺畅?

3.功能测试检查清单

功能测试检查表
测试类别 测试项 通过标准 测试方法 结果
服务可用性

接口响应

错误率

HTTP 200,<2s

<0.1%

自动化脚本

监控日志

通过/不通过
数据一致性

曝光上报

点击上报

AB分流一致

曝光必有日志

点击10S内上报

客户端,服务端

端到端测试

埋点验证

一致性检查

通过/不通过
性能要求

P95延迟

并发能力

<1000ms

>1000QPS

压测工具

负载测试

通过/不通过
策略逻辑

1.深度用户识别

2.新用户冷启动

专业内容占比>60%

返回热门优质内容

用例测试

新账号测试

通过/不通过

 

五、A/B测试与价值验证

1.最后的真实考验:需让真实用户来投票

2.A/B测试的科学设计

本质:在真实环境中进行随机对照实验

关键认知:相关不等于因果,只有A/B测试能正面因果

3.A/B测试设计模板

  • 实验设计表
设计要素 具体设计 说明
实验假设   必须具体、可检验
核心指标   反映核心目标
护栏指标   不能恶化的指标
实验分组

实验组:5%流量

对照组(基线):5%流量

随机分流
目标用户   排除新用户
样本量计算    
实验时长   覆盖两个周末
监控频率   预设停止规则

 

 

  • 指标定义表:
指标类型 指标名称 计算公式 数据源 监控频率
核心指标        
护栏指标        

 

  • A/B实验结果分析表:
指标 实验组均值 对照组均值 绝对差异 相对差异 p值 是否显著 业务解读
               
               

 

六、长期生态监控

系统上线后,能否长期稳定运行,需要长期的监控和运营

监控维度 核心指标 上月值 本月值 健康基准   预警状态 负责人
用户长期价值

30日留存率

用户健康度评分

         
创作者生态

新作者30日留存

创作者基尼系数

腰部作者流量月增长

         
内容多样性

话题多样性指数

top3领域占比

         
社区氛围

举报处理平时时长

友善度

         

 

总结:五层评测体系

评测层次 核心问题 评测方法 关键产出 决策标准
第一层 算法预测更准确吗 离线指标评测 指标对比表 指标显著提升
第二层 内容质量高吗 人工+大模型评测 质量评测表 质量内容更优
第三层 系统能稳定运行吗 功能测试 测试报告 测试通过
第四层 真实用户喜欢吗 A/B测试 实验报告 核心指标提升,护栏指标无恶化
第五层 系统长期对生态有益吗 生态监控 生态监控看板 生态指标监控
posted @ 2026-03-31 17:29  sunshine_coast  阅读(51)  评论(0)    收藏  举报