日志不是垃圾,是金矿:聊聊基于日志的大规模用户行为建模如何撑起推荐系统

简介: 日志不是垃圾,是金矿:聊聊基于日志的大规模用户行为建模如何撑起推荐系统

日志不是垃圾,是金矿:聊聊基于日志的大规模用户行为建模如何撑起推荐系统

大家好,我是 Echo_Wish

很多做推荐系统的同学,一上来就聊模型:DeepFM、DIN、Transformer……仿佛模型越“深”,推荐就越准。

但我这些年做大数据和推荐落地,反而越来越笃定一件事:

推荐系统真正的“灵魂”,不在模型,而在日志。

没有高质量行为日志,再牛的模型都是空中楼阁。今天我们就聊聊——基于日志的大规模用户行为建模在推荐中的应用,以及它背后那些容易被忽视的关键问题。


一、日志是什么?不是埋点,是用户的“时间线”

在推荐系统里,日志通常包括:

  • 曝光日志(exposure)
  • 点击日志(click)
  • 加购日志(cart)
  • 收藏日志(favorite)
  • 下单日志(purchase)
  • 停留时长(dwell time)

本质上,这些是用户和系统交互的时间序列。

举个简单例子:

user_id | item_id | action   | timestamp
----------------------------------------
1001    | A       | exposure | 10:01
1001    | A       | click    | 10:02
1001    | B       | exposure | 10:03
1001    | B       | exposure | 10:04
1001    | C       | click    | 10:05

这不是冷冰冰的数据,这是用户真实的“注意力轨迹”。

而推荐系统要做的,就是在这个轨迹里,预测“下一步”。


二、行为建模第一步:把“日志”变成“特征”

1️⃣ 基础行为统计特征

比如我们想构造一个用户对某类商品的偏好程度:

from pyspark.sql import functions as F

# 假设 logs 是用户行为日志表
user_item_stat = logs.groupBy("user_id", "item_category") \
    .agg(
        F.sum(F.when(F.col("action") == "click", 1).otherwise(0)).alias("click_cnt"),
        F.sum(F.when(F.col("action") == "purchase", 1).otherwise(0)).alias("buy_cnt")
    )

# 加一个简单的偏好分
user_item_stat = user_item_stat.withColumn(
    "preference_score",
    F.col("click_cnt") * 0.3 + F.col("buy_cnt") * 0.7
)

这类统计特征是推荐系统的基石。

但问题来了:

静态统计 ≠ 行为趋势


2️⃣ 引入时间衰减:行为有“保质期”

用户三个月前点过篮球鞋,不代表现在还想买。

我们可以引入时间衰减:

from pyspark.sql.functions import unix_timestamp, current_timestamp, exp

logs = logs.withColumn(
    "time_diff",
    unix_timestamp(current_timestamp()) - unix_timestamp("timestamp")
)

# 半衰期为7天
half_life = 7 * 24 * 3600

logs = logs.withColumn(
    "decay_weight",
    exp(-F.col("time_diff") / half_life)
)

weighted_score = logs.groupBy("user_id", "item_category") \
    .agg(
        F.sum(
            F.when(F.col("action") == "click", 1)
            .otherwise(0) * F.col("decay_weight")
        ).alias("decayed_click_score")
    )

这一步,是很多推荐系统从“能用”到“好用”的关键。


三、从“统计特征”到“序列建模”

当用户行为规模上亿条,光靠统计特征就不够了。

这时候就需要:

  • 序列特征
  • session 切分
  • 行为 embedding
  • Transformer / RNN 等建模

我们来看一个简化的用户行为序列构造方式:

# 按时间排序,构造行为序列
from pyspark.sql.window import Window

w = Window.partitionBy("user_id").orderBy("timestamp")

sequence_df = logs.withColumn(
    "rank", F.row_number().over(w)
).groupBy("user_id").agg(
    F.collect_list("item_id").alias("item_seq")
)

输出可能是:

user_id | item_seq
1001    | [A, B, C, D, E]

接下来我们就可以喂给深度模型:

# 伪代码
user_embedding = Transformer(item_seq)
score = dot(user_embedding, item_embedding)

这里的核心思想是:

用户不是“标签集合”,而是“行为序列”。

这是推荐系统思维方式的升级。


四、大规模日志的工程挑战

很多人只看到模型,却忽视数据工程。

但真实世界里,你会遇到:

1️⃣ 日志延迟与乱序

实时日志可能晚到几分钟甚至几小时。

解决方案:

  • 使用 watermark
  • 做窗口容错
  • 延迟特征生成

2️⃣ 日志噪音

用户误点、爬虫流量、刷点击行为。

如果不做清洗,模型会学到垃圾模式。

比如:

# 过滤异常高频点击
abnormal_users = logs.groupBy("user_id") \
    .count() \
    .filter("count > 10000")

logs = logs.join(abnormal_users, "user_id", "left_anti")

日志清洗,往往比模型调参更重要。


五、我的一点真实感受

我见过太多团队:

  • 模型调到天花乱坠
  • embedding 维度拉到 512
  • GPU 集群轰鸣

结果上线效果不涨。

最后发现:

  • 曝光日志丢了
  • 点击埋点漏 30%
  • 时间戳错时区

推荐系统的本质不是“算法秀肌肉”,而是:

谁能更真实地还原用户行为。

大规模日志建模的核心,不是堆算力,而是三件事:

  1. 行为定义清晰
  2. 特征构造合理
  3. 数据链路稳定

模型只是放大器。


六、推荐系统的终极问题

当我们基于日志建模时,有个值得思考的问题:

我们是在“预测兴趣”,还是在“放大行为”?

如果用户偶然点了一次某类内容,我们持续推荐——
那是个性化,还是信息茧房?

日志是历史,但推荐决定未来。

作为工程师,我们不能只关心 AUC。

我们要问:

  • 是否引导用户探索?
  • 是否给新内容机会?
  • 是否平衡多样性?

这也是我越来越关注“探索机制”和“多样性建模”的原因。


七、总结

基于日志的大规模用户行为建模,本质上是一件三层结构的事:

第一层:数据层 —— 日志清洗、去重、时间对齐
第二层:特征层 —— 统计特征 + 时间衰减 + 序列构造
第三层:模型层 —— 深度建模、embedding、注意力机制

但真正决定推荐质量的,不是最底层,而是最顶层对“用户行为”的理解。

目录
相关文章
|
1月前
|
自然语言处理 PyTorch 算法框架/工具
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
429 10
大模型太慢?别急着上 GPU 堆钱:Python + ONNX Runtime 优化推理性能实战指南
|
1月前
|
数据采集 人工智能 监控
Amazon竞品调价实时预警系统:OpenClaw AI Agent + Pangolinfo API 企业级落地实践
本方案为跨境电商打造实时竞品价格监控系统:通过Pangolinfo API每10分钟采集ASIN数据,OpenClaw AI Agent智能分析降价威胁并生成应对建议,飞书/Slack即时推送富文本告警。响应速度从24小时提升至10分钟(加速144倍),年ROI超10倍,开发仅需1–2天。(239字)
250 3
|
2月前
|
数据采集 供应链 物联网
别再只会调用 API 了:一步步教你用 Python Fine-Tune 一个定制化大模型
别再只会调用 API 了:一步步教你用 Python Fine-Tune 一个定制化大模型
343 4
|
1月前
|
自然语言处理 调度 语音技术
一行 Python,三种世界:聊聊文本 + 图像 + 音频的多模态协同生成
一行 Python,三种世界:聊聊文本 + 图像 + 音频的多模态协同生成
152 4
|
1月前
|
机器学习/深度学习 人工智能 JSON
AI 术语满天飞?90% 的人只懂名词,不懂为什么!
本文不堆砌概念,只讲前因后果:从大模型底层逻辑,到 Context、RAG、Function Calling、MCP、Skills 的核心关联,拆解所有面试高频考点,让你告别 “名词解释”,吃透原理,面试直接碾压面试官!
AI 术语满天飞?90% 的人只懂名词,不懂为什么!
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
写 PyTorch 总像在写脚本?试试 PyTorch Lightning,把模型训练变成“工程化项目”
写 PyTorch 总像在写脚本?试试 PyTorch Lightning,把模型训练变成“工程化项目”
301 14
写 PyTorch 总像在写脚本?试试 PyTorch Lightning,把模型训练变成“工程化项目”
|
2月前
|
人工智能 API 机器人
OpenClaw 用户部署和使用指南汇总
本文档为OpenClaw(原MoltBot)官方使用指南,涵盖一键部署(阿里云轻量服务器年仅68元)、钉钉/飞书/企微等多平台AI员工搭建、典型场景实践及高频问题FAQ。同步更新产品化修复进展,助力用户高效落地7×24小时主动执行AI助手。
26032 178
|
26天前
|
分布式计算 运维 Kubernetes
别再手搓集群了:用 Terraform + Helm 把数据平台“养成宠物”变“放养牛群”
别再手搓集群了:用 Terraform + Helm 把数据平台“养成宠物”变“放养牛群”
168 5
|
1月前
|
SQL 数据采集 人工智能
别把数据中台做成“数据坟场”:聊聊企业数据中台架构的真实落地之路
别把数据中台做成“数据坟场”:聊聊企业数据中台架构的真实落地之路
169 4
|
30天前
|
人工智能 安全 程序员
50%的人给了差评:龙虾为何在技术论坛翻车了?
OpenClaw(龙虾)AI工具因“自动赚钱”“代约主播”等夸张宣传走红,但吾爱破解论坛投票显示:50%技术用户未下载且不认可其能力。技术圈冷静源于见惯“神器”泡沫——AI擅写代码(搬砖),却难懂需求、统筹系统。它不是神药,而是待磨的砍柴刀。
224 3
50%的人给了差评:龙虾为何在技术论坛翻车了?