本文档旨在指导用户如何基于阿里云 PAI-Rec 推荐引擎的日志数据,结合前端用户行为日志,进行完整的日志分析,包括召回链路的曝光/点击占比、独占率等关键指标计算。
一、准备工作
1.1 后端日志配置(PAI-Rec)
请先按照官方文档完成引擎后端日志配置:日志配置。建议把日志先写入DataHub的Topic中,然后把Topic数据同步到MaxCompute。
配置完成后,您将获得结构化的后端日志,字段如下:
字段名 | 说明 |
| 一次推荐请求的唯一标识 |
| 用户设备信息(可选) |
| 场景 ID(注意原文为 |
| 请求时间戳 |
| 实验 ID(用于 A/B 测试) |
| 推荐结果列表,格式为字符串,包含多个 item 的 score 和特征。示例:savana_in_1707952:0.004196:{"savana_in_ctr_v1_probs_is_click":0.0394,"savana_in_cvr_v1_probs_is_pay":0.00064} |
| 召回链路名称(如 etrec_i2i) |
| 用户 ID |
... |
1.2 前端用户行为日志(离线表)
准备一张用户行为日志表(通常来自埋点或客户端上报),结构如下:
字段名 | 说明 |
| 用户 ID |
| 物品 ID |
| 行为类型(如 |
| 行为发生时间 |
| 关联的推荐请求 ID |
| 实验 ID(与后端日志对齐) |
二、日志关联
我们将通过 request_id + item_id 将后端推荐日志与前端行为日志关联,从而分析各召回链路的效果。
三、核心指标计算
3.1 各召回链路的曝光/点击占比
说明:该指标反映各召回链路对整体曝光和点击的贡献比例。由于多路召回中一个 item 可能被多个链路返回,因此各链路的曝光占比之和可能超过 100%。
-- 计算每个召回链路的曝光量、点击量及全局占比WITH recall_stats AS ( SELECT recall_name, SUM(is_expose) AS expose_cnt, SUM(is_click) AS click_cnt
FROM merged_data -- 上一步关联后的结果 GROUP BY recall_name
),total_stats AS ( SELECT SUM(expose_cnt) AS total_expose, SUM(click_cnt) AS total_click
FROM recall_stats
)SELECT r.recall_name, r.expose_cnt, r.click_cnt, ROUND(r.expose_cnt * 100.0 / t.total_expose, 2) AS expose_ratio_pct, ROUND(r.click_cnt * 100.0 / t.total_click, 2) AS click_ratio_pct
FROM recall_stats r
CROSS JOIN total_stats t
ORDER BY r.expose_cnt DESC;3.2 曝光/点击的独占率(Exclusive Rate)
定义:用于衡量召回链路的独特性价值——是否带来了其他链路无法覆盖的优质内容。
-- Step 1: 统计每个 (req, item) 的召回链路数量WITH item_recall_count AS ( SELECT request_id, item_id, COUNT(DISTINCT recall_name) AS recall_count
FROM rec_with_recall
GROUP BY request_id, item_id
),-- Step 2: 关联行为 + 独占标记merged_with_exclusive AS ( SELECT r.recall_name, r.request_id, r.item_id, b.is_expose, b.is_click, CASE WHEN c.recall_count = 1 THEN 1 ELSE 0 END AS is_exclusive
FROM rec_with_recall r
JOIN behavior_with_type b
ON r.request_id = b.request_id AND r.item_id = b.item_id
JOIN item_recall_count c
ON r.request_id = c.request_id AND r.item_id = c.item_id
)-- Step 3: 计算独占率SELECT recall_name, -- 曝光独占率 SUM(CASE WHEN is_expose = 1 AND is_exclusive = 1 THEN 1 ELSE 0 END) AS exclusive_expose, SUM(is_expose) AS total_expose, ROUND( SUM(CASE WHEN is_expose = 1 AND is_exclusive = 1 THEN 1 ELSE 0 END) * 100.0 / NULLIF(SUM(is_expose), 0), 2 ) AS expose_exclusive_rate_pct, -- 点击独占率 SUM(CASE WHEN is_click = 1 AND is_exclusive = 1 THEN 1 ELSE 0 END) AS exclusive_click, SUM(is_click) AS total_click, ROUND( SUM(CASE WHEN is_click = 1 AND is_exclusive = 1 THEN 1 ELSE 0 END) * 100.0 / NULLIF(SUM(is_click), 0), 2 ) AS click_exclusive_rate_pct
FROM merged_with_exclusive
GROUP BY recall_name
ORDER BY total_expose DESC;3.3 各召回链路的点击率(CTR)
说明:点击率(Click-Through Rate, CTR)是衡量召回链路推荐质量的核心指标,计算公式为:
CTR = 点击次数 / 曝光次数高 CTR 表示该召回链路返回的 item 更受用户欢迎,即使其曝光占比不高,也可能具有高价值。
-- 计算每个召回链路的点击率(CTR)SELECT recall_name, SUM(is_expose) AS expose_cnt, SUM(is_click) AS click_cnt, ROUND( SUM(is_click) * 100.0 / NULLIF(SUM(is_expose), 0), 2 ) AS ctr_pct -- 单位:%FROM merged_data
GROUP BY recall_name
ORDER BY ctr_pct DESC;四、常见问题与优化建议
在召回链路分析过程中,常遇到指标解读偏差、数据对不齐、结论难落地等问题。以下结合 影响力(曝光/点击占比)、独特性(独占率)、质量(CTR) 三大维度,提供实用建议。
4.1 如何综合评估一个召回链路的价值?
不要仅看单一指标!推荐使用 “三维度交叉分析法”:
召回链路特征 | 建议策略 | 说明 |
高 CTR + 高曝光占比 + 高独占率 | 重点保留并加强 | 质量高、覆盖广、内容独特,是核心优质链路(如个性化深度模型) |
高 CTR + 低曝光占比 + 高独占率 | 提升权重或扩大覆盖 | 能带来独特且高质量 item,但当前融合排序中被压制,建议提高打分或增加返回数量 |
高 CTR + 低曝光占比 + 低独占率 | 检查是否冗余 | 虽然质量好,但内容已被其他链路覆盖,可考虑合并或简化 |
低 CTR + 高曝光占比 + 低独占率 | 降权或下线 | 占用大量流量但效果差,且无独特价值(如过时的热门召回) |
低 CTR + 低曝光占比 + 高独占率 | 深入归因分析 | 可能是长尾/冷门内容,需判断是“低质”还是“用户兴趣未匹配”。可结合 CVR、停留时长等进一步验证 |
实操 tip:在 A/B 实验中,可对某类召回链路做 开关实验 或 权重调整实验,观察整体 CTR、人均点击数等大盘指标变化。
4.2 常见问题排查
Q1:为什么总曝光占比之和 > 100%?
原因:多路召回中,同一个 item 可能被多个链路同时召回(如
item_1001同时出现在savana_in和u2i中)。是否正常? 正常!这正是多路召回的特点。
注意:计算 CTR 时仍按“该链路产生的曝光”计算,不受影响。
Q2:点击率为 NULL 或 0?
可能原因:
该召回链路无任何点击行为;
行为日志延迟,点击事件尚未上报;
request_id或item_id关联失败(检查字段类型、分区、时间窗口)。
建议:先验证
merged_data表中是否存在有效点击记录。
Q3:独占率很高但 CTR 很低?
可能是该链路专注于长尾/冷启动 item(如新商品、小众内容)。
建议:不要直接下线!可结合 转化率(CVR)、用户停留时长、多样性指标 综合判断其长期价值。