系统改进总结-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 # 重命名
└── ...
🎯 核心改进点总结
- ✅ 性能优化: 减少80-90%的数据库查询
- ✅ 架构优化: 前置任务解耦,数据准备与算法分离
- ✅ 功能增强: Swing算法支持日期维度
- ✅ 文档规范: 统一管理,中文命名,清晰索引
- ✅ 代码质量: 无Linter错误,统一编码规范
📝 后续建议
短期优化
监控与告警
- 添加任务执行时间监控
- 映射文件过期检测
- 自动重新获取机制
性能优化
- Session文件增量更新
- 映射文件分批加载
- 并行任务执行
长期规划
分布式支持
- 多机协同计算
- 数据分片处理
实时更新
- 在线学习机制
- 增量索引更新
A/B测试框架
- 多版本算法对比
- 效果评估系统
📞 相关文档
- 快速开始: doc/快速开始.md
- 详细指南: doc/Swing算法使用指南.md
- 故障排查: doc/故障排查指南.md
- 文档索引: doc/README.md
改进完成时间: 2024-10-17
状态: ✅ 已完成并测试通过