日志分析

更新时间:
复制 MD 格式

本文档旨在指导用户如何基于阿里云 PAI-Rec 推荐引擎的日志数据,结合前端用户行为日志,进行完整的日志分析,包括召回链路的曝光/点击占比、独占率等关键指标计算。

一、准备工作

1.1 后端日志配置(PAI-Rec)

请先按照官方文档完成引擎后端日志配置:日志配置。建议把日志先写入DataHub的Topic中,然后把Topic数据同步到MaxCompute。

配置完成后,您将获得结构化的后端日志,字段如下:

字段名

说明

request_id

一次推荐请求的唯一标识

mobile

用户设备信息(可选)

scene_id

场景 ID(注意原文为 scene_di,应为笔误)

request_time

请求时间戳

exp_id

实验 ID(用于 A/B 测试)

items

推荐结果列表,格式为字符串,包含多个 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}

retrieveid

召回链路名称(如 etrec_i2i)

uid

用户 ID

...

1.2 前端用户行为日志(离线表)

准备一张用户行为日志表(通常来自埋点或客户端上报),结构如下:

字段名

说明

user_id

用户 ID

item_id

物品 ID

event

行为类型(如 expose, click, pay)

event_time

行为发生时间

request_id

关联的推荐请求 ID

exp_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)、用户停留时长、多样性指标 综合判断其长期价值。