系统改进总结-20241017.md 8.77 KB

推荐系统离线任务改进总结

日期: 2024-10-17
改进内容: 前置任务优化、文档整理、算法增强


✅ 完成的改进

1. 前置任务:商品属性获取

问题: 多个脚本都需要获取ID->名称映射,导致重复查询数据库,效率低下。

解决方案:

  • ✅ 创建 fetch_item_attributes.py 作为前置任务
  • ✅ 一次性从数据库获取所有ID->名称映射
  • ✅ 保存到本地JSON文件 (item_attributes_mappings.json)
  • ✅ 后续任务直接加载本地文件,避免重复查询

新增文件:

offline_tasks/scripts/fetch_item_attributes.py
offline_tasks/output/item_attributes_mappings.json
offline_tasks/output/item_attributes_stats.txt

修改文件:

offline_tasks/scripts/debug_utils.py
  - 新增 load_name_mappings_from_file() 函数
  - fetch_name_mappings() 标记为已弃用

offline_tasks/scripts/add_names_to_swing.py
  - 改用 load_name_mappings_from_file()
  - 移除数据库连接代码

offline_tasks/scripts/i2i_swing.py
  - 改用 load_name_mappings_from_file()
  - Debug模式加载本地映射

offline_tasks/run_all.py
  - 添加前置任务1: fetch_item_attributes
  - 添加前置任务2: generate_session
  - 调整任务执行顺序

效果:

  • ⚡ 大幅减少数据库查询次数
  • 🚀 提升整体任务执行速度
  • 💾 统一的映射数据源,避免不一致

2. Session文件生成前置化

改进: 将session文件生成作为独立的前置任务

新增任务流程:

run_all.py 执行顺序:
1. fetch_item_attributes.py   → 获取商品属性
2. generate_session.py         → 生成用户session文件
3. i2i_swing.py               → Swing算法
4. i2i_session_w2v.py         → Session W2V
5. i2i_deepwalk.py            → DeepWalk
6. i2i_content_similar.py     → 内容相似度
7. interest_aggregation.py    → 兴趣聚合

好处:

  • 📦 Session文件可复用于多个任务
  • 🔄 C++版Swing算法可直接使用session文件
  • 🎯 数据准备与算法执行解耦

3. Swing算法增强:支持日期维度

功能: i2i_swing.py 现在支持 uid+日期 作为额外的session维度

实现方式:

# 数据duplicate:
# 1. 原始数据:uid -> items
# 2. 日期数据:uid_YYYYMMDD -> items
# 3. 合并后输入Swing算法

# 新增参数
--use_daily_session        # 启用日期维度(默认开启)
--no_daily_session         # 禁用日期维度

示例:

# 使用日期维度(默认)
python3 scripts/i2i_swing.py --lookback_days 730 --debug

# 禁用日期维度
python3 scripts/i2i_swing.py --lookback_days 730 --no_daily_session

效果:

  • 📈 同时考虑用户整体行为和单日行为
  • 🎯 更精准的物品相似度计算
  • 🔍 捕获用户短期和长期兴趣

原理:

原始数据:
  user_A -> [item1, item2, item3]  (跨多天的行为)

Duplicate后:
  user_A -> [item1, item2, item3]       # 原始session
  user_A_20241015 -> [item1]            # 10月15日session
  user_A_20241016 -> [item2, item3]     # 10月16日session

算法同时考虑:
- 用户整体偏好(跨时间)
- 用户单日集中行为(同一天购买的商品更相关)

4. 文档整理与规范化

问题: 文档散乱,临时记录太多,命名不规范。

解决方案:

4.1 创建统一文档中心

offline_tasks/doc/
├── README.md                    # 文档索引
├── 从这里开始.md
├── 快速开始.md
├── Swing算法使用指南.md
├── 运行脚本指南.md
├── 调试指南.md
├── 离线索引数据规范.md
├── Redis数据规范.md
├── 完整索引列表.md
├── 数据库配置说明.md
├── 故障排查指南.md
├── 更新日志.md
└── Swing实现总结.md

4.2 删除临时文档

已删除的临时文档(offline_tasks/):
- MEMORY_MONITORING_UPDATE.md
- LATEST_UPDATES.md
- CONTENT_SIMILARITY_UPDATE.md
- QUICKSTART_NEW.md
- CHANGES_SUMMARY.md
- B2B_LOW_FREQUENCY_OPTIMIZATION.md
- FIX_NAME_MAPPING.md
- QUICK_DEBUG_SUMMARY.md
- UPDATE_CONFIG_GUIDE.md
- FINAL_UPDATE.md
- FINAL_SUMMARY.md
- CURRENT_STATUS.md
- DELIVERY.md
- PROJECT_SUMMARY.md
- STRUCTURE.md
- FIELD_MAPPING.md

已删除的临时文档(根目录):
- DEBUG_IMPLEMENTATION_SUMMARY.md
- CONFIG_CHANGES_SUMMARY.md
- OFFLINE_TASKS_SUMMARY.md
- OFFLINE_TASKS_README.md
- tables_structure.md

4.3 文档命名规范

  • ✅ 所有重要文档使用中文名
  • ✅ 统一放在 doc/ 目录
  • ✅ 创建 doc/README.md 索引
  • ✅ collaboration目录下的文档同步规范

📊 改进效果对比

数据库查询优化

改进前:

每次运行任务:
  1. i2i_swing.py        → 查询商品名称
  2. add_names_to_swing  → 查询商品名称
  3. 其他debug任务       → 重复查询

总查询次数: 5-10次(取决于任务数)

改进后:

每次运行任务:
  1. fetch_item_attributes.py  → 查询1次,保存文件
  2. 所有后续任务              → 加载本地文件

总查询次数: 1次

性能提升: 减少 80-90% 的数据库查询

Session文件生成

改进前:

- i2i_swing.py 内部查询数据库
- C++ Swing需要手动准备数据

改进后:

- generate_session.py 统一生成
- 支持两种格式(标准/C++)
- 所有算法可复用

文档管理

改进前:

  • 30+ 散乱的Markdown文件
  • 无明确分类和索引
  • 大量临时记录

改进后:

  • 13个核心文档
  • 统一在 doc/ 目录
  • 清晰的索引和分类

🚀 使用指南

运行完整流程

cd /home/tw/recommendation/offline_tasks

# 方式1: 运行全部任务(推荐)
python3 run_all.py --debug

# 方式2: 分步运行
# 步骤1: 获取商品属性
python3 scripts/fetch_item_attributes.py

# 步骤2: 生成session文件
python3 scripts/generate_session.py --lookback_days 730

# 步骤3: 运行Swing算法(启用日期维度)
python3 scripts/i2i_swing.py --lookback_days 730 --use_daily_session --debug

C++ Swing算法

cd /home/tw/recommendation/collaboration

# session文件自动生成后,运行Swing
bash run.sh

查看文档

cd /home/tw/recommendation/offline_tasks/doc

# 查看文档索引
cat README.md

# 快速开始
cat 快速开始.md

# 详细使用指南
cat Swing算法使用指南.md

📁 文件结构

recommendation/
├── offline_tasks/
│   ├── scripts/
│   │   ├── fetch_item_attributes.py      # 新增:前置任务
│   │   ├── generate_session.py           # 已有:session生成
│   │   ├── add_names_to_swing.py         # 修改:使用本地映射
│   │   ├── i2i_swing.py                  # 修改:支持日期维度
│   │   └── debug_utils.py                # 修改:添加加载函数
│   ├── doc/                              # 新增:文档中心
│   │   ├── README.md
│   │   ├── 快速开始.md
│   │   ├── Swing算法使用指南.md
│   │   └── ...
│   ├── output/
│   │   ├── item_attributes_mappings.json # 新增:映射文件
│   │   ├── item_attributes_stats.txt     # 新增:统计信息
│   │   └── session.txt.YYYYMMDD          # session文件
│   ├── run_all.py                        # 修改:添加前置任务
│   └── README.md
└── collaboration/
    ├── run.sh                             # 已修改:适配session
    ├── Swing快速开始.md                   # 重命名
    └── ...

🎯 核心改进点总结

  1. ✅ 性能优化: 减少80-90%的数据库查询
  2. ✅ 架构优化: 前置任务解耦,数据准备与算法分离
  3. ✅ 功能增强: Swing算法支持日期维度
  4. ✅ 文档规范: 统一管理,中文命名,清晰索引
  5. ✅ 代码质量: 无Linter错误,统一编码规范

📝 后续建议

短期优化

  1. 监控与告警

    • 添加任务执行时间监控
    • 映射文件过期检测
    • 自动重新获取机制
  2. 性能优化

    • Session文件增量更新
    • 映射文件分批加载
    • 并行任务执行

长期规划

  1. 分布式支持

    • 多机协同计算
    • 数据分片处理
  2. 实时更新

    • 在线学习机制
    • 增量索引更新
  3. A/B测试框架

    • 多版本算法对比
    • 效果评估系统

📞 相关文档


改进完成时间: 2024-10-17
状态: ✅ 已完成并测试通过