AI-推荐产品的通用测试方法
推荐系统的简介:
- 推荐系统的本质:是解决信息过载下的“匹配”问题,其输入参数是用户对物品的行为记录,可理解为是一个稀疏矩阵。
- 其解决方案主要有2大类算法:协同过滤(CF)和序列推荐
-
协同过滤是推荐系统的经典基础算法(解决“喜欢什么”)。
-
序列推荐是协同过滤的重要升级和扩展(解决“下一个喜欢什么”)
-
- 协同过滤的主要思想是“物以类聚,人以群分”,不关注商品,主要关注用户的行为。
- 基于以上思想又有两个经典的流派:一个是基于用户:根据行为相似的用户,把他喜欢的商品推荐给你;一个是基于商品:根据你历史购买的商品的相似产品,推荐给你
- 根据算法的思想都是找到相似性,在数学上,核心就是计算相似度的计算,可以使用余弦相似度/皮尔逊系数。
- 注:该算法只关心共现矩阵。如果你的测试数据是冷启动用户(没有任何历史),CF 直接失效(输出为空)。这时就需要用矩阵分解/混淆矩阵,此时就只能通过 AUC(曲线下面积)等指标评估排序效果。
-
优点:
5.痛点:-
只依赖交互数据(rating/click/purchase),无需商品属性
-
能发现"意料之外"的推荐(serendipity)
-
实现简单,可解释性尚可("和你相似的用户也买了...")
-
❗ 冷启动:新用户/新商品没有交互记录,无法推荐
-
❗ 稀疏性:电商场景下用户-物品矩阵通常 >99% 是空的
-
❗ 流行度偏差:容易推荐热门商品,长尾挖掘差
-
❗ 无法捕获时序动态:用户的兴趣是随时间变化的,CF 是静态的
-
- 序列推荐:为了解决协同过滤的一个问题:协同过滤假设用户的行为都是对立、无序的,但实际上用户的行为都是马尔科夫链(只依赖最近一次行为)
核心思想:用户最近的行为,预测到下一次想做什么;即把用户的交互行为看成一个“句子”,商品是他“词”,用序列模型预测下一个“词”。
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 |
衡量前K个结果的质量 | ||
| 精确率 | precision@K | 0.35 | 内部脚本 | 评估前K个中相关的比例 | ||
| 召回率 | recall@K | 0.28 | 内部脚本 | 所有相关中被找出来的比例 | ||
| 稳定性 | 跨群体AUC差异 | <0.02 | 分组分析 | 确保不同客群效果一致 |
注:NDCG(Normalized Discounted Cummulative Gain)即 归一化折损累积增益
物理意义:关心推荐的这些项目,是否放在用户更显眼的位置里,即强调“顺序性“ 。
公式:

理解NDCG需要从CG开始。
CG(cumulative gain,累计增益)可以用于评价基于打分/评分的个性推荐系统。假设我们推荐 k 个物品,这个推荐列表的计算公式如下:
()表示第k个物品的相关性或者评分。假设我们共推荐k个电影,
是用户对第i部电影的评分。

仍然是 ,评分是5, 3, 2, 1, 2
那么这个推荐列表的DCG是:

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


计算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.功能评测的三个层次
核心转变:评测对象从内容变成系统功能
三个评测层次:
- 基础质量:系统是否正常运行?
- 策略逻辑:功能是否符合产品设计?
- 用户体验:用户用起来是否顺畅?
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测试 | 实验报告 | 核心指标提升,护栏指标无恶化 |
| 第五层 | 系统长期对生态有益吗 | 生态监控 | 生态监控看板 | 生态指标监控 |

浙公网安备 33010602011771号