CHANGES_SUMMARY.md 7.73 KB

离线任务更新总结

更新日期

2025-10-17

更新内容

1. 重构内容相似索引 (i2i_content_similar.py)

变化

  • : 基于数据库商品属性计算(TF-IDF + 余弦相似度)
  • : 基于Elasticsearch向量计算(KNN查询)

简化

  • 移除: 所有命令行参数(--method, --top_n, --output, --debug
  • 保留: 无参数,配置内置在代码中
  • 生成: 两份索引文件(名称向量 + 图片向量)

2. 简化运行脚本 (run_all.py)

移除的参数

  • --skip-i2i - 跳过i2i任务
  • --skip-interest - 跳过兴趣聚合
  • --only-swing - 只运行Swing
  • --only-w2v - 只运行W2V
  • --only-deepwalk - 只运行DeepWalk
  • --only-content - 只运行内容相似
  • --only-interest - 只运行兴趣聚合
  • --lookback_days - 回看天数
  • --top_n - Top N数量

保留的参数

  • --debug - 调试模式(唯一参数)

使用

# 之前
python run_all.py --lookback_days 30 --top_n 50 --skip-interest

# 现在
python run_all.py
# 或者
python run_all.py --debug

3. 更新Redis数据规范 (REDIS_DATA_SPEC.md)

新增索引

  • i2i_content_name: 基于名称向量的相似索引
  • i2i_content_pic: 基于图片向量的相似索引

更新统计

  • Key数量: 245,000 → 270,000
  • 总内存: ~135MB → ~160MB

4. 更新索引加载器 (load_index_to_redis.py)

更新

  • 添加 content_name 到i2i索引类型列表
  • 添加 content_pic 到i2i索引类型列表
  • 自动加载两个新的内容相似索引

5. 更新依赖 (requirements.txt)

新增

elasticsearch>=8.0.0

6. 新增文档

ES向量相似度说明 (ES_VECTOR_SIMILARITY.md)

  • ES配置说明
  • 工作流程详解
  • 性能说明和优化建议
  • 故障排查指南

更新说明 (CONTENT_SIMILARITY_UPDATE.md)

  • 更新概述
  • 主要变化
  • 使用指南
  • 技术细节
  • 性能说明
  • 与其他算法对比

本文档 (CHANGES_SUMMARY.md)

  • 所有变更的简要总结

7. 新增测试脚本 (test_es_connection.py)

测试ES连接和向量查询功能:

  • 测试ES连接
  • 测试索引是否存在
  • 测试向量字段映射
  • 测试查询商品向量
  • 测试KNN向量查询

文件清单

修改的文件

  1. offline_tasks/scripts/i2i_content_similar.py - 完全重写
  2. offline_tasks/run_all.py - 简化参数
  3. offline_tasks/REDIS_DATA_SPEC.md - 更新规范
  4. offline_tasks/scripts/load_index_to_redis.py - 添加新索引类型
  5. requirements.txt - 添加elasticsearch依赖

新增的文件

  1. offline_tasks/scripts/ES_VECTOR_SIMILARITY.md - ES向量说明
  2. offline_tasks/CONTENT_SIMILARITY_UPDATE.md - 更新说明
  3. offline_tasks/CHANGES_SUMMARY.md - 本文档
  4. offline_tasks/scripts/test_es_connection.py - ES测试脚本

使用指南

1. 安装依赖

pip install -r requirements.txt

2. 测试ES连接

cd /home/tw/recommendation/offline_tasks
python scripts/test_es_connection.py

3. 运行内容相似索引生成

# 单独运行
python scripts/i2i_content_similar.py

# 或通过run_all运行所有任务
python run_all.py

4. 加载到Redis

python scripts/load_index_to_redis.py

输出文件

新增的输出文件

  • output/i2i_content_name_YYYYMMDD.txt - 名称向量相似索引
  • output/i2i_content_pic_YYYYMMDD.txt - 图片向量相似索引

文件格式

item_id \t item_name \t similar_id1:score1,similar_id2:score2,...

示例

3302275    香蕉干    3302276:0.9234,3302277:0.8756,3302278:0.8432

Redis Keys

新增的Key格式

item:similar:content_name:{item_id}
item:similar:content_pic:{item_id}

Value格式

[[similar_id1,score1],[similar_id2,score2],...]

查询示例

import redis
import json

r = redis.Redis(host='localhost', port=6379, db=0)

# 名称向量相似
similar = json.loads(r.get('item:similar:content_name:3302275'))
# 返回: [[3302276, 0.9234], [3302277, 0.8756], ...]

# 图片向量相似
similar = json.loads(r.get('item:similar:content_pic:3302275'))
# 返回: [[4503826, 0.8123], [4503827, 0.7856], ...]

性能指标

内容相似索引生成

  • 活跃商品: ~50,000
  • 运行时间: 50-60分钟
  • 内存占用:

Redis存储

  • 新增Keys: ~100,000 (两份索引各50,000)
  • 新增内存: ~50MB
  • TTL: 30天

兼容性

向后兼容

  • ✅ 其他i2i算法(Swing, W2V, DeepWalk)不受影响
  • ✅ 兴趣聚合算法不受影响
  • ✅ Redis加载器向后兼容
  • ✅ 在线查询API不受影响

不兼容的变化

  • i2i_content_similar.py 命令行参数全部改变
  • ❌ 旧的 i2i_content_hybrid_*.txt 文件不再生成

迁移指南

如果之前使用了内容相似索引

  1. 更新脚本调用 ```bash # 旧版本 python i2i_content_similar.py --top_n 50 --method hybrid

# 新版本 python i2i_content_similar.py # 无需参数


2. **更新Redis Key**
   ```python
   # 旧版本
   r.get('item:similar:content:{item_id}')

   # 新版本(两个选择)
   r.get('item:similar:content_name:{item_id}')  # 名称相似
   r.get('item:similar:content_pic:{item_id}')   # 图片相似
  1. 更新在线API
    • 如果API使用了 content 算法,需要更新为 content_namecontent_pic
    • 建议支持两种算法,让前端选择或混合使用

技术栈

新增技术

  • Elasticsearch: 向量存储和KNN查询
  • KNN算法: 基于向量的相似度计算

ES配置

ES_CONFIG = {
    'host': 'http://localhost:9200',
    'index_name': 'spu',
    'username': 'essa',
    'password': '4hOaLaf41y2VuI8y'
}

向量字段

  • embedding_name_zh: 名称文本向量 (1024维, dot_product)
  • embedding_pic_h14.vector: 图片向量 (1024维, dot_product)

优势

相比旧版本

  1. 更简单: 无需参数配置
  2. 更快: ES KNN查询比TF-IDF快
  3. 更准: 深度学习向量比手工特征准
  4. 更多维度: 名称 + 图片两个维度

使用场景

  • 名称向量: 语义相似推荐(同类但不同品牌)
  • 图片向量: 视觉相似推荐(外观相似商品)

注意事项

  1. ES依赖: 需要Elasticsearch服务可用
  2. 向量数据: 需要ES中有向量数据
  3. 网络延迟: ES查询受网络影响
  4. 首次运行: 可能较慢,建议先测试连接

故障排查

ES连接失败

# 检查ES是否可访问
curl -u essa:4hOaLaf41y2VuI8y http://localhost:9200

# 运行测试脚本
python scripts/test_es_connection.py

向量字段不存在

# 检查ES mapping
curl -u essa:4hOaLaf41y2VuI8y http://localhost:9200/spu/_mapping

查询超时

  • 增加 request_timeout 参数
  • 检查网络连接
  • 减少 KNN_CANDIDATES 参数

后续优化

  1. 批量查询: 使用 _mget 批量获取向量
  2. 并发处理: 多线程提高查询效率
  3. 增量更新: 只处理变化的商品
  4. 缓存向量: 避免重复查询ES
  5. 监控告警: 添加性能监控和异常告警

相关文档

  • ES_VECTOR_SIMILARITY.md - ES向量详细说明
  • CONTENT_SIMILARITY_UPDATE.md - 更新详细说明
  • REDIS_DATA_SPEC.md - Redis数据规范
  • README.md - 项目概述

总结

本次更新大幅简化了内容相似索引的使用,从基于属性的相似度改为基于深度学习向量的相似度,提供了更准确和多维度的相似商品推荐。同时简化了参数配置,降低了使用和维护成本。


变更: 9个文件(5个修改,4个新增)
影响: 内容相似索引生成和使用方式
破坏性: 中等(API兼容,但参数和Key格式改变)
优先级: 高(建议尽快更新)