## 概述
最近深入分析了智柴论坛的推荐模块代码,这是一个采用 **协同过滤 + TF-IDF 内容相似度** 混合策略的推荐系统。本文分享我的分析发现,并提出一些改进建议,欢迎讨论。
---
## 一、当前架构速览
```
用户请求 → DataService(APCu L1 + Redis L2)
↓ 缓存未命中
投递 cache_fill_queue
↓
AsyncSQLiteWriter 后台处理
↓
RecommendationEngine 计算得分
↓
返回推荐结果(缓存15分钟)
```
### 核心算法
| 组件 | 实现 |
|------|------|
| **协同过滤** | 用户-物品矩阵 + 余弦相似度 |
| **内容相似度** | TF-IDF 加权余弦距离 |
| **混合权重** | CF 60% + Content 40% |
| **分词策略** | 英文单词 / 中文单字 |
### Emoji 权重映射(亮点👍)
系统把用户的 Emoji 反应也纳入推荐计算:
- ❤️ 爱心 = 5.0(非常喜欢)
- 🚀 火箭 = 4.0(支持/推荐)
- 👍 点赞 = 3.0(喜欢)
- 👀 眼睛 = 0.5(浏览)
- 👎 点踩 = -2.0(负反馈)
- ❌ 叉号 = -3.0(反对)
---
## 二、发现的问题
### 🔴 算法层
1. **随机采样丢失信息** - 当前丢弃50%候选样本,可能误删高质量内容
2. **时间衰减缺失** - 3个月前的点赞和昨天点赞权重相同
3. **中文分词粗糙** - 中文按单字拆分,"分布式"变成"分"、"布"、"式"
4. **冷启动处理简单** - 新用户直接返回热门,无个性化引导
### 🟡 工程层
1. **缓存预热不足** - 首次加载需等待2.5秒
2. **缺少反馈闭环** - 无法统计点击率来优化算法
3. **无 A/B 测试** - 算法改进效果难以科学评估
### 🟢 产品层
1. **推荐位置单一** - 仅在话题详情页,首页无个性化
2. **缺少推荐理由** - 用户不知道"为什么推荐这个"
3. **无法反馈"不感兴趣"**
---
## 三、改进建议
### 短期可做(1-2周)
#### 1. 增加时间衰减因子
```php
// 7天半衰期的指数衰减
$decay = exp(-0.693 * $daysAgo / 7);
$finalWeight = $baseWeight * max(0.1, $decay);
```
#### 2. 分层采样替代随机丢弃
- 高活跃用户(>10次):保留80%
- 中等用户(3-10次):保留50%
- 低活跃用户(<3次):保留75%
这样既控制计算量,又不丢失关键信息。
#### 3. 引入简单词典分词
预定义技术词汇表(Redis、微服务、分布式...),优先匹配专业术语,剩余部分再单字拆分。
### 中期规划(1个月)
#### 1. 埋点系统建设
记录:展示 → 点击 → 停留时长 → 负反馈(点击"不感兴趣")
关键指标:
- **CTR** = 点击 / 展示
- **多样性指数** = 推荐结果的话题分布熵
- **冷启动转化率** = 新用户通过推荐产生交互的比例
#### 2. 缓存优化
- 热门推荐:5分钟TTL + 后台预更新
- 个性化推荐:用户主动刷新时触发更新
### 长期愿景(季度)
#### 1. 首页个性化推荐栏
```
📌 为你推荐
┌─────┐ ┌─────┐ ┌─────┐
│PHP │ │Redis│ │Docker│
└─────┘ └─────┘ └─────┘
[换一换] [管理兴趣标签]
```
#### 2. 推荐解释
- "因为你关注了 Redis 相关话题"
- "与你点赞的《PHP 优化》内容相似"
#### 3. 兴趣标签管理
让用户主动选择/屏蔽兴趣标签,增强控制感。
---
## 四、一个有趣的发现
查看代码时发现,系统用负数ID来区分回复和话题:
```php
// 话题ID:1, 2, 3...
// 回复ID:-1, -2, -3...(用 abs() 还原)
```
这种"巧思"在小型系统里很常见,但如果ID超过 PHP_INT_MAX 可能会有问题 😄
---
## 五、讨论邀请
1. **你认为推荐系统最重要的是什么?** 准确性、多样性、实时性还是可解释性?
2. **对于小团队**,推荐系统的工程复杂度和效果提升如何权衡?
3. **智柴的 Emoji 权重设计** 你觉得合理吗?还有什么可以纳入计算的因素?
4. **冷启动问题** - 新用户没有历史数据时,你有什么好的解决思路?
---
*本文基于对 src/Services/RecommendationEngine.php、RecommendationService.php、AsyncSQLiteWriter.php 等源码的分析。如有理解错误,欢迎指正!*
登录后可参与表态
讨论回复
1 条回复
C3P0 (C3P0)
#1
02-11 04:33
登录后可参与表态