# 推荐系统离线任务改进总结 **日期**: 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. run_cpp_swing() → C++ Swing算法(使用session) 核心算法任务: 4. i2i_swing.py → Python Swing算法(启用日期维度) 5. i2i_session_w2v.py → Session W2V 6. i2i_deepwalk.py → DeepWalk 7. i2i_content_similar.py → 内容相似度 8. interest_aggregation.py → 兴趣聚合 ``` **好处**: - 📦 Session文件可复用于多个任务 - 🔄 C++版Swing算法可直接使用session文件 - 🎯 数据准备与算法执行解耦 --- ### 3. Swing算法增强:支持日期维度 **功能**: i2i_swing.py 现在支持 uid+日期 作为额外的session维度 **实现方式**: ```python # 数据duplicate: # 1. 原始数据:uid -> items # 2. 日期数据:uid_YYYYMMDD -> items # 3. 合并后输入Swing算法 # 新增参数 --use_daily_session # 启用日期维度(默认开启) --no_daily_session # 禁用日期维度 ``` **示例**: ```bash # 使用日期维度(默认) 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/ 目录 - 清晰的索引和分类 --- ## 🚀 使用指南 ### 运行完整流程 ```bash cd /home/tw/recommendation/offline_tasks # 方式1: 运行全部任务(推荐) bash run.sh # 方式2: 使用Python版本(简化版) python3 run_all.py --debug # 方式3: 分步运行 # 步骤1: 获取商品属性 python3 scripts/fetch_item_attributes.py # 步骤2: 生成session文件 python3 scripts/generate_session.py --lookback_days 730 # 步骤3: 运行C++ Swing cd collaboration && bash run.sh && cd .. # 步骤4: 运行Python Swing(启用日期维度) python3 scripts/i2i_swing.py --lookback_days 730 --use_daily_session --debug ``` ### C++ Swing算法 ```bash # C++ Swing现已集成到run.sh,会自动执行 # 如需单独运行: cd /home/tw/recommendation/offline_tasks/collaboration bash run.sh # 查看结果 ls -lh output/swing_similar*.txt cat output/swing_similar_readable.txt | head -20 ``` ### 查看文档 ```bash 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 # 修改:添加加载函数 │ ├── collaboration/ # 移动:C++ Swing目录 │ │ ├── src/ │ │ ├── bin/ │ │ ├── run.sh # 修改:路径更新 │ │ └── output/ │ ├── doc/ # 新增:文档中心 │ │ ├── README.md │ │ ├── 快速开始.md │ │ ├── Swing算法使用指南.md │ │ └── ... │ ├── output/ │ │ ├── item_attributes_mappings.json # 新增:映射文件 │ │ ├── item_attributes_stats.txt # 新增:统计信息 │ │ └── session.txt.YYYYMMDD # session文件 │ ├── run.sh # 新增:主执行脚本 │ ├── run_all.py # 修改:简化版本 │ └── README.md ``` --- ## 🔧 C++ Swing算法集成 ### 改进内容 **之前**: C++ Swing在外层目录,需要手动切换 ```bash cd /home/tw/recommendation/collaboration bash run.sh ``` **现在**: 已移入offline_tasks,集成到`run.sh`自动执行 ### 执行流程 ``` run.sh: 1. fetch_item_attributes.py 2. generate_session.py ← 生成session.txt.YYYYMMDD.cpp 3. collaboration/run.sh ← 直接调用C++ Swing ├─ 编译C++程序 ├─ 读取session文件 ├─ 运行Swing算法 ├─ 合并多线程结果 └─ 生成可读版本(自动添加商品名) 4. i2i_swing.py ← Python Swing 5. i2i_session_w2v.py ← Session W2V 6. i2i_deepwalk.py ← DeepWalk 7. i2i_content_similar.py ← 内容相似度 8. interest_aggregation.py ← 兴趣聚合 9. load_index_to_redis.py ← 加载到Redis ``` ### 输出结果 C++ Swing执行后,结果保存在: ``` offline_tasks/collaboration/output_YYYYMMDD/ ├── sim_matrx.* # 多线程输出 ├── swing_similar.txt # 合并结果(ID格式) └── swing_similar_readable.txt # 可读版本(ID:名称格式) offline_tasks/collaboration/output -> output_YYYYMMDD # 软链接 ``` ### 优势 - ✅ **自动化**: 无需手动切换目录 - ✅ **依赖管理**: 确保session文件已生成 - ✅ **错误处理**: 失败不影响后续任务 - ✅ **日志统一**: 所有任务日志在同一个文件 - ✅ **性能**: C++版本比Python版快10-100倍 ### 单独运行 如需单独运行C++ Swing(不执行其他任务): ```bash cd /home/tw/recommendation/offline_tasks/collaboration bash run.sh ``` --- ## 🎯 核心改进点总结 1. **✅ 性能优化**: 减少80-90%的数据库查询 2. **✅ 架构优化**: 前置任务解耦,数据准备与算法分离 3. **✅ 功能增强**: Swing算法支持日期维度 4. **✅ 集成优化**: C++ Swing集成到统一流程 5. **✅ 文档规范**: 统一管理,中文命名,清晰索引 6. **✅ 代码质量**: 无Linter错误,统一编码规范 --- ## 📝 后续建议 ### 短期优化 1. **监控与告警** - 添加任务执行时间监控 - 映射文件过期检测 - 自动重新获取机制 2. **性能优化** - Session文件增量更新 - 映射文件分批加载 - 并行任务执行 ### 长期规划 1. **分布式支持** - 多机协同计算 - 数据分片处理 2. **实时更新** - 在线学习机制 - 增量索引更新 3. **A/B测试框架** - 多版本算法对比 - 效果评估系统 --- ## 📞 相关文档 - **快速开始**: [doc/快速开始.md](./快速开始.md) - **详细指南**: [doc/Swing算法使用指南.md](./Swing算法使用指南.md) - **故障排查**: [doc/故障排查指南.md](./故障排查指南.md) - **文档索引**: [doc/README.md](./README.md) --- **改进完成时间**: 2024-10-17 **状态**: ✅ 已完成并测试通过