Blame view

offline_tasks/CONTENT_SIMILARITY_UPDATE.md 6.03 KB
b57c6eb4   tangwang   offline tasks: fi...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
  # 内容相似索引更新说明
  
  ## 📋 更新概述
  
  重构了 `i2i_content_similar.py`,从基于数据库属性计算改为基于Elasticsearch向量计算,生成两份内容相似索引。
  
  ## 🔄 主要变化
  
  ### 1. 算法改变
  
  **之前 (旧版本):**
  - 基于商品属性(分类、供应商、包装等)
  - 使用TF-IDF + 余弦相似度
  - 提供 `--method` 参数选择: tfidf / category / hybrid
  - 复杂的参数配置
  
  **现在 (新版本):**
  - 基于Elasticsearch的向量相似度
  - 使用KNN向量查询
  - **无需任何参数,开箱即用**
  - 自动生成两份索引
  
  ### 2. 生成的索引
  
  | 索引名称 | 向量来源 | 文件名 | Redis Key | TTL |
  |---------|---------|--------|-----------|-----|
  | **名称向量相似** | `embedding_name_zh` | `i2i_content_name_YYYYMMDD.txt` | `item:similar:content_name:{item_id}` | 30天 |
  | **图片向量相似** | `embedding_pic_h14` | `i2i_content_pic_YYYYMMDD.txt` | `item:similar:content_pic:{item_id}` | 30天 |
  
  ### 3. 参数简化
  
  **之前:**
  ```bash
  python i2i_content_similar.py --top_n 50 --method hybrid --debug
  ```
  
  **现在:**
  ```bash
  python i2i_content_similar.py
  # 就这么简单!无需任何参数
  ```
  
  所有配置都在代码中预设好:
  - `TOP_N = 50`: 返回前50个相似商品
  - `KNN_K = 100`: KNN查询返回100个候选
  - `KNN_CANDIDATES = 200`: 候选池大小200
  
  ## 📝 更新的文件
  
  ### 核心代码
  1.`offline_tasks/scripts/i2i_content_similar.py` - 完全重写
     - 连接Elasticsearch
     - 查询最近1年活跃商品
     - 获取向量并计算相似度
     - 生成两份索引
  
  ### 配置文档
  2.`offline_tasks/REDIS_DATA_SPEC.md` - 更新Redis数据规范
     - 添加 `i2i_content_name` 规范
     - 添加 `i2i_content_pic` 规范
     - 更新内存占用估算(270,000 keys, ~160MB)
  
  ### 调度脚本
  3.`offline_tasks/run_all.py` - 简化参数
     - 移除 `--only-*` 参数
     - 移除 `--skip-*` 参数
     - 移除 `--lookback_days` 和 `--top_n` 参数
     - 只保留 `--debug` 参数
     - 添加内容相似任务
  
  4.`offline_tasks/scripts/load_index_to_redis.py` - 更新加载逻辑
     - 添加 `content_name` 和 `content_pic` 到索引类型列表
  
  ### 新增文档
  5.`offline_tasks/scripts/ES_VECTOR_SIMILARITY.md` - ES向量相似度说明
     - ES配置说明
     - 工作流程详解
     - 性能说明和优化建议
     - 故障排查指南
  
  6.`offline_tasks/CONTENT_SIMILARITY_UPDATE.md` - 本文档
  
  ## 🚀 使用指南
  
  ### 安装依赖
  
  需要安装Elasticsearch客户端:
  ```bash
  pip install elasticsearch
  ```
  
  ### 配置ES连接
  
  `i2i_content_similar.py` 中修改ES配置(如需要):
  ```python
  ES_CONFIG = {
      'host': 'http://localhost:9200',
      'index_name': 'spu',
      'username': 'essa',
      'password': '4hOaLaf41y2VuI8y'
  }
  ```
  
  ### 运行脚本
  
  #### 单独运行
  ```bash
  cd /home/tw/recommendation/offline_tasks
  python scripts/i2i_content_similar.py
  ```
  
  #### 通过run_all运行
  ```bash
  python run_all.py
  ```
  
  ### 加载到Redis
  ```bash
  python scripts/load_index_to_redis.py --date 20251017
  ```
  
  ## 📊 输出示例
  
  ### 文件格式
  ```
  3302275    香蕉干    3302276:0.9234,3302277:0.8756,3302278:0.8432
  ```
  
  ### Redis存储
  ```python
  # 名称向量相似
  GET item:similar:content_name:3302275
  # 返回: [[3302276,0.9234],[3302277,0.8756],[3302278,0.8432]]
  
  # 图片向量相似
  GET item:similar:content_pic:3302275
  # 返回: [[4503826,0.8123],[4503827,0.7856],[4503828,0.7645]]
  ```
  
  ## 🔍 技术细节
  
  ### 数据源
  
  1. **活跃商品列表**
     - 来源: 数据库 `sensors_events`
     - 条件: 最近1年内有行为记录
     - 行为类型: click, contactFactory, addToPool, addToCart, purchase
  
  2. **向量数据**
     - 来源: Elasticsearch `spu` 索引
     - 字段:
       - `embedding_name_zh`: 名称文本向量 (1024维)
       - `embedding_pic_h14.vector`: 图片向量 (1024维)
       - `name_zh`: 商品中文名称
  
  ### ES查询
  
  #### 1. 获取商品向量
  ```json
  {
    "query": {
      "term": {"_id": "商品ID"}
    },
    "_source": {
      "includes": ["_id", "name_zh", "embedding_name_zh", "embedding_pic_h14"]
    }
  }
  ```
  
  #### 2. KNN相似度查询
  ```json
  {
    "knn": {
      "field": "embedding_name_zh",
      "query_vector": [向量],
      "k": 100,
      "num_candidates": 200
    },
    "_source": ["_id", "name_zh"],
    "size": 100
  }
  ```
  
  ## ⚡ 性能说明
  
  ### 运行时间
  - 活跃商品数: ~50,000
  - 向量查询: ~50,000次 × 10ms = 8-10分钟
  - KNN查询: ~50,000次 × 50ms = 40-50分钟
  - **总计: 约50-60分钟**
  
  ### 优化建议
  1. 批量查询: 使用 `_mget` 批量获取向量
  2. 并发处理: 多线程/异步IO
  3. 增量更新: 只处理变化的商品
  4. 缓存向量: 避免重复查询
  
  ## 🆚 与其他算法对比
  
  | 算法 | 数据源 | 计算方式 | 特点 | 更新频率 |
  |-----|-------|---------|------|---------|
  | **Swing** | 用户行为 | 共现关系 | 捕获真实交互 | 每天 |
  | **W2V** | 用户会话 | 序列学习 | 捕获序列关系 | 每天 |
  | **DeepWalk** | 行为图 | 图游走 | 发现深层关联 | 每天 |
  | **名称向量** | ES向量 | KNN查询 | 语义相似 | 每周 |
  | **图片向量** | ES向量 | KNN查询 | 视觉相似 | 每周 |
  
  ## 📋 待办事项
  
  - [x] 重写 `i2i_content_similar.py`
  - [x] 更新 `REDIS_DATA_SPEC.md`
  - [x] 简化 `run_all.py` 参数
  - [x] 更新 `load_index_to_redis.py`
  - [x] 编写技术文档
  - [ ] 添加单元测试
  - [ ] 性能优化(批量查询)
  - [ ] 添加监控和告警
  
  ## ⚠️ 注意事项
  
  1. **ES连接**: 确保能访问ES服务器
  2. **向量缺失**: 部分商品可能没有向量,会被跳过
  3. **网络延迟**: ES查询受网络影响,建议内网部署
  4. **内存占用**: 处理大量商品时注意内存使用
  5. **依赖安装**: 需要安装 `elasticsearch` Python包
  
  ## 🔗 相关文档
  
  - `ES_VECTOR_SIMILARITY.md` - ES向量相似度详细说明
  - `REDIS_DATA_SPEC.md` - Redis数据规范
  - `OFFLINE_INDEX_SPEC.md` - 离线索引规范
  - `QUICKSTART.md` - 快速开始指南
  
  ## 📞 联系方式
  
  如有问题或建议,请联系开发团队。
  
  ---
  
  **更新日期**: 2025-10-17  
  **版本**: v2.0  
  **作者**: AI Assistant