Commit 0d5f0a82b42b677f980edc6169ea9072e09ab502
1 parent
2915a5b4
docs
Showing
21 changed files
with
783 additions
and
5430 deletions
Show diff stats
offline_tasks/doc/COMPLETE_INDEX_LIST.md deleted
| ... | ... | @@ -1,350 +0,0 @@ |
| 1 | -# 完整索引清单 | |
| 2 | - | |
| 3 | -## 📋 所有可用的推荐索引 | |
| 4 | - | |
| 5 | -### 1. i2i 相似度索引 | |
| 6 | - | |
| 7 | -#### 1.1 行为相似索引(3种) | |
| 8 | - | |
| 9 | -**Swing算法**: | |
| 10 | -``` | |
| 11 | -i2i:swing:{item_id} | |
| 12 | -``` | |
| 13 | -示例:`i2i:swing:12345` | |
| 14 | - | |
| 15 | -**Session Word2Vec**: | |
| 16 | -``` | |
| 17 | -i2i:session_w2v:{item_id} | |
| 18 | -``` | |
| 19 | -示例:`i2i:session_w2v:12345` | |
| 20 | - | |
| 21 | -**DeepWalk**: | |
| 22 | -``` | |
| 23 | -i2i:deepwalk:{item_id} | |
| 24 | -``` | |
| 25 | -示例:`i2i:deepwalk:12345` | |
| 26 | - | |
| 27 | -#### 1.2 内容相似索引(3种方法) | |
| 28 | - | |
| 29 | -**混合方法(推荐)**: | |
| 30 | -``` | |
| 31 | -i2i:content_hybrid:{item_id} | |
| 32 | -``` | |
| 33 | -示例:`i2i:content_hybrid:12345` | |
| 34 | - | |
| 35 | -**TF-IDF方法**: | |
| 36 | -``` | |
| 37 | -i2i:content_tfidf:{item_id} | |
| 38 | -``` | |
| 39 | -示例:`i2i:content_tfidf:12345` | |
| 40 | - | |
| 41 | -**分类方法**: | |
| 42 | -``` | |
| 43 | -i2i:content_category:{item_id} | |
| 44 | -``` | |
| 45 | -示例:`i2i:content_category:12345` | |
| 46 | - | |
| 47 | ---- | |
| 48 | - | |
| 49 | -### 2. 兴趣点聚合索引 | |
| 50 | - | |
| 51 | -格式:`interest:{list_type}:{dimension}:{value}` | |
| 52 | - | |
| 53 | -#### 2.1 列表类型(list_type) | |
| 54 | - | |
| 55 | -- `hot` - 热门商品 | |
| 56 | -- `cart` - 加购商品 | |
| 57 | -- `new` - 新品 | |
| 58 | -- `global` - 全局(所有数据) | |
| 59 | - | |
| 60 | -#### 2.2 单维度索引 | |
| 61 | - | |
| 62 | -##### 业务平台(platform) | |
| 63 | -``` | |
| 64 | -interest:hot:platform:pc | |
| 65 | -interest:hot:platform:mobile | |
| 66 | -interest:cart:platform:pc | |
| 67 | -interest:new:platform:mobile | |
| 68 | -interest:global:platform:pc | |
| 69 | -``` | |
| 70 | - | |
| 71 | -##### 客户端平台(client_platform) | |
| 72 | -``` | |
| 73 | -interest:hot:client_platform:web | |
| 74 | -interest:hot:client_platform:app | |
| 75 | -interest:cart:client_platform:web | |
| 76 | -interest:new:client_platform:app | |
| 77 | -interest:global:client_platform:web | |
| 78 | -``` | |
| 79 | - | |
| 80 | -##### 供应商(supplier) | |
| 81 | -``` | |
| 82 | -interest:hot:supplier:10001 | |
| 83 | -interest:hot:supplier:10002 | |
| 84 | -interest:cart:supplier:10001 | |
| 85 | -interest:new:supplier:10002 | |
| 86 | -interest:global:supplier:10001 | |
| 87 | -``` | |
| 88 | - | |
| 89 | -##### 一级分类(category_level1) | |
| 90 | -``` | |
| 91 | -interest:hot:category_level1:100 | |
| 92 | -interest:cart:category_level1:100 | |
| 93 | -interest:new:category_level1:100 | |
| 94 | -interest:global:category_level1:100 | |
| 95 | -``` | |
| 96 | - | |
| 97 | -##### 二级分类(category_level2) | |
| 98 | -``` | |
| 99 | -interest:hot:category_level2:200 | |
| 100 | -interest:cart:category_level2:200 | |
| 101 | -interest:new:category_level2:200 | |
| 102 | -interest:global:category_level2:200 | |
| 103 | -``` | |
| 104 | - | |
| 105 | -##### 三级分类(category_level3) | |
| 106 | -``` | |
| 107 | -interest:hot:category_level3:300 | |
| 108 | -interest:cart:category_level3:300 | |
| 109 | -interest:new:category_level3:300 | |
| 110 | -interest:global:category_level3:300 | |
| 111 | -``` | |
| 112 | - | |
| 113 | -##### 四级分类(category_level4) | |
| 114 | -``` | |
| 115 | -interest:hot:category_level4:400 | |
| 116 | -interest:cart:category_level4:400 | |
| 117 | -interest:new:category_level4:400 | |
| 118 | -interest:global:category_level4:400 | |
| 119 | -``` | |
| 120 | - | |
| 121 | -#### 2.3 组合维度索引 | |
| 122 | - | |
| 123 | -##### 平台 + 客户端 | |
| 124 | -``` | |
| 125 | -interest:hot:platform_client:pc_web | |
| 126 | -interest:hot:platform_client:pc_app | |
| 127 | -interest:hot:platform_client:mobile_web | |
| 128 | -interest:hot:platform_client:mobile_app | |
| 129 | -``` | |
| 130 | - | |
| 131 | -##### 平台 + 二级分类 | |
| 132 | -``` | |
| 133 | -interest:hot:platform_category2:pc_200 | |
| 134 | -interest:hot:platform_category2:mobile_200 | |
| 135 | -interest:cart:platform_category2:pc_200 | |
| 136 | -interest:new:platform_category2:mobile_200 | |
| 137 | -``` | |
| 138 | - | |
| 139 | -##### 平台 + 三级分类 | |
| 140 | -``` | |
| 141 | -interest:hot:platform_category3:pc_300 | |
| 142 | -interest:hot:platform_category3:mobile_300 | |
| 143 | -interest:cart:platform_category3:pc_300 | |
| 144 | -interest:new:platform_category3:mobile_300 | |
| 145 | -``` | |
| 146 | - | |
| 147 | -##### 客户端平台 + 二级分类 | |
| 148 | -``` | |
| 149 | -interest:hot:client_category2:web_200 | |
| 150 | -interest:hot:client_category2:app_200 | |
| 151 | -interest:cart:client_category2:web_200 | |
| 152 | -interest:new:client_category2:app_200 | |
| 153 | -``` | |
| 154 | - | |
| 155 | ---- | |
| 156 | - | |
| 157 | -## 🎯 按业务场景的索引使用 | |
| 158 | - | |
| 159 | -### 场景1: 首页个性化推荐 | |
| 160 | - | |
| 161 | -**方案A: 基于平台** | |
| 162 | -```python | |
| 163 | -key = f"interest:hot:platform:{user_platform}" | |
| 164 | -# 示例:interest:hot:platform:pc | |
| 165 | -``` | |
| 166 | - | |
| 167 | -**方案B: 基于分类偏好** | |
| 168 | -```python | |
| 169 | -key = f"interest:hot:category_level2:{user_favorite_category}" | |
| 170 | -# 示例:interest:hot:category_level2:200 | |
| 171 | -``` | |
| 172 | - | |
| 173 | -**方案C: 基于平台+分类** | |
| 174 | -```python | |
| 175 | -key = f"interest:hot:platform_category2:{user_platform}_{category_id}" | |
| 176 | -# 示例:interest:hot:platform_category2:pc_200 | |
| 177 | -``` | |
| 178 | - | |
| 179 | -### 场景2: 详情页相关推荐 | |
| 180 | - | |
| 181 | -**方案A: 行为相似** | |
| 182 | -```python | |
| 183 | -key = f"i2i:swing:{current_item_id}" | |
| 184 | -# 示例:i2i:swing:12345 | |
| 185 | -``` | |
| 186 | - | |
| 187 | -**方案B: 内容相似** | |
| 188 | -```python | |
| 189 | -key = f"i2i:content_hybrid:{current_item_id}" | |
| 190 | -# 示例:i2i:content_hybrid:12345 | |
| 191 | -``` | |
| 192 | - | |
| 193 | -**方案C: 融合推荐** | |
| 194 | -```python | |
| 195 | -behavior_similar = redis.get(f"i2i:swing:{item_id}") | |
| 196 | -content_similar = redis.get(f"i2i:content_hybrid:{item_id}") | |
| 197 | -# 融合两种结果 | |
| 198 | -``` | |
| 199 | - | |
| 200 | -### 场景3: 分类页推荐 | |
| 201 | - | |
| 202 | -**方案A: 该分类热门** | |
| 203 | -```python | |
| 204 | -key = f"interest:hot:category_level2:{category_id}" | |
| 205 | -# 示例:interest:hot:category_level2:200 | |
| 206 | -``` | |
| 207 | - | |
| 208 | -**方案B: 该分类新品** | |
| 209 | -```python | |
| 210 | -key = f"interest:new:category_level2:{category_id}" | |
| 211 | -# 示例:interest:new:category_level2:200 | |
| 212 | -``` | |
| 213 | - | |
| 214 | -**方案C: 该分类+平台** | |
| 215 | -```python | |
| 216 | -key = f"interest:hot:platform_category2:{platform}_{category_id}" | |
| 217 | -# 示例:interest:hot:platform_category2:pc_200 | |
| 218 | -``` | |
| 219 | - | |
| 220 | -### 场景4: 供应商店铺页 | |
| 221 | - | |
| 222 | -**方案A: 供应商热门商品** | |
| 223 | -```python | |
| 224 | -key = f"interest:hot:supplier:{supplier_id}" | |
| 225 | -# 示例:interest:hot:supplier:10001 | |
| 226 | -``` | |
| 227 | - | |
| 228 | -**方案B: 供应商新品** | |
| 229 | -```python | |
| 230 | -key = f"interest:new:supplier:{supplier_id}" | |
| 231 | -# 示例:interest:new:supplier:10001 | |
| 232 | -``` | |
| 233 | - | |
| 234 | -### 场景5: 搜索结果页推荐 | |
| 235 | - | |
| 236 | -**方案A: 全局热门** | |
| 237 | -```python | |
| 238 | -key = "interest:global:platform:pc" | |
| 239 | -``` | |
| 240 | - | |
| 241 | -**方案B: 分类相关** | |
| 242 | -```python | |
| 243 | -key = f"interest:global:category_level2:{search_category}" | |
| 244 | -# 示例:interest:global:category_level2:200 | |
| 245 | -``` | |
| 246 | - | |
| 247 | ---- | |
| 248 | - | |
| 249 | -## 📊 索引数量统计 | |
| 250 | - | |
| 251 | -### i2i索引 | |
| 252 | -- 行为相似:3种算法 × 商品数量 | |
| 253 | -- 内容相似:3种方法 × 商品数量 | |
| 254 | -- **总计**:6 × 商品数量 | |
| 255 | - | |
| 256 | -### 兴趣点聚合索引 | |
| 257 | - | |
| 258 | -**单维度**: | |
| 259 | -- platform: 2-10个 | |
| 260 | -- client_platform: 2-5个 | |
| 261 | -- supplier: 100-1000个 | |
| 262 | -- category_level1: 10-50个 | |
| 263 | -- category_level2: 50-200个 | |
| 264 | -- category_level3: 200-1000个 | |
| 265 | -- category_level4: 1000-5000个 | |
| 266 | - | |
| 267 | -**组合维度**: | |
| 268 | -- platform_client: 4-50个 | |
| 269 | -- platform_category2: 100-2000个 | |
| 270 | -- platform_category3: 400-10000个 | |
| 271 | -- client_category2: 100-1000个 | |
| 272 | - | |
| 273 | -**列表类型**:每个维度 × 4种类型(hot/cart/new/global) | |
| 274 | - | |
| 275 | -**预估总数**:10000-50000条索引 | |
| 276 | - | |
| 277 | ---- | |
| 278 | - | |
| 279 | -## 🔍 查询示例代码 | |
| 280 | - | |
| 281 | -### Python示例 | |
| 282 | - | |
| 283 | -```python | |
| 284 | -import redis | |
| 285 | - | |
| 286 | -# 连接Redis | |
| 287 | -r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) | |
| 288 | - | |
| 289 | -# 1. 查询商品的相似商品 | |
| 290 | -item_id = "12345" | |
| 291 | -similar_items = r.get(f"i2i:swing:{item_id}") | |
| 292 | -if similar_items: | |
| 293 | - items = similar_items.split(',') | |
| 294 | - for item in items[:5]: # 取前5个 | |
| 295 | - item_id, score = item.split(':') | |
| 296 | - print(f"商品ID: {item_id}, 相似度: {score}") | |
| 297 | - | |
| 298 | -# 2. 查询分类热门商品 | |
| 299 | -category_id = "200" | |
| 300 | -hot_items = r.get(f"interest:hot:category_level2:{category_id}") | |
| 301 | -if hot_items: | |
| 302 | - items = hot_items.split(',') | |
| 303 | - for item in items[:10]: # 取前10个 | |
| 304 | - item_id, score = item.split(':') | |
| 305 | - print(f"商品ID: {item_id}, 得分: {score}") | |
| 306 | - | |
| 307 | -# 3. 查询平台+分类组合 | |
| 308 | -platform = "pc" | |
| 309 | -category_id = "200" | |
| 310 | -key = f"interest:hot:platform_category2:{platform}_{category_id}" | |
| 311 | -items = r.get(key) | |
| 312 | -``` | |
| 313 | - | |
| 314 | -### Redis命令行示例 | |
| 315 | - | |
| 316 | -```bash | |
| 317 | -# 查询商品相似度 | |
| 318 | -redis-cli GET "i2i:swing:12345" | |
| 319 | - | |
| 320 | -# 查询分类热门 | |
| 321 | -redis-cli GET "interest:hot:category_level2:200" | |
| 322 | - | |
| 323 | -# 查询供应商商品 | |
| 324 | -redis-cli GET "interest:hot:supplier:10001" | |
| 325 | - | |
| 326 | -# 模糊查询所有热门索引 | |
| 327 | -redis-cli KEYS "interest:hot:*" | |
| 328 | - | |
| 329 | -# 查看某个分类的所有类型 | |
| 330 | -redis-cli KEYS "interest:*:category_level2:200" | |
| 331 | -``` | |
| 332 | - | |
| 333 | ---- | |
| 334 | - | |
| 335 | -## 📝 注意事项 | |
| 336 | - | |
| 337 | -1. **索引命名规范**:严格遵循 `type:subtype:dimension:value` 格式 | |
| 338 | -2. **值的格式**:`item_id1:score1,item_id2:score2,...` | |
| 339 | -3. **过期时间**:建议设置7天过期 | |
| 340 | -4. **更新频率**:建议每天更新一次 | |
| 341 | -5. **查询优先级**: | |
| 342 | - - 优先使用细粒度索引(如四级分类) | |
| 343 | - - 粗粒度索引作为后备(如一级分类) | |
| 344 | - - 融合多个索引结果 | |
| 345 | - | |
| 346 | ---- | |
| 347 | - | |
| 348 | -**版本**: v1.1 | |
| 349 | -**生成日期**: 2025-10-16 | |
| 350 | -**索引总数**: 约10000-50000条 |
offline_tasks/doc/DATABASE_SETUP.md deleted
| ... | ... | @@ -1,179 +0,0 @@ |
| 1 | -# 数据库字段配置说明 | |
| 2 | - | |
| 3 | -## 问题说明 | |
| 4 | - | |
| 5 | -如果运行时遇到类似 `Unknown column 'xxx'` 的错误,说明数据库表结构与代码中使用的字段名不匹配。 | |
| 6 | - | |
| 7 | -## 已适配的基础字段 | |
| 8 | - | |
| 9 | -当前代码已经适配了以下基础字段(参考 `item_sim.py`): | |
| 10 | - | |
| 11 | -### sensors_events 表 | |
| 12 | -- `anonymous_id` - 用户ID | |
| 13 | -- `item_id` - 商品ID | |
| 14 | -- `event` - 事件类型 | |
| 15 | -- `create_time` - 创建时间 | |
| 16 | -- `platform` - 平台(可选) | |
| 17 | -- `country` - 国家(可选) | |
| 18 | -- `customer_type` - 客户类型(可选) | |
| 19 | - | |
| 20 | -### prd_goods_sku 表 | |
| 21 | -- `id` - 商品ID | |
| 22 | -- `name` - 商品名称 | |
| 23 | -- `create_time` - 创建时间(用于判断新品) | |
| 24 | - | |
| 25 | -## 可选字段配置 | |
| 26 | - | |
| 27 | -如果您的数据库表包含以下字段,可以在SQL查询中添加它们以支持更多维度: | |
| 28 | - | |
| 29 | -### 分类字段(可选) | |
| 30 | -- `category_level1_id` - 一级分类ID | |
| 31 | -- `category_level2_id` - 二级分类ID | |
| 32 | -- `category_level3_id` - 三级分类ID | |
| 33 | - | |
| 34 | -## 如何添加分类字段支持 | |
| 35 | - | |
| 36 | -如果您的数据库有分类字段,可以按以下步骤启用: | |
| 37 | - | |
| 38 | -### 步骤1: 修改 SQL 查询 | |
| 39 | - | |
| 40 | -编辑 `scripts/interest_aggregation.py`,找到 SQL 查询部分,添加分类字段: | |
| 41 | - | |
| 42 | -```python | |
| 43 | -sql_query = f""" | |
| 44 | -SELECT | |
| 45 | - se.anonymous_id AS user_id, | |
| 46 | - se.item_id, | |
| 47 | - se.event AS event_type, | |
| 48 | - se.create_time, | |
| 49 | - pgs.name AS item_name, | |
| 50 | - pgs.create_time AS item_create_time, | |
| 51 | - pgs.category_level2_id, # 添加这一行 | |
| 52 | - pgs.category_level3_id, # 添加这一行 | |
| 53 | - se.platform, | |
| 54 | - se.country, | |
| 55 | - se.customer_type | |
| 56 | -FROM | |
| 57 | - sensors_events se | |
| 58 | -LEFT JOIN prd_goods_sku pgs ON se.item_id = pgs.id | |
| 59 | -... | |
| 60 | -""" | |
| 61 | -``` | |
| 62 | - | |
| 63 | -### 步骤2: 修改聚合逻辑 | |
| 64 | - | |
| 65 | -在 `aggregate_by_dimensions` 函数中,字段检查已经做好了,如果字段存在会自动使用: | |
| 66 | - | |
| 67 | -```python | |
| 68 | -# 维度4: 二级分类 (category_level2) - 如果字段存在 | |
| 69 | -if 'category_level2_id' in row and pd.notna(row.get('category_level2_id')): | |
| 70 | - key = f"category_level2:{row['category_level2_id']}" | |
| 71 | - aggregations[key][item_id] += weight | |
| 72 | -``` | |
| 73 | - | |
| 74 | -这段代码会自动检测字段是否存在,如果存在就使用,不存在就跳过。 | |
| 75 | - | |
| 76 | -## 查看实际表结构 | |
| 77 | - | |
| 78 | -运行以下命令查看您的数据库表结构: | |
| 79 | - | |
| 80 | -```python | |
| 81 | -# 创建一个简单的脚本查看表结构 | |
| 82 | -import pandas as pd | |
| 83 | -from db_service import create_db_connection | |
| 84 | -from offline_tasks.config.offline_config import DB_CONFIG | |
| 85 | - | |
| 86 | -engine = create_db_connection( | |
| 87 | - DB_CONFIG['host'], | |
| 88 | - DB_CONFIG['port'], | |
| 89 | - DB_CONFIG['database'], | |
| 90 | - DB_CONFIG['username'], | |
| 91 | - DB_CONFIG['password'] | |
| 92 | -) | |
| 93 | - | |
| 94 | -# 查看 prd_goods_sku 表结构 | |
| 95 | -df = pd.read_sql("SELECT * FROM prd_goods_sku LIMIT 1", engine) | |
| 96 | -print("prd_goods_sku 字段列表:") | |
| 97 | -for col in df.columns: | |
| 98 | - print(f" - {col}") | |
| 99 | - | |
| 100 | -# 查看 sensors_events 表结构 | |
| 101 | -df = pd.read_sql("SELECT * FROM sensors_events LIMIT 1", engine) | |
| 102 | -print("\nsensors_events 字段列表:") | |
| 103 | -for col in df.columns: | |
| 104 | - print(f" - {col}") | |
| 105 | -``` | |
| 106 | - | |
| 107 | -## 常见字段名映射 | |
| 108 | - | |
| 109 | -如果您的数据库使用不同的字段名,需要在SQL查询中做映射: | |
| 110 | - | |
| 111 | -| 代码中的字段 | 可能的实际字段名 | 修改方式 | | |
| 112 | -|-------------|----------------|---------| | |
| 113 | -| `category_level2_id` | `cat2_id`, `category2`, `second_category` | `pgs.cat2_id AS category_level2_id` | | |
| 114 | -| `category_level3_id` | `cat3_id`, `category3`, `third_category` | `pgs.cat3_id AS category_level3_id` | | |
| 115 | -| `anonymous_id` | `user_id`, `uid`, `visitor_id` | `se.user_id AS anonymous_id` | | |
| 116 | -| `customer_type` | `client_type`, `buyer_type` | `se.client_type AS customer_type` | | |
| 117 | - | |
| 118 | -## 完整示例 | |
| 119 | - | |
| 120 | -假设您的表结构是: | |
| 121 | -- `prd_goods_sku` 有字段:`id`, `title`, `cat2`, `cat3`, `add_time` | |
| 122 | -- `sensors_events` 有字段:`uid`, `goods_id`, `action`, `time` | |
| 123 | - | |
| 124 | -则需要修改SQL为: | |
| 125 | - | |
| 126 | -```python | |
| 127 | -sql_query = f""" | |
| 128 | -SELECT | |
| 129 | - se.uid AS user_id, | |
| 130 | - se.goods_id AS item_id, | |
| 131 | - se.action AS event_type, | |
| 132 | - se.time AS create_time, | |
| 133 | - pgs.title AS item_name, | |
| 134 | - pgs.add_time AS item_create_time, | |
| 135 | - pgs.cat2 AS category_level2_id, | |
| 136 | - pgs.cat3 AS category_level3_id | |
| 137 | -FROM | |
| 138 | - sensors_events se | |
| 139 | -LEFT JOIN prd_goods_sku pgs ON se.goods_id = pgs.id | |
| 140 | -... | |
| 141 | -""" | |
| 142 | -``` | |
| 143 | - | |
| 144 | -## 最小化配置 | |
| 145 | - | |
| 146 | -如果只想先测试基本功能,可以只使用最基础的字段: | |
| 147 | - | |
| 148 | -### i2i 算法只需要: | |
| 149 | -- `anonymous_id` / `user_id` | |
| 150 | -- `item_id` | |
| 151 | -- `event` / `event_type` | |
| 152 | -- `create_time` | |
| 153 | -- `name` (商品名称) | |
| 154 | - | |
| 155 | -### 兴趣点聚合至少需要: | |
| 156 | -- 以上i2i的字段 | |
| 157 | -- 至少一个维度字段(如 `platform` 或 `country`) | |
| 158 | - | |
| 159 | -## 测试连接 | |
| 160 | - | |
| 161 | -修改后,运行测试脚本验证: | |
| 162 | - | |
| 163 | -```bash | |
| 164 | -cd /home/tw/recommendation/offline_tasks | |
| 165 | -python3 test_connection.py | |
| 166 | -``` | |
| 167 | - | |
| 168 | -## 获取帮助 | |
| 169 | - | |
| 170 | -如果仍有问题,请: | |
| 171 | -1. 查看日志文件:`logs/run_all_*.log` | |
| 172 | -2. 运行单个脚本测试,便于调试 | |
| 173 | -3. 使用 `--help` 参数查看命令行选项 | |
| 174 | - | |
| 175 | -```bash | |
| 176 | -python3 scripts/i2i_swing.py --help | |
| 177 | -python3 scripts/interest_aggregation.py --help | |
| 178 | -``` | |
| 179 | - |
offline_tasks/doc/DEBUG_GUIDE.md deleted
| ... | ... | @@ -1,332 +0,0 @@ |
| 1 | -# Debug模式使用指南 | |
| 2 | - | |
| 3 | -## 🐛 Debug功能概述 | |
| 4 | - | |
| 5 | -Debug模式为所有离线任务提供: | |
| 6 | -1. **详细的DEBUG级别日志** - 显示数据流向、统计信息、处理进度 | |
| 7 | -2. **明文索引文件** - ID后面带上对应的名称,方便检查效果 | |
| 8 | -3. **数据采样展示** - 关键步骤的示例数据 | |
| 9 | -4. **性能统计** - 每个步骤的耗时和资源使用 | |
| 10 | - | |
| 11 | -## 🚀 快速开始 | |
| 12 | - | |
| 13 | -### 1. 运行单个脚本(Debug模式) | |
| 14 | - | |
| 15 | -```bash | |
| 16 | -cd /home/tw/recommendation/offline_tasks | |
| 17 | - | |
| 18 | -# Swing算法 - Debug模式 | |
| 19 | -python3 scripts/i2i_swing.py --lookback_days 7 --top_n 10 --debug | |
| 20 | - | |
| 21 | -# 兴趣聚合 - Debug模式 | |
| 22 | -python3 scripts/interest_aggregation.py --lookback_days 7 --top_n 100 --debug | |
| 23 | - | |
| 24 | -# 内容相似 - Debug模式 | |
| 25 | -python3 scripts/i2i_content_similar.py --top_n 10 --debug | |
| 26 | -``` | |
| 27 | - | |
| 28 | -### 2. 运行所有任务(Debug模式) | |
| 29 | - | |
| 30 | -```bash | |
| 31 | -# 使用debug参数运行所有任务 | |
| 32 | -python3 run_all.py --lookback_days 7 --top_n 10 --debug | |
| 33 | -``` | |
| 34 | - | |
| 35 | -## 📊 Debug输出说明 | |
| 36 | - | |
| 37 | -### A. 日志输出 | |
| 38 | - | |
| 39 | -Debug模式下,日志会输出到两个地方: | |
| 40 | -1. **控制台** - 实时查看进度 | |
| 41 | -2. **Debug日志文件** - 完整保存 | |
| 42 | - | |
| 43 | -日志文件位置: | |
| 44 | -``` | |
| 45 | -offline_tasks/logs/debug/i2i_swing_20251016_193000.log | |
| 46 | -offline_tasks/logs/debug/interest_aggregation_20251016_193500.log | |
| 47 | -... | |
| 48 | -``` | |
| 49 | - | |
| 50 | -### B. 日志内容示例 | |
| 51 | - | |
| 52 | -``` | |
| 53 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - ============================================================ | |
| 54 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - 算法参数: | |
| 55 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - ============================================================ | |
| 56 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - alpha: 0.5 | |
| 57 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - top_n: 10 | |
| 58 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - lookback_days: 7 | |
| 59 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - debug: True | |
| 60 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - ============================================================ | |
| 61 | - | |
| 62 | -2025-10-16 19:30:05 - i2i_swing - INFO - 获取到 15234 条记录 | |
| 63 | - | |
| 64 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - ============================================================ | |
| 65 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 用户行为数据 信息: | |
| 66 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - ============================================================ | |
| 67 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 总行数: 15234 | |
| 68 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 总列数: 5 | |
| 69 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 列名: ['user_id', 'item_id', 'event_type', 'create_time', 'item_name'] | |
| 70 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - | |
| 71 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 数据类型: | |
| 72 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - user_id: object | |
| 73 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - item_id: int64 | |
| 74 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - event_type: object | |
| 75 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - create_time: datetime64[ns] | |
| 76 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - item_name: object | |
| 77 | - | |
| 78 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 行为类型分布: | |
| 79 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - addToCart: 8520 (55.93%) | |
| 80 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - contactFactory: 3456 (22.68%) | |
| 81 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - purchase: 2134 (14.01%) | |
| 82 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - addToPool: 1124 (7.38%) | |
| 83 | - | |
| 84 | -2025-10-16 19:30:10 - i2i_swing - INFO - 总用户数: 3456, 总商品数: 2345 | |
| 85 | -2025-10-16 19:30:15 - i2i_swing - DEBUG - 已处理 50/2345 个商品 (2.1%) | |
| 86 | -2025-10-16 19:30:20 - i2i_swing - DEBUG - 已处理 100/2345 个商品 (4.3%) | |
| 87 | -... | |
| 88 | -``` | |
| 89 | - | |
| 90 | -### C. 明文索引文件 | |
| 91 | - | |
| 92 | -Debug模式下,每个索引文件都会生成对应的明文文件: | |
| 93 | - | |
| 94 | -**原始索引文件** (`output/i2i_swing_20251016.txt`): | |
| 95 | -``` | |
| 96 | -12345 香蕉干 67890:0.8567,11223:0.7234,44556:0.6891 | |
| 97 | -67890 芒果干 12345:0.8567,22334:0.7123,55667:0.6543 | |
| 98 | -``` | |
| 99 | - | |
| 100 | -**明文索引文件** (`output/debug/i2i_swing_20251016_readable.txt`): | |
| 101 | -``` | |
| 102 | -================================================================================ | |
| 103 | -明文索引文件 | |
| 104 | -生成时间: 2025-10-16 19:35:00 | |
| 105 | -描述: Swing算法 i2i相似度推荐 (alpha=0.5, lookback_days=7) | |
| 106 | -总索引数: 2345 | |
| 107 | -================================================================================ | |
| 108 | - | |
| 109 | -[1] i2i:swing:12345(香蕉干) | |
| 110 | --------------------------------------------------------------------------------- | |
| 111 | - 1. ID:67890(芒果干) - Score:0.8567 | |
| 112 | - 2. ID:11223(菠萝干) - Score:0.7234 | |
| 113 | - 3. ID:44556(苹果干) - Score:0.6891 | |
| 114 | - 4. ID:22334(木瓜干) - Score:0.6234 | |
| 115 | - 5. ID:55667(草莓干) - Score:0.5891 | |
| 116 | - | |
| 117 | -[2] i2i:swing:67890(芒果干) | |
| 118 | --------------------------------------------------------------------------------- | |
| 119 | - 1. ID:12345(香蕉干) - Score:0.8567 | |
| 120 | - 2. ID:22334(木瓜干) - Score:0.7123 | |
| 121 | - 3. ID:55667(草莓干) - Score:0.6543 | |
| 122 | - 4. ID:11223(菠萝干) - Score:0.6234 | |
| 123 | - 5. ID:44556(苹果干) - Score:0.5891 | |
| 124 | - | |
| 125 | -... | |
| 126 | - | |
| 127 | -================================================================================ | |
| 128 | -已输出 50/2345 个索引 | |
| 129 | -================================================================================ | |
| 130 | -``` | |
| 131 | - | |
| 132 | -## 📁 文件结构 | |
| 133 | - | |
| 134 | -Debug模式下的文件组织: | |
| 135 | - | |
| 136 | -``` | |
| 137 | -offline_tasks/ | |
| 138 | -├── output/ | |
| 139 | -│ ├── i2i_swing_20251016.txt # 原始索引文件 | |
| 140 | -│ ├── interest_aggregation_hot_20251016.txt | |
| 141 | -│ └── debug/ # Debug明文文件目录 | |
| 142 | -│ ├── i2i_swing_20251016_readable.txt # 明文索引 | |
| 143 | -│ ├── interest_aggregation_hot_20251016_readable.txt | |
| 144 | -│ └── ... | |
| 145 | -└── logs/ | |
| 146 | - ├── run_all_20251016.log # 主日志 | |
| 147 | - └── debug/ # Debug详细日志目录 | |
| 148 | - ├── i2i_swing_20251016_193000.log | |
| 149 | - ├── interest_aggregation_20251016_193500.log | |
| 150 | - └── ... | |
| 151 | -``` | |
| 152 | - | |
| 153 | -## 🔍 使用场景 | |
| 154 | - | |
| 155 | -### 场景1:调试数据流程 | |
| 156 | - | |
| 157 | -```bash | |
| 158 | -# 使用小数据量+debug模式快速验证 | |
| 159 | -python3 scripts/i2i_swing.py --lookback_days 1 --top_n 5 --debug | |
| 160 | - | |
| 161 | -# 查看日志,检查: | |
| 162 | -# - 数据加载是否正确 | |
| 163 | -# - 行为类型分布是否合理 | |
| 164 | -# - 用户/商品数量是否符合预期 | |
| 165 | -``` | |
| 166 | - | |
| 167 | -### 场景2:检查推荐效果 | |
| 168 | - | |
| 169 | -```bash | |
| 170 | -# 生成明文索引文件 | |
| 171 | -python3 scripts/i2i_swing.py --lookback_days 7 --top_n 20 --debug | |
| 172 | - | |
| 173 | -# 打开明文文件查看: | |
| 174 | -cat output/debug/i2i_swing_20251016_readable.txt | less | |
| 175 | - | |
| 176 | -# 检查推荐是否合理,例如: | |
| 177 | -# - 香蕉干 -> 芒果干、菠萝干 ✓ 合理 | |
| 178 | -# - 电脑 -> 香蕉干 ✗ 不合理,需要调整参数 | |
| 179 | -``` | |
| 180 | - | |
| 181 | -### 场景3:性能调优 | |
| 182 | - | |
| 183 | -```bash | |
| 184 | -# Debug模式查看各步骤耗时 | |
| 185 | -python3 scripts/i2i_swing.py --debug 2>&1 | grep "耗时" | |
| 186 | - | |
| 187 | -# 输出示例: | |
| 188 | -# 步骤1耗时: 2.34秒 | |
| 189 | -# 步骤2耗时: 15.67秒 <- 瓶颈在这里 | |
| 190 | -# 步骤3耗时: 1.23秒 | |
| 191 | -# 总耗时: 19.24秒 | |
| 192 | -``` | |
| 193 | - | |
| 194 | -### 场景4:参数调整 | |
| 195 | - | |
| 196 | -```bash | |
| 197 | -# 测试不同alpha值的效果 | |
| 198 | -python3 scripts/i2i_swing.py --alpha 0.3 --debug > alpha_0.3.log 2>&1 | |
| 199 | -python3 scripts/i2i_swing.py --alpha 0.5 --debug > alpha_0.5.log 2>&1 | |
| 200 | -python3 scripts/i2i_swing.py --alpha 0.7 --debug > alpha_0.7.log 2>&1 | |
| 201 | - | |
| 202 | -# 对比明文文件,选择最佳参数 | |
| 203 | -diff output/debug/i2i_swing_*_readable.txt | |
| 204 | -``` | |
| 205 | - | |
| 206 | -## 💡 最佳实践 | |
| 207 | - | |
| 208 | -### 1. 开发调试阶段 | |
| 209 | - | |
| 210 | -```bash | |
| 211 | -# 使用小数据量 + Debug模式 | |
| 212 | -python3 run_all.py --lookback_days 3 --top_n 10 --debug | |
| 213 | -``` | |
| 214 | - | |
| 215 | -- ✅ 快速验证流程 | |
| 216 | -- ✅ 详细日志便于排错 | |
| 217 | -- ✅ 明文文件检查效果 | |
| 218 | - | |
| 219 | -### 2. 参数调优阶段 | |
| 220 | - | |
| 221 | -```bash | |
| 222 | -# 中等数据量 + Debug模式 | |
| 223 | -python3 scripts/i2i_swing.py --lookback_days 30 --top_n 50 --debug | |
| 224 | -``` | |
| 225 | - | |
| 226 | -- ✅ 查看数据分布 | |
| 227 | -- ✅ 评估推荐质量 | |
| 228 | -- ✅ 调整算法参数 | |
| 229 | - | |
| 230 | -### 3. 生产运行阶段 | |
| 231 | - | |
| 232 | -```bash | |
| 233 | -# 大数据量 + 正常模式(不加--debug) | |
| 234 | -python3 run_all.py --lookback_days 730 --top_n 50 | |
| 235 | -``` | |
| 236 | - | |
| 237 | -- ✅ 高效运行 | |
| 238 | -- ✅ 只输出必要日志 | |
| 239 | -- ✅ 节省磁盘空间 | |
| 240 | - | |
| 241 | -## 🛠️ Debug工具 | |
| 242 | - | |
| 243 | -### 查看实时日志 | |
| 244 | - | |
| 245 | -```bash | |
| 246 | -# 实时查看debug日志 | |
| 247 | -tail -f logs/debug/i2i_swing_*.log | |
| 248 | - | |
| 249 | -# 只看DEBUG级别 | |
| 250 | -tail -f logs/debug/i2i_swing_*.log | grep "DEBUG" | |
| 251 | - | |
| 252 | -# 只看错误 | |
| 253 | -tail -f logs/debug/i2i_swing_*.log | grep "ERROR" | |
| 254 | -``` | |
| 255 | - | |
| 256 | -### 统计分析 | |
| 257 | - | |
| 258 | -```bash | |
| 259 | -# 统计处理的数据量 | |
| 260 | -grep "总行数" logs/debug/*.log | |
| 261 | - | |
| 262 | -# 统计生成的索引数 | |
| 263 | -grep "总索引数" output/debug/*_readable.txt | |
| 264 | - | |
| 265 | -# 查看性能统计 | |
| 266 | -grep "耗时" logs/debug/*.log | |
| 267 | -``` | |
| 268 | - | |
| 269 | -### 快速检查 | |
| 270 | - | |
| 271 | -```bash | |
| 272 | -# 检查前10个推荐 | |
| 273 | -head -50 output/debug/i2i_swing_*_readable.txt | |
| 274 | - | |
| 275 | -# 搜索特定商品的推荐 | |
| 276 | -grep "香蕉干" output/debug/i2i_swing_*_readable.txt -A 10 | |
| 277 | - | |
| 278 | -# 统计推荐数量分布 | |
| 279 | -grep "Score:" output/debug/i2i_swing_*_readable.txt | wc -l | |
| 280 | -``` | |
| 281 | - | |
| 282 | -## ⚠️ 注意事项 | |
| 283 | - | |
| 284 | -1. **磁盘空间** | |
| 285 | - - Debug日志和明文文件会占用较多空间 | |
| 286 | - - 建议定期清理:`rm -rf logs/debug/* output/debug/*` | |
| 287 | - | |
| 288 | -2. **运行时间** | |
| 289 | - - Debug模式会增加10-20%的运行时间 | |
| 290 | - - 生产环境建议关闭debug | |
| 291 | - | |
| 292 | -3. **敏感信息** | |
| 293 | - - 明文文件包含商品名称等信息 | |
| 294 | - - 注意数据安全和隐私保护 | |
| 295 | - | |
| 296 | -4. **文件编码** | |
| 297 | - - 明文文件使用UTF-8编码 | |
| 298 | - - 确保查看工具支持中文显示 | |
| 299 | - | |
| 300 | -## 📖 相关命令 | |
| 301 | - | |
| 302 | -```bash | |
| 303 | -# 查看帮助 | |
| 304 | -python3 scripts/i2i_swing.py --help | |
| 305 | -python3 run_all.py --help | |
| 306 | - | |
| 307 | -# 验证配置 | |
| 308 | -python3 -c "from config.offline_config import DEBUG_CONFIG; print(DEBUG_CONFIG)" | |
| 309 | - | |
| 310 | -# 测试debug工具 | |
| 311 | -python3 -c "from scripts.debug_utils import *; print('Debug utils loaded OK')" | |
| 312 | -``` | |
| 313 | - | |
| 314 | -## ✅ 验证Debug功能 | |
| 315 | - | |
| 316 | -```bash | |
| 317 | -# 快速测试 | |
| 318 | -cd /home/tw/recommendation/offline_tasks | |
| 319 | -python3 scripts/i2i_swing.py --lookback_days 1 --top_n 5 --debug | |
| 320 | - | |
| 321 | -# 应该看到: | |
| 322 | -# ✓ DEBUG级别日志输出 | |
| 323 | -# ✓ 创建debug日志文件 | |
| 324 | -# ✓ 生成明文索引文件 | |
| 325 | -# ✓ 显示数据统计信息 | |
| 326 | -``` | |
| 327 | - | |
| 328 | ---- | |
| 329 | - | |
| 330 | -**Debug模式**: 开发和调试的利器 | |
| 331 | -**正常模式**: 生产环境的选择 | |
| 332 | -**灵活切换**: 一个参数的事情 |
offline_tasks/doc/OFFLINE_INDEX_SPEC.md deleted
| ... | ... | @@ -1,197 +0,0 @@ |
| 1 | -# 离线索引产出规范 | |
| 2 | - | |
| 3 | -## 📋 索引任务列表 | |
| 4 | - | |
| 5 | -| 模块名称 | 任务命令 | 调度频次 | 输出数据 | 格式和示例 | | |
| 6 | -|---------|---------|---------|---------|-----------| | |
| 7 | -| **i2i_swing** | `python3 scripts/i2i_swing.py` | 每天 | `output/i2i_swing_YYYYMMDD.txt` | `item_id \t item_name \t similar_id1:score1,similar_id2:score2,...` | | |
| 8 | -| **i2i_session_w2v** | `python3 scripts/i2i_session_w2v.py` | 每天 | `output/i2i_session_w2v_YYYYMMDD.txt` | `item_id \t item_name \t similar_id1:score1,similar_id2:score2,...` | | |
| 9 | -| **i2i_deepwalk** | `python3 scripts/i2i_deepwalk.py` | 每天 | `output/i2i_deepwalk_YYYYMMDD.txt` | `item_id \t item_name \t similar_id1:score1,similar_id2:score2,...` | | |
| 10 | -| **i2i_content** | `python3 scripts/i2i_content_similar.py` | 每周 | `output/i2i_content_hybrid_YYYYMMDD.txt` | `item_id \t item_name \t similar_id1:score1,similar_id2:score2,...` | | |
| 11 | -| **interest_hot** | `python3 scripts/interest_aggregation.py` | 每天 | `output/interest_aggregation_hot_YYYYMMDD.txt` | `dimension_key \t item_id1,item_id2,item_id3,...` | | |
| 12 | -| **interest_cart** | `python3 scripts/interest_aggregation.py` | 每天 | `output/interest_aggregation_cart_YYYYMMDD.txt` | `dimension_key \t item_id1,item_id2,item_id3,...` | | |
| 13 | -| **interest_new** | `python3 scripts/interest_aggregation.py` | 每天 | `output/interest_aggregation_new_YYYYMMDD.txt` | `dimension_key \t item_id1,item_id2,item_id3,...` | | |
| 14 | -| **interest_global** | `python3 scripts/interest_aggregation.py` | 每天 | `output/interest_aggregation_global_YYYYMMDD.txt` | `dimension_key \t item_id1,item_id2,item_id3,...` | | |
| 15 | - | |
| 16 | -## 📊 详细格式说明 | |
| 17 | - | |
| 18 | -### 1. i2i相似度索引 | |
| 19 | - | |
| 20 | -#### 输出格式 | |
| 21 | -``` | |
| 22 | -item_id \t item_name \t similar_id1:score1,similar_id2:score2,... | |
| 23 | -``` | |
| 24 | - | |
| 25 | -#### 示例 | |
| 26 | -``` | |
| 27 | -12345 香蕉干 67890:0.8567,11223:0.7234,44556:0.6891 | |
| 28 | -67890 芒果干 12345:0.8567,22334:0.7123,55667:0.6543 | |
| 29 | -``` | |
| 30 | - | |
| 31 | -#### 字段说明 | |
| 32 | -- `item_id`: 商品SKU ID | |
| 33 | -- `item_name`: 商品名称 | |
| 34 | -- `similar_id`: 相似商品ID | |
| 35 | -- `score`: 相似度分数(0-1之间,越大越相似) | |
| 36 | - | |
| 37 | -#### 算法差异 | |
| 38 | -| 算法 | 特点 | 适用场景 | | |
| 39 | -|------|------|---------| | |
| 40 | -| **Swing** | 基于用户共同行为,发现购买关联 | 详情页"大家都在看" | | |
| 41 | -| **Session W2V** | 基于会话序列,捕捉浏览顺序 | 详情页"看了又看" | | |
| 42 | -| **DeepWalk** | 基于图结构,发现深层关系 | 详情页"相关推荐" | | |
| 43 | -| **Content** | 基于商品属性,类目相似 | 冷启动商品推荐 | | |
| 44 | - | |
| 45 | -### 2. 兴趣点聚合索引 | |
| 46 | - | |
| 47 | -#### 输出格式 | |
| 48 | -``` | |
| 49 | -dimension_key \t item_id1,item_id2,item_id3,... | |
| 50 | -``` | |
| 51 | - | |
| 52 | -#### 示例 | |
| 53 | -``` | |
| 54 | -platform:pc 12345,67890,11223,44556,22334 | |
| 55 | -category_level2:200 67890,12345,22334,55667,11223 | |
| 56 | -platform_category2:pc_200 12345,67890,22334,11223,55667 | |
| 57 | -supplier:10001 12345,44556,22334,67890,11223 | |
| 58 | -``` | |
| 59 | - | |
| 60 | -#### 维度说明 | |
| 61 | - | |
| 62 | -**单维度(7个)** | |
| 63 | -- `platform:{platform_id}` - 业务平台(pc, h5, app等) | |
| 64 | -- `client_platform:{client}` - 客户端平台(iOS, Android, Web等) | |
| 65 | -- `supplier:{supplier_id}` - 供应商 | |
| 66 | -- `category_level1:{cat_id}` - 一级分类 | |
| 67 | -- `category_level2:{cat_id}` - 二级分类 | |
| 68 | -- `category_level3:{cat_id}` - 三级分类 | |
| 69 | -- `category_level4:{cat_id}` - 四级分类 | |
| 70 | - | |
| 71 | -**组合维度(4个)** | |
| 72 | -- `platform_client:{platform}_{client}` - 平台+客户端 | |
| 73 | -- `platform_category2:{platform}_{cat_id}` - 平台+二级分类 | |
| 74 | -- `platform_category3:{platform}_{cat_id}` - 平台+三级分类 | |
| 75 | -- `client_category2:{client}_{cat_id}` - 客户端+二级分类 | |
| 76 | - | |
| 77 | -#### 列表类型说明 | |
| 78 | - | |
| 79 | -| 类型 | 文件名 | 计算逻辑 | 适用场景 | | |
| 80 | -|------|--------|---------|---------| | |
| 81 | -| **hot** | `interest_aggregation_hot_YYYYMMDD.txt` | 最近N天的高频交互商品 | 首页"热门推荐" | | |
| 82 | -| **cart** | `interest_aggregation_cart_YYYYMMDD.txt` | 高加购率商品 | 首页"热门加购" | | |
| 83 | -| **new** | `interest_aggregation_new_YYYYMMDD.txt` | 最近上架的新品 | 首页"新品推荐" | | |
| 84 | -| **global** | `interest_aggregation_global_YYYYMMDD.txt` | 全局热门商品 | 首页"猜你喜欢" | | |
| 85 | - | |
| 86 | -## 🔄 调度建议 | |
| 87 | - | |
| 88 | -### 每日调度(数据量大,变化快) | |
| 89 | -```bash | |
| 90 | -# 每天凌晨3点执行 | |
| 91 | -0 3 * * * cd /home/tw/recommendation/offline_tasks && python3 run_all.py --lookback_days 730 --top_n 50 | |
| 92 | -``` | |
| 93 | - | |
| 94 | -### 每周调度(数据量小,变化慢) | |
| 95 | -```bash | |
| 96 | -# 每周日凌晨4点执行 | |
| 97 | -0 4 * * 0 cd /home/tw/recommendation/offline_tasks && python3 scripts/i2i_content_similar.py --top_n 50 | |
| 98 | -``` | |
| 99 | - | |
| 100 | -## 📁 文件命名规范 | |
| 101 | - | |
| 102 | -### 标准格式 | |
| 103 | -``` | |
| 104 | -{algorithm_name}_{date}.txt | |
| 105 | -``` | |
| 106 | - | |
| 107 | -### 示例 | |
| 108 | -``` | |
| 109 | -i2i_swing_20251016.txt | |
| 110 | -i2i_session_w2v_20251016.txt | |
| 111 | -interest_aggregation_hot_20251016.txt | |
| 112 | -``` | |
| 113 | - | |
| 114 | -### Debug文件(开发调试用) | |
| 115 | -``` | |
| 116 | -output/debug/{algorithm_name}_{date}_readable.txt | |
| 117 | -logs/debug/{algorithm_name}_{date}_{time}.log | |
| 118 | -``` | |
| 119 | - | |
| 120 | -## 📈 数据量估算 | |
| 121 | - | |
| 122 | -| 索引类型 | 索引数量 | 单条大小 | 总大小 | 更新频率 | | |
| 123 | -|---------|---------|---------|--------|---------| | |
| 124 | -| i2i_swing | ~50,000 | ~500B | ~25MB | 每天 | | |
| 125 | -| i2i_session_w2v | ~50,000 | ~500B | ~25MB | 每天 | | |
| 126 | -| i2i_deepwalk | ~50,000 | ~500B | ~25MB | 每天 | | |
| 127 | -| i2i_content | ~50,000 | ~500B | ~25MB | 每周 | | |
| 128 | -| interest_hot | ~10,000 | ~1KB | ~10MB | 每天 | | |
| 129 | -| interest_cart | ~10,000 | ~1KB | ~10MB | 每天 | | |
| 130 | -| interest_new | ~5,000 | ~1KB | ~5MB | 每天 | | |
| 131 | -| interest_global | ~10,000 | ~1KB | ~10MB | 每天 | | |
| 132 | -| **总计** | **~245,000** | - | **~135MB** | - | | |
| 133 | - | |
| 134 | -## 🎯 质量检查 | |
| 135 | - | |
| 136 | -### 数据完整性检查 | |
| 137 | -```bash | |
| 138 | -# 检查文件是否生成 | |
| 139 | -ls -lh output/*_$(date +%Y%m%d).txt | |
| 140 | - | |
| 141 | -# 检查行数 | |
| 142 | -wc -l output/*_$(date +%Y%m%d).txt | |
| 143 | - | |
| 144 | -# 检查格式 | |
| 145 | -head -5 output/i2i_swing_$(date +%Y%m%d).txt | |
| 146 | -``` | |
| 147 | - | |
| 148 | -### 数据质量指标 | |
| 149 | - | |
| 150 | -**i2i索引质量** | |
| 151 | -- 覆盖率:有推荐的商品数 / 总商品数 > 80% | |
| 152 | -- 推荐数量:每个商品推荐10-50个相似商品 | |
| 153 | -- 分数范围:相似度分数在0.01-1.0之间 | |
| 154 | - | |
| 155 | -**兴趣聚合质量** | |
| 156 | -- 覆盖率:有数据的维度数 / 总维度数 > 60% | |
| 157 | -- 推荐数量:每个维度推荐50-1000个商品 | |
| 158 | -- 商品去重:同一商品在列表中只出现一次 | |
| 159 | - | |
| 160 | -## 🔍 查询示例 | |
| 161 | - | |
| 162 | -### 查看特定商品的相似推荐 | |
| 163 | -```bash | |
| 164 | -# 查看商品12345的相似商品 | |
| 165 | -grep "^12345\t" output/i2i_swing_20251016.txt | |
| 166 | -``` | |
| 167 | - | |
| 168 | -### 查看特定维度的热门商品 | |
| 169 | -```bash | |
| 170 | -# 查看PC平台的热门商品 | |
| 171 | -grep "^platform:pc\t" output/interest_aggregation_hot_20251016.txt | |
| 172 | -``` | |
| 173 | - | |
| 174 | -### 统计索引数量 | |
| 175 | -```bash | |
| 176 | -# 统计各类型索引数量 | |
| 177 | -for file in output/*_20251016.txt; do | |
| 178 | - echo "$file: $(wc -l < $file) 条" | |
| 179 | -done | |
| 180 | -``` | |
| 181 | - | |
| 182 | -## ⚠️ 注意事项 | |
| 183 | - | |
| 184 | -1. **文件编码**: 所有文件使用UTF-8编码 | |
| 185 | -2. **分隔符**: 使用Tab(\t)分隔字段 | |
| 186 | -3. **商品ID**: 使用数字类型,不带引号 | |
| 187 | -4. **分数精度**: 相似度分数保留4位小数 | |
| 188 | -5. **排序规则**: 相似商品按分数降序排列 | |
| 189 | -6. **去重**: 确保推荐列表中没有重复商品 | |
| 190 | -7. **有效性**: 推荐的商品必须是在售状态 | |
| 191 | - | |
| 192 | -## 🔗 相关文档 | |
| 193 | - | |
| 194 | -- **Redis数据规范**: `REDIS_DATA_SPEC.md` | |
| 195 | -- **API接口文档**: `RECOMMENDATION_API.md` | |
| 196 | -- **Debug指南**: `DEBUG_GUIDE.md` | |
| 197 | -- **配置说明**: `UPDATE_CONFIG_GUIDE.md` |
offline_tasks/doc/README.md
| 1 | 1 | # 推荐系统离线任务文档中心 |
| 2 | 2 | |
| 3 | -本目录包含推荐系统所有重要文档。 | |
| 3 | +本目录包含推荐系统离线任务的核心文档。 | |
| 4 | 4 | |
| 5 | -## 📚 文档目录 | |
| 5 | +--- | |
| 6 | 6 | |
| 7 | -### 快速开始 | |
| 7 | +## 📚 核心文档 | |
| 8 | 8 | |
| 9 | -- **[从这里开始.md](./从这里开始.md)** - 新手入门指南,了解项目结构和基本概念 | |
| 10 | -- **[快速开始.md](./快速开始.md)** - 快速运行离线任务的步骤 | |
| 11 | -- **[Swing快速开始.md](../collaboration/Swing快速开始.md)** - C++ Swing算法快速使用指南 | |
| 9 | +### 1. 详细设计文档 | |
| 12 | 10 | |
| 13 | -### 使用指南 | |
| 11 | +**文件**: [详细设计文档.md](./详细设计文档.md) | |
| 14 | 12 | |
| 15 | -- **[Swing算法使用指南.md](./Swing算法使用指南.md)** - 详细的Swing算法使用文档 | |
| 16 | -- **[运行脚本指南.md](./运行脚本指南.md)** - 所有离线任务脚本的使用说明 | |
| 17 | -- **[调试指南.md](./调试指南.md)** - Debug模式和日志使用说明 | |
| 13 | +**内容**: | |
| 14 | +- 项目概述和系统架构 | |
| 15 | +- 功能模块详解(i2i相似度、兴趣聚合) | |
| 16 | +- 使用指南和参数配置 | |
| 17 | +- 业务场景应用示例 | |
| 18 | +- 故障排查和性能优化 | |
| 18 | 19 | |
| 19 | -### 数据规范 | |
| 20 | +**适用对象**: 开发人员、产品经理、新人入门 | |
| 20 | 21 | |
| 21 | -- **[离线索引数据规范.md](./离线索引数据规范.md)** - 所有离线索引的格式和说明 | |
| 22 | -- **[Redis数据规范.md](./Redis数据规范.md)** - Redis中数据的key格式和结构 | |
| 23 | -- **[完整索引列表.md](./完整索引列表.md)** - 系统中所有索引的完整清单 | |
| 22 | +--- | |
| 24 | 23 | |
| 25 | -### 配置说明 | |
| 24 | +### 2. 离线索引数据规范 | |
| 26 | 25 | |
| 27 | -- **[数据库配置说明.md](./数据库配置说明.md)** - 数据库连接和表结构说明 | |
| 28 | -- **配置文件**: `../config/offline_config.py` - 所有可配置参数 | |
| 26 | +**文件**: [离线索引数据规范.md](./离线索引数据规范.md) | |
| 29 | 27 | |
| 30 | -### 实现总结 | |
| 28 | +**内容**: | |
| 29 | +- 索引任务列表和调度频次 | |
| 30 | +- 输出文件格式详细说明 | |
| 31 | +- i2i索引规范(C++ Swing、Python Swing、W2V、DeepWalk、Content) | |
| 32 | +- 兴趣聚合索引规范(维度、列表类型) | |
| 33 | +- 文件命名规范和数据质量检查 | |
| 31 | 34 | |
| 32 | -- **[Swing实现总结.md](./Swing实现总结.md)** - C++ Swing集成实现的完整说明 | |
| 33 | -- **[系统改进总结-20241017.md](./系统改进总结-20241017.md)** - 2024-10-17系统改进汇总 | |
| 34 | -- **[项目重构说明-20241017.md](./项目重构说明-20241017.md)** - 目录结构和执行脚本重构详解 🆕 | |
| 35 | +**适用对象**: 开发人员、数据工程师、运维人员 | |
| 35 | 36 | |
| 36 | -### 维护文档 | |
| 37 | +--- | |
| 37 | 38 | |
| 38 | -- **[故障排查指南.md](./故障排查指南.md)** - 常见问题和解决方案 | |
| 39 | -- **[更新日志.md](./更新日志.md)** - 系统更新历史 | |
| 39 | +### 3. Redis数据规范 | |
| 40 | 40 | |
| 41 | -## 📂 相关文档 | |
| 41 | +**文件**: [Redis数据规范.md](./Redis数据规范.md) | |
| 42 | 42 | |
| 43 | -### 其他模块文档 | |
| 43 | +**内容**: | |
| 44 | +- Redis Key命名规范 | |
| 45 | +- 数据灌入规范表 | |
| 46 | +- i2i索引和兴趣聚合索引的存储格式 | |
| 47 | +- 数据加载流程和示例代码 | |
| 48 | +- 查询示例和监控指标 | |
| 44 | 49 | |
| 45 | -- **Collaboration模块**: `../collaboration/README.md` - C++ 协同过滤算法 | |
| 46 | -- **GraphEmbedding模块**: | |
| 47 | - - Session W2V: `../graphembedding/session_w2v/README.md` | |
| 48 | - - DeepWalk: `../graphembedding/deepwalk/README.md` | |
| 49 | -- **Hot模块**: `../hot/README.md` - 热门商品推荐 | |
| 50 | +**适用对象**: 后端开发人员、运维人员 | |
| 50 | 51 | |
| 51 | -### 项目README | |
| 52 | +--- | |
| 52 | 53 | |
| 53 | -- **项目根目录**: `../../README.md` - 项目总览 | |
| 54 | -- **离线任务**: `../README.md` - 离线任务模块说明 | |
| 54 | +## 🎯 快速导航 | |
| 55 | 55 | |
| 56 | -## 🎯 文档使用建议 | |
| 56 | +### 我是新用户 | |
| 57 | +1. 先阅读 **[详细设计文档.md](./详细设计文档.md)** 了解整体架构 | |
| 58 | +2. 参考文档中的"快速开始"部分运行系统 | |
| 59 | +3. 遇到问题查看"故障排查"章节 | |
| 57 | 60 | |
| 58 | -### 新用户 | |
| 61 | +### 我是开发人员 | |
| 62 | +1. 查看 **[详细设计文档.md](./详细设计文档.md)** 的"功能模块详解" | |
| 63 | +2. 参考 **[离线索引数据规范.md](./离线索引数据规范.md)** 了解数据格式 | |
| 64 | +3. 开发在线接口时参考 **[Redis数据规范.md](./Redis数据规范.md)** | |
| 59 | 65 | |
| 60 | -1. 先阅读 **[从这里开始.md](./从这里开始.md)** 了解整体架构 | |
| 61 | -2. 然后看 **[快速开始.md](./快速开始.md)** 快速运行系统 | |
| 62 | -3. 需要时查阅具体的使用指南和数据规范 | |
| 66 | +### 我是运维人员 | |
| 67 | +1. 查看 **[详细设计文档.md](./详细设计文档.md)** 的"定时任务设置" | |
| 68 | +2. 参考 **[Redis数据规范.md](./Redis数据规范.md)** 进行数据加载 | |
| 69 | +3. 遇到问题查看"故障排查"和日志文件 | |
| 63 | 70 | |
| 64 | -### 开发人员 | |
| 71 | +--- | |
| 65 | 72 | |
| 66 | -1. 查看 **[运行脚本指南.md](./运行脚本指南.md)** 了解所有脚本 | |
| 67 | -2. 参考 **[调试指南.md](./调试指南.md)** 进行调试 | |
| 68 | -3. 遵循 **数据规范** 文档进行开发 | |
| 73 | +## 📂 其他资源 | |
| 69 | 74 | |
| 70 | -### 运维人员 | |
| 75 | +### 配置文件 | |
| 76 | +- **离线任务配置**: `../config/offline_config.py` | |
| 77 | +- **主执行脚本**: `../run.sh` | |
| 71 | 78 | |
| 72 | -1. 配置前先看 **[数据库配置说明.md](./数据库配置说明.md)** | |
| 73 | -2. 遇到问题查看 **[故障排查指南.md](./故障排查指南.md)** | |
| 74 | -3. 了解 **[Redis数据规范.md](./Redis数据规范.md)** 便于维护 | |
| 79 | +### 相关模块文档 | |
| 80 | +- **Collaboration模块** (C++ Swing): `../collaboration/README.md` | |
| 81 | +- **GraphEmbedding模块**: `../graphembedding/*/README.md` | |
| 82 | +- **Hot模块**: `../hot/README.md` | |
| 75 | 83 | |
| 76 | -## 📝 文档更新 | |
| 84 | +### 项目README | |
| 85 | +- **项目总览**: `../../README.md` | |
| 86 | +- **离线任务模块**: `../README.md` | |
| 77 | 87 | |
| 78 | -所有文档由项目维护者更新。如有疑问或发现错误,请联系团队。 | |
| 88 | +--- | |
| 79 | 89 | |
| 80 | -**最后更新**: 2024-10-17 | |
| 90 | +## 🔄 文档更新记录 | |
| 91 | + | |
| 92 | +- **2024-10-17**: 整合文档,简化为3个核心文档 | |
| 93 | +- **2024-10-16**: 初始版本,包含完整功能文档 | |
| 94 | + | |
| 95 | +--- | |
| 81 | 96 | |
| 97 | +## 📝 文档维护 | |
| 98 | + | |
| 99 | +所有文档由推荐系统团队维护。 | |
| 100 | + | |
| 101 | +如有疑问、发现错误或建议改进,请联系团队。 | |
| 102 | + | |
| 103 | +**最后更新**: 2024-10-17 | ... | ... |
offline_tasks/doc/RUN_SCRIPT_GUIDE.md deleted
| ... | ... | @@ -1,304 +0,0 @@ |
| 1 | -# run.sh 运行脚本使用指南 | |
| 2 | - | |
| 3 | -## 概述 | |
| 4 | - | |
| 5 | -`run.sh` 是一个自动化运行脚本,集成了内存监控功能,确保离线任务安全高效运行。 | |
| 6 | - | |
| 7 | -## 主要特性 | |
| 8 | - | |
| 9 | -### 1. 内存监控 | |
| 10 | -- **警告阈值**: 25GB - 打印警告日志 | |
| 11 | -- **强制终止阈值**: 30GB - 自动kill进程 | |
| 12 | -- **检查频率**: 每10秒检查一次 | |
| 13 | -- **日志文件**: `logs/memory_monitor.log` | |
| 14 | - | |
| 15 | -### 2. 任务流程 | |
| 16 | -1. 清理旧进程和输出 | |
| 17 | -2. 运行调试模式(小数据量测试) | |
| 18 | -3. 运行生产模式(大数据量) | |
| 19 | -4. 加载索引到Redis | |
| 20 | - | |
| 21 | -### 3. 错误处理 | |
| 22 | -- 任何步骤失败会立即退出 | |
| 23 | -- 显示详细的退出码 | |
| 24 | -- 保存完整日志 | |
| 25 | - | |
| 26 | -## 使用方法 | |
| 27 | - | |
| 28 | -### 基本运行 | |
| 29 | -```bash | |
| 30 | -cd /home/tw/recommendation/offline_tasks | |
| 31 | -./run.sh | |
| 32 | -``` | |
| 33 | - | |
| 34 | -### 查看实时输出 | |
| 35 | -```bash | |
| 36 | -./run.sh | tee logs/run_$(date +%Y%m%d_%H%M%S).log | |
| 37 | -``` | |
| 38 | - | |
| 39 | -### 后台运行 | |
| 40 | -```bash | |
| 41 | -nohup ./run.sh > logs/run_$(date +%Y%m%d_%H%M%S).log 2>&1 & | |
| 42 | -``` | |
| 43 | - | |
| 44 | -## 内存监控说明 | |
| 45 | - | |
| 46 | -### 监控逻辑 | |
| 47 | - | |
| 48 | -```bash | |
| 49 | -check_memory() { | |
| 50 | - local pid=$1 | |
| 51 | - local threshold_warn=25 # 25GB警告 | |
| 52 | - local threshold_kill=30 # 30GB强制kill | |
| 53 | - | |
| 54 | - while 进程运行中; do | |
| 55 | - 获取内存使用 | |
| 56 | - | |
| 57 | - if 内存 >= 30GB: | |
| 58 | - 打印错误日志 | |
| 59 | - 强制终止进程 | |
| 60 | - break | |
| 61 | - elif 内存 >= 25GB: | |
| 62 | - 打印警告日志 | |
| 63 | - | |
| 64 | - sleep 10秒 | |
| 65 | - done | |
| 66 | -} | |
| 67 | -``` | |
| 68 | - | |
| 69 | -### 日志格式 | |
| 70 | - | |
| 71 | -**警告日志**: | |
| 72 | -``` | |
| 73 | -[2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12345 | |
| 74 | -``` | |
| 75 | - | |
| 76 | -**强制终止日志**: | |
| 77 | -``` | |
| 78 | -[2025-10-17 14:35:30] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12345 | |
| 79 | -``` | |
| 80 | - | |
| 81 | -### 查看监控日志 | |
| 82 | -```bash | |
| 83 | -# 实时查看 | |
| 84 | -tail -f logs/memory_monitor.log | |
| 85 | - | |
| 86 | -# 查看历史 | |
| 87 | -cat logs/memory_monitor.log | |
| 88 | -``` | |
| 89 | - | |
| 90 | -## 运行流程 | |
| 91 | - | |
| 92 | -### 步骤1: 调试模式 | |
| 93 | -```bash | |
| 94 | -python3 run_all.py --debug | |
| 95 | -``` | |
| 96 | -- 使用默认参数(见 `offline_config.py`) | |
| 97 | -- 输出保存到 `output_debug/` | |
| 98 | -- 启动内存监控 | |
| 99 | - | |
| 100 | -### 步骤2: 生产模式 | |
| 101 | -```bash | |
| 102 | -python3 run_all.py --debug | |
| 103 | -``` | |
| 104 | -- 生成完整索引 | |
| 105 | -- 输出保存到 `output/` | |
| 106 | -- 启动内存监控 | |
| 107 | - | |
| 108 | -### 步骤3: 加载Redis | |
| 109 | -```bash | |
| 110 | -python3 scripts/load_index_to_redis.py --redis-host localhost | |
| 111 | -``` | |
| 112 | -- 加载所有生成的索引 | |
| 113 | -- 包括新增的内容相似索引 | |
| 114 | - | |
| 115 | -## 输出示例 | |
| 116 | - | |
| 117 | -``` | |
| 118 | -====================================================================== | |
| 119 | -开始运行离线任务 - 2025-10-17 14:00:00 | |
| 120 | -内存监控: 警告阈值=25GB, 强制终止阈值=30GB | |
| 121 | -====================================================================== | |
| 122 | - | |
| 123 | ->>> 步骤1: 调试模式运行(小数据量) | |
| 124 | -调试任务 PID: 12345 | |
| 125 | -✓ 调试模式完成 | |
| 126 | - | |
| 127 | ->>> 步骤2: 生产模式运行(大数据量) | |
| 128 | -生产任务 PID: 12346 | |
| 129 | -[2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12346 | |
| 130 | -✓ 生产模式完成 | |
| 131 | - | |
| 132 | ->>> 步骤3: 加载到Redis | |
| 133 | -✓ Redis加载完成 | |
| 134 | - | |
| 135 | -====================================================================== | |
| 136 | -所有任务完成 - 2025-10-17 16:30:00 | |
| 137 | -====================================================================== | |
| 138 | -``` | |
| 139 | - | |
| 140 | -## 自定义配置 | |
| 141 | - | |
| 142 | -### 修改内存阈值 | |
| 143 | - | |
| 144 | -编辑 `run.sh` 中的以下行: | |
| 145 | -```bash | |
| 146 | -local threshold_warn=25 # 修改警告阈值 | |
| 147 | -local threshold_kill=30 # 修改强制kill阈值 | |
| 148 | -``` | |
| 149 | - | |
| 150 | -### 修改检查频率 | |
| 151 | - | |
| 152 | -编辑 `run.sh` 中的以下行: | |
| 153 | -```bash | |
| 154 | -sleep 10 # 修改为其他秒数 | |
| 155 | -``` | |
| 156 | - | |
| 157 | -### 跳过调试模式 | |
| 158 | - | |
| 159 | -注释掉步骤1相关代码: | |
| 160 | -```bash | |
| 161 | -# # 3. 调试模式运行(小数据量) | |
| 162 | -# echo "" | |
| 163 | -# echo ">>> 步骤1: 调试模式运行(小数据量)" | |
| 164 | -# python3 run_all.py --debug & | |
| 165 | -# ... | |
| 166 | -``` | |
| 167 | - | |
| 168 | -### 修改Redis配置 | |
| 169 | - | |
| 170 | -修改步骤3的参数: | |
| 171 | -```bash | |
| 172 | -python3 scripts/load_index_to_redis.py \ | |
| 173 | - --redis-host your-redis-host \ | |
| 174 | - --redis-port 6379 \ | |
| 175 | - --redis-db 0 | |
| 176 | -``` | |
| 177 | - | |
| 178 | -## 故障排查 | |
| 179 | - | |
| 180 | -### 内存持续超限 | |
| 181 | - | |
| 182 | -**原因**: | |
| 183 | -- 数据量太大 | |
| 184 | -- 内存泄漏 | |
| 185 | -- 并发任务过多 | |
| 186 | - | |
| 187 | -**解决方案**: | |
| 188 | -1. 增加内存阈值(临时方案) | |
| 189 | -2. 优化代码减少内存占用 | |
| 190 | -3. 分批处理数据 | |
| 191 | -4. 使用增量更新 | |
| 192 | - | |
| 193 | -### 进程被意外终止 | |
| 194 | - | |
| 195 | -**检查日志**: | |
| 196 | -```bash | |
| 197 | -# 查看监控日志 | |
| 198 | -cat logs/memory_monitor.log | |
| 199 | - | |
| 200 | -# 查看任务日志 | |
| 201 | -ls -lht logs/ | |
| 202 | -cat logs/run_all_*.log | |
| 203 | -``` | |
| 204 | - | |
| 205 | -### 任务失败 | |
| 206 | - | |
| 207 | -**查看退出码**: | |
| 208 | -- 0: 成功 | |
| 209 | -- 1: 一般错误 | |
| 210 | -- 137: 被kill信号终止(可能是内存超限) | |
| 211 | -- 其他: 查看具体错误信息 | |
| 212 | - | |
| 213 | -## 监控建议 | |
| 214 | - | |
| 215 | -### 1. 添加系统监控 | |
| 216 | -```bash | |
| 217 | -# 安装监控工具 | |
| 218 | -apt install htop iotop | |
| 219 | - | |
| 220 | -# 实时监控 | |
| 221 | -htop -p $(pgrep -f run_all.py) | |
| 222 | -``` | |
| 223 | - | |
| 224 | -### 2. 设置告警 | |
| 225 | -```bash | |
| 226 | -# 配置邮件告警 | |
| 227 | -if [ $PROD_EXIT_CODE -ne 0 ]; then | |
| 228 | - echo "任务失败" | mail -s "离线任务告警" admin@example.com | |
| 229 | -fi | |
| 230 | -``` | |
| 231 | - | |
| 232 | -### 3. 定时任务 | |
| 233 | -```bash | |
| 234 | -# 添加到crontab | |
| 235 | -0 2 * * * /home/tw/recommendation/offline_tasks/run.sh >> /var/log/offline_tasks.log 2>&1 | |
| 236 | -``` | |
| 237 | - | |
| 238 | -## 性能优化 | |
| 239 | - | |
| 240 | -### 内存优化建议 | |
| 241 | - | |
| 242 | -1. **分批处理** | |
| 243 | - ```python | |
| 244 | - # 在代码中使用batch处理 | |
| 245 | - batch_size = 1000 | |
| 246 | - for i in range(0, len(items), batch_size): | |
| 247 | - batch = items[i:i+batch_size] | |
| 248 | - process(batch) | |
| 249 | - ``` | |
| 250 | - | |
| 251 | -2. **及时释放** | |
| 252 | - ```python | |
| 253 | - import gc | |
| 254 | - del large_object | |
| 255 | - gc.collect() | |
| 256 | - ``` | |
| 257 | - | |
| 258 | -3. **使用生成器** | |
| 259 | - ```python | |
| 260 | - def process_items(): | |
| 261 | - for item in items: | |
| 262 | - yield process(item) | |
| 263 | - ``` | |
| 264 | - | |
| 265 | -## 日志管理 | |
| 266 | - | |
| 267 | -### 日志文件 | |
| 268 | -- `logs/memory_monitor.log` - 内存监控日志 | |
| 269 | -- `logs/run_all_YYYYMMDD.log` - 任务运行日志 | |
| 270 | -- `output/` - 生成的索引文件 | |
| 271 | -- `output_debug/` - 调试模式输出 | |
| 272 | - | |
| 273 | -### 清理旧日志 | |
| 274 | -```bash | |
| 275 | -# 保留最近7天 | |
| 276 | -find logs/ -name "*.log" -mtime +7 -delete | |
| 277 | - | |
| 278 | -# 压缩旧日志 | |
| 279 | -find logs/ -name "*.log" -mtime +3 -exec gzip {} \; | |
| 280 | -``` | |
| 281 | - | |
| 282 | -## 安全注意事项 | |
| 283 | - | |
| 284 | -1. **权限**: 确保脚本有执行权限 `chmod +x run.sh` | |
| 285 | -2. **路径**: 使用绝对路径避免混淆 | |
| 286 | -3. **清理**: 脚本会清理旧进程,确保没有重要进程被误杀 | |
| 287 | -4. **备份**: 脚本会删除output目录,请提前备份重要数据 | |
| 288 | - | |
| 289 | -## 总结 | |
| 290 | - | |
| 291 | -`run.sh` 提供了: | |
| 292 | -- ✅ 自动化运行流程 | |
| 293 | -- ✅ 内存监控保护 | |
| 294 | -- ✅ 详细日志记录 | |
| 295 | -- ✅ 错误处理机制 | |
| 296 | -- ✅ 进度显示 | |
| 297 | - | |
| 298 | -建议在生产环境使用前先在测试环境验证。 | |
| 299 | - | |
| 300 | ---- | |
| 301 | - | |
| 302 | -**更新时间**: 2025-10-17 | |
| 303 | -**版本**: v2.0 | |
| 304 | - |
offline_tasks/doc/SWING_USAGE.md deleted
| ... | ... | @@ -1,322 +0,0 @@ |
| 1 | -# Swing算法使用指南 | |
| 2 | - | |
| 3 | -本文档介绍如何使用C++版本的Swing算法进行物品相似度计算。 | |
| 4 | - | |
| 5 | -## 目录结构 | |
| 6 | - | |
| 7 | -``` | |
| 8 | -recommendation/ | |
| 9 | -├── offline_tasks/ | |
| 10 | -│ ├── scripts/ | |
| 11 | -│ │ ├── generate_session.py # 生成用户session文件 | |
| 12 | -│ │ └── add_names_to_swing.py # 给结果添加商品名称 | |
| 13 | -│ └── output/ | |
| 14 | -│ └── session.txt.YYYYMMDD # 生成的session文件 | |
| 15 | -└── collaboration/ | |
| 16 | - ├── run.sh # Swing算法执行脚本 | |
| 17 | - ├── src/ | |
| 18 | - │ ├── swing.cc # Swing算法实现 | |
| 19 | - │ └── ucf.py # 用户协同过滤 | |
| 20 | - └── output_YYYYMMDD/ | |
| 21 | - ├── swing_similar.txt # Swing结果(ID格式) | |
| 22 | - └── swing_similar_readable.txt # Swing结果(带商品名) | |
| 23 | -``` | |
| 24 | - | |
| 25 | -## 使用流程 | |
| 26 | - | |
| 27 | -### 步骤1: 生成Session文件 | |
| 28 | - | |
| 29 | -首先需要从数据库提取用户行为数据,生成session文件。 | |
| 30 | - | |
| 31 | -```bash | |
| 32 | -cd /home/tw/recommendation/offline_tasks | |
| 33 | - | |
| 34 | -# 基本用法(使用默认参数:730天数据) | |
| 35 | -python3 scripts/generate_session.py | |
| 36 | - | |
| 37 | -# 指定回看天数 | |
| 38 | -python3 scripts/generate_session.py --lookback_days 365 | |
| 39 | - | |
| 40 | -# 启用debug模式查看详细信息 | |
| 41 | -python3 scripts/generate_session.py --lookback_days 730 --debug | |
| 42 | - | |
| 43 | -# 指定输出文件路径 | |
| 44 | -python3 scripts/generate_session.py --output output/session.txt.20241017 | |
| 45 | - | |
| 46 | -# 选择输出格式 | |
| 47 | -python3 scripts/generate_session.py --format both # 同时生成两种格式(默认) | |
| 48 | -python3 scripts/generate_session.py --format standard # uid \t json 格式 | |
| 49 | -python3 scripts/generate_session.py --format cpp # 纯json格式(.cpp后缀) | |
| 50 | -``` | |
| 51 | - | |
| 52 | -**输出文件格式:** | |
| 53 | - | |
| 54 | -- `session.txt.YYYYMMDD` - 标准格式(包含uid): | |
| 55 | - ``` | |
| 56 | - uid1 \t {"item_id1":10.0,"item_id2":5.0,"item_id3":3.0} | |
| 57 | - uid2 \t {"item_id4":15.0,"item_id5":8.0} | |
| 58 | - ``` | |
| 59 | - | |
| 60 | -- `session.txt.YYYYMMDD.cpp` - C++格式(纯json): | |
| 61 | - ``` | |
| 62 | - {"item_id1":10.0,"item_id2":5.0,"item_id3":3.0} | |
| 63 | - {"item_id4":15.0,"item_id5":8.0} | |
| 64 | - ``` | |
| 65 | - | |
| 66 | -**行为权重配置:** | |
| 67 | -- `purchase`: 10.0(购买) | |
| 68 | -- `contactFactory`: 5.0(联系厂家) | |
| 69 | -- `addToCart`: 3.0(加入购物车) | |
| 70 | -- `addToPool`: 2.0(加入询价池) | |
| 71 | - | |
| 72 | -### 步骤2: 运行Swing算法 | |
| 73 | - | |
| 74 | -session文件生成后,运行C++版本的Swing算法。 | |
| 75 | - | |
| 76 | -```bash | |
| 77 | -cd /home/tw/recommendation/collaboration | |
| 78 | - | |
| 79 | -# 直接运行(使用默认配置) | |
| 80 | -bash run.sh | |
| 81 | - | |
| 82 | -# 或者给脚本添加执行权限后运行 | |
| 83 | -chmod +x run.sh | |
| 84 | -./run.sh | |
| 85 | -``` | |
| 86 | - | |
| 87 | -**配置说明(修改run.sh中的参数):** | |
| 88 | - | |
| 89 | -```bash | |
| 90 | -# 数据路径配置 | |
| 91 | -SESSION_DATA_DIR="../offline_tasks/output" # session文件目录 | |
| 92 | - | |
| 93 | -# Swing算法参数 | |
| 94 | -ALPHA=0.7 # Swing算法的alpha参数(越小越关注用户共同行为) | |
| 95 | -THRESHOLD1=1 # 交互强度阈值1(用于筛选用户行为) | |
| 96 | -THRESHOLD2=3 # 交互强度阈值2(用于计算相似度) | |
| 97 | -THREAD_NUM=4 # 线程数(根据CPU核心数调整) | |
| 98 | -SHOW_PROGRESS=1 # 是否显示进度 (0/1) | |
| 99 | - | |
| 100 | -# Python环境 | |
| 101 | -PYTHON_CMD="python3" # 如需使用特定Python环境,修改此处 | |
| 102 | -``` | |
| 103 | - | |
| 104 | -**脚本执行流程:** | |
| 105 | - | |
| 106 | -1. 编译C++程序(swing, icf_simple, swing_symmetric) | |
| 107 | -2. 查找当天日期的session文件 | |
| 108 | -3. 运行Swing算法计算物品相似度 | |
| 109 | -4. 合并多线程输出结果 | |
| 110 | -5. 自动调用debug脚本生成可读版本 | |
| 111 | - | |
| 112 | -### 步骤3: 查看结果 | |
| 113 | - | |
| 114 | -运行完成后,结果文件位于 `collaboration/output_YYYYMMDD/` 目录: | |
| 115 | - | |
| 116 | -**1. swing_similar.txt** - 原始结果(ID格式) | |
| 117 | -``` | |
| 118 | -12345 \t 67890:0.8523,23456:0.7234,34567:0.6891 | |
| 119 | -``` | |
| 120 | -格式:`item_id \t similar_item_id1:score1,similar_item_id2:score2,...` | |
| 121 | - | |
| 122 | -**2. swing_similar_readable.txt** - 可读结果(带商品名) | |
| 123 | -``` | |
| 124 | -12345:iPhone 15 Pro \t 67890:iPhone 15:0.8523,23456:iPhone 14 Pro:0.7234 | |
| 125 | -``` | |
| 126 | -格式:`item_id:item_name \t similar_item_id1:name1:score1,similar_item_id2:name2:score2,...` | |
| 127 | - | |
| 128 | -### 步骤4: 单独生成Debug文件(可选) | |
| 129 | - | |
| 130 | -如果需要为其他文件生成可读版本: | |
| 131 | - | |
| 132 | -```bash | |
| 133 | -cd /home/tw/recommendation/offline_tasks | |
| 134 | - | |
| 135 | -# 基本用法 | |
| 136 | -python3 scripts/add_names_to_swing.py collaboration/output/swing_similar.txt | |
| 137 | - | |
| 138 | -# 指定输出文件 | |
| 139 | -python3 scripts/add_names_to_swing.py \ | |
| 140 | - collaboration/output/swing_similar.txt \ | |
| 141 | - collaboration/output/my_readable.txt | |
| 142 | - | |
| 143 | -# 启用debug模式 | |
| 144 | -python3 scripts/add_names_to_swing.py \ | |
| 145 | - collaboration/output/swing_similar.txt \ | |
| 146 | - --debug | |
| 147 | -``` | |
| 148 | - | |
| 149 | -## 参数调优建议 | |
| 150 | - | |
| 151 | -### Swing算法参数 | |
| 152 | - | |
| 153 | -1. **alpha (0.5-1.0)** | |
| 154 | - - 越小:越关注用户共同行为的多样性 | |
| 155 | - - 越大:越容忽略用户重叠度 | |
| 156 | - - 建议:0.5-0.7(B2B场景) | |
| 157 | - | |
| 158 | -2. **threshold1 (1-5)** | |
| 159 | - - 用于筛选用户的有效行为 | |
| 160 | - - 建议:1-3(低频场景可用1) | |
| 161 | - | |
| 162 | -3. **threshold2 (1-10)** | |
| 163 | - - 用于计算相似度的行为强度阈值 | |
| 164 | - - 建议:3-5(需要较强的交互信号) | |
| 165 | - | |
| 166 | -4. **thread_num (1-20)** | |
| 167 | - - 根据CPU核心数设置 | |
| 168 | - - 建议:4-8(普通服务器) | |
| 169 | - | |
| 170 | -### 数据范围参数 | |
| 171 | - | |
| 172 | -1. **lookback_days** | |
| 173 | - - B2B低频场景:建议730天(2年) | |
| 174 | - - B2C高频场景:建议30-90天 | |
| 175 | - - 数据量大时可适当减少 | |
| 176 | - | |
| 177 | -## 完整示例 | |
| 178 | - | |
| 179 | -```bash | |
| 180 | -# 1. 生成session文件(730天数据) | |
| 181 | -cd /home/tw/recommendation/offline_tasks | |
| 182 | -python3 scripts/generate_session.py --lookback_days 730 --debug | |
| 183 | - | |
| 184 | -# 2. 检查生成的文件 | |
| 185 | -ls -lh output/session.txt.* | |
| 186 | -# 应该看到: | |
| 187 | -# session.txt.20241017 | |
| 188 | -# session.txt.20241017.cpp | |
| 189 | - | |
| 190 | -# 3. 运行Swing算法 | |
| 191 | -cd /home/tw/recommendation/collaboration | |
| 192 | -bash run.sh | |
| 193 | - | |
| 194 | -# 4. 查看结果 | |
| 195 | -ls -lh output/swing_similar* | |
| 196 | -cat output/swing_similar_readable.txt | head -20 | |
| 197 | -``` | |
| 198 | - | |
| 199 | -## 故障排查 | |
| 200 | - | |
| 201 | -### 问题1: Session文件不存在 | |
| 202 | - | |
| 203 | -``` | |
| 204 | -错误: Session文件不存在: ../offline_tasks/output/session.txt.20241017.cpp | |
| 205 | -``` | |
| 206 | - | |
| 207 | -**解决方法:** | |
| 208 | -```bash | |
| 209 | -cd /home/tw/recommendation/offline_tasks | |
| 210 | -python3 scripts/generate_session.py | |
| 211 | -``` | |
| 212 | - | |
| 213 | -### 问题2: 编译失败 | |
| 214 | - | |
| 215 | -``` | |
| 216 | -编译失败,退出 | |
| 217 | -``` | |
| 218 | - | |
| 219 | -**解决方法:** | |
| 220 | -```bash | |
| 221 | -cd /home/tw/recommendation/collaboration | |
| 222 | -# 检查编译器 | |
| 223 | -g++ --version | |
| 224 | - | |
| 225 | -# 手动编译 | |
| 226 | -make clean | |
| 227 | -make | |
| 228 | - | |
| 229 | -# 检查依赖 | |
| 230 | -ls include/ | |
| 231 | -ls utils/ | |
| 232 | -``` | |
| 233 | - | |
| 234 | -### 问题3: 数据库连接失败 | |
| 235 | - | |
| 236 | -``` | |
| 237 | -获取数据失败: Connection refused | |
| 238 | -``` | |
| 239 | - | |
| 240 | -**解决方法:** | |
| 241 | -- 检查数据库配置:`offline_tasks/config/offline_config.py` | |
| 242 | -- 测试连接:`python3 offline_tasks/test_connection.py` | |
| 243 | -- 确认网络和防火墙设置 | |
| 244 | - | |
| 245 | -### 问题4: 结果为空 | |
| 246 | - | |
| 247 | -**可能原因:** | |
| 248 | -- threshold1/threshold2设置过高,过滤掉了所有数据 | |
| 249 | -- 数据量太少,用户和商品交集不足 | |
| 250 | - | |
| 251 | -**解决方法:** | |
| 252 | -- 降低threshold参数(如threshold1=0.5, threshold2=1) | |
| 253 | -- 增加lookback_days | |
| 254 | -- 检查数据量:`wc -l output/session.txt.*` | |
| 255 | - | |
| 256 | -## 性能优化 | |
| 257 | - | |
| 258 | -### 大数据量场景 | |
| 259 | - | |
| 260 | -如果数据量很大(>100万用户,>10万商品): | |
| 261 | - | |
| 262 | -1. **增加线程数** | |
| 263 | - ```bash | |
| 264 | - THREAD_NUM=8 # 或更多 | |
| 265 | - ``` | |
| 266 | - | |
| 267 | -2. **分批处理** | |
| 268 | - - 可以将session文件按用户分片 | |
| 269 | - - 分别运行Swing算法 | |
| 270 | - - 最后合并结果 | |
| 271 | - | |
| 272 | -3. **调整max_session_list_len** | |
| 273 | - - 修改 `src/swing.cc` 中的 `max_session_list_len` | |
| 274 | - - 限制每个用户的最大行为数 | |
| 275 | - | |
| 276 | -### 内存优化 | |
| 277 | - | |
| 278 | -如果遇到内存不足: | |
| 279 | - | |
| 280 | -1. 减少 `max_sim_list_len`(默认300) | |
| 281 | -2. 减少 `max_session_list_len`(默认100) | |
| 282 | -3. 分批处理数据 | |
| 283 | - | |
| 284 | -## 集成到定时任务 | |
| 285 | - | |
| 286 | -```bash | |
| 287 | -# 添加到crontab | |
| 288 | -crontab -e | |
| 289 | - | |
| 290 | -# 每天凌晨2点运行 | |
| 291 | -0 2 * * * cd /home/tw/recommendation/offline_tasks && python3 scripts/generate_session.py && cd ../collaboration && bash run.sh >> logs/swing_$(date +\%Y\%m\%d).log 2>&1 | |
| 292 | -``` | |
| 293 | - | |
| 294 | -## 相关文档 | |
| 295 | - | |
| 296 | -- [Swing算法原理](./collaboration/README.md) | |
| 297 | -- [离线任务配置](./offline_tasks/config/offline_config.py) | |
| 298 | -- [Debug工具使用](./offline_tasks/scripts/debug_utils.py) | |
| 299 | - | |
| 300 | -## 常见问题 | |
| 301 | - | |
| 302 | -**Q: session文件格式选择哪个?** | |
| 303 | -A: run.sh会自动检测格式。建议使用 `--format both` 生成两种格式。 | |
| 304 | - | |
| 305 | -**Q: Swing算法运行多久?** | |
| 306 | -A: 取决于数据量和线程数。通常: | |
| 307 | -- 1万商品:1-5分钟 | |
| 308 | -- 10万商品:10-30分钟 | |
| 309 | -- 数据量大时建议使用多线程 | |
| 310 | - | |
| 311 | -**Q: 如何调整相似商品数量?** | |
| 312 | -A: 修改 `src/swing.cc` 中的 `max_sim_list_len` 参数(默认300)。 | |
| 313 | - | |
| 314 | -**Q: 能否使用Python版本的Swing?** | |
| 315 | -A: 可以,使用 `offline_tasks/scripts/i2i_swing.py`。但C++版本性能更好。 | |
| 316 | - | |
| 317 | -## 联系支持 | |
| 318 | - | |
| 319 | -如有问题,请参考: | |
| 320 | -- 项目README: `/home/tw/recommendation/README.md` | |
| 321 | -- 故障排查: `/home/tw/recommendation/offline_tasks/TROUBLESHOOTING.md` | |
| 322 | - |
offline_tasks/doc/Swing实现总结.md deleted
| ... | ... | @@ -1,375 +0,0 @@ |
| 1 | -# Swing算法实现总结 | |
| 2 | - | |
| 3 | -## 完成的任务 | |
| 4 | - | |
| 5 | -本次实现完成了以下功能: | |
| 6 | - | |
| 7 | -### 1. Session生成脚本 ✓ | |
| 8 | - | |
| 9 | -**文件**: `offline_tasks/scripts/generate_session.py` | |
| 10 | - | |
| 11 | -**功能**: | |
| 12 | -- 从数据库提取用户行为数据 | |
| 13 | -- 聚合用户session(按商品维度累加权重) | |
| 14 | -- 支持两种输出格式: | |
| 15 | - - 标准格式:`uid \t {"item_id":score,...}` | |
| 16 | - - C++格式:`{"item_id":score,...}` (每行一个用户) | |
| 17 | - | |
| 18 | -**主要参数**: | |
| 19 | -- `--lookback_days`: 回看天数(默认730天) | |
| 20 | -- `--format`: 输出格式(standard/cpp/both) | |
| 21 | -- `--output`: 输出文件路径 | |
| 22 | -- `--debug`: 启用debug模式 | |
| 23 | - | |
| 24 | -**使用示例**: | |
| 25 | -```bash | |
| 26 | -cd /home/tw/recommendation/offline_tasks | |
| 27 | -python3 scripts/generate_session.py --lookback_days 730 --format both | |
| 28 | -``` | |
| 29 | - | |
| 30 | -### 2. Swing运行脚本 ✓ | |
| 31 | - | |
| 32 | -**文件**: `collaboration/run.sh` | |
| 33 | - | |
| 34 | -**改进内容**: | |
| 35 | -- ✓ 适配新的数据路径(`../offline_tasks/output/`) | |
| 36 | -- ✓ 自动检测session文件格式(带uid或纯json) | |
| 37 | -- ✓ 增加配置区域,便于修改参数 | |
| 38 | -- ✓ 添加错误检查和友好的输出信息 | |
| 39 | -- ✓ 自动调用debug脚本生成可读文件 | |
| 40 | -- ✓ 支持自定义Python环境 | |
| 41 | - | |
| 42 | -**配置项**: | |
| 43 | -```bash | |
| 44 | -SESSION_DATA_DIR="../offline_tasks/output" # session文件目录 | |
| 45 | -ALPHA=0.7 # Swing alpha参数 | |
| 46 | -THRESHOLD1=1 # 交互强度阈值1 | |
| 47 | -THRESHOLD2=3 # 交互强度阈值2 | |
| 48 | -THREAD_NUM=4 # 线程数 | |
| 49 | -SHOW_PROGRESS=1 # 显示进度 | |
| 50 | -PYTHON_CMD="python3" # Python命令 | |
| 51 | -``` | |
| 52 | - | |
| 53 | -**执行流程**: | |
| 54 | -1. 编译C++程序 | |
| 55 | -2. 查找session文件 | |
| 56 | -3. 运行Swing算法(多线程) | |
| 57 | -4. 合并结果 | |
| 58 | -5. 生成可读版本(自动调用debug脚本) | |
| 59 | - | |
| 60 | -### 3. Debug脚本 ✓ | |
| 61 | - | |
| 62 | -**文件**: `offline_tasks/scripts/add_names_to_swing.py` | |
| 63 | - | |
| 64 | -**功能**: | |
| 65 | -- 读取Swing算法输出结果 | |
| 66 | -- 从数据库获取商品名称映射 | |
| 67 | -- 生成可读版本:`item_id:name \t similar_id1:name1:score1,...` | |
| 68 | - | |
| 69 | -**使用示例**: | |
| 70 | -```bash | |
| 71 | -cd /home/tw/recommendation/offline_tasks | |
| 72 | -python3 scripts/add_names_to_swing.py \ | |
| 73 | - ../collaboration/output/swing_similar.txt \ | |
| 74 | - ../collaboration/output/swing_similar_readable.txt \ | |
| 75 | - --debug | |
| 76 | -``` | |
| 77 | - | |
| 78 | -### 4. 使用文档 ✓ | |
| 79 | - | |
| 80 | -**文件**: | |
| 81 | -- `offline_tasks/SWING_USAGE.md` - 完整使用指南 | |
| 82 | -- `collaboration/QUICKSTART.md` - 快速开始指南 | |
| 83 | - | |
| 84 | -**包含内容**: | |
| 85 | -- 详细的使用步骤 | |
| 86 | -- 参数说明和调优建议 | |
| 87 | -- 故障排查指南 | |
| 88 | -- 性能优化建议 | |
| 89 | -- 完整示例 | |
| 90 | - | |
| 91 | -## 数据流程 | |
| 92 | - | |
| 93 | -``` | |
| 94 | -┌─────────────────────────────────────────────────────────────┐ | |
| 95 | -│ 步骤1: 生成Session文件 │ | |
| 96 | -│ generate_session.py │ | |
| 97 | -│ ↓ │ | |
| 98 | -│ 数据库 → 用户行为数据 → 聚合权重 → session.txt.YYYYMMDD │ | |
| 99 | -└─────────────────────────────────────────────────────────────┘ | |
| 100 | - ↓ | |
| 101 | -┌─────────────────────────────────────────────────────────────┐ | |
| 102 | -│ 步骤2: 运行Swing算法 │ | |
| 103 | -│ collaboration/run.sh │ | |
| 104 | -│ ↓ │ | |
| 105 | -│ session文件 → C++ Swing → sim_matrx.* → swing_similar.txt │ | |
| 106 | -└─────────────────────────────────────────────────────────────┘ | |
| 107 | - ↓ | |
| 108 | -┌─────────────────────────────────────────────────────────────┐ | |
| 109 | -│ 步骤3: 生成Debug文件 │ | |
| 110 | -│ add_names_to_swing.py (自动调用) │ | |
| 111 | -│ ↓ │ | |
| 112 | -│ swing_similar.txt → 添加商品名 → swing_similar_readable.txt│ | |
| 113 | -└─────────────────────────────────────────────────────────────┘ | |
| 114 | -``` | |
| 115 | - | |
| 116 | -## 文件格式说明 | |
| 117 | - | |
| 118 | -### Session文件格式 | |
| 119 | - | |
| 120 | -**标准格式** (`session.txt.YYYYMMDD`): | |
| 121 | -``` | |
| 122 | -user_id1 {"123":10.0,"456":5.0,"789":3.0} | |
| 123 | -user_id2 {"123":8.0,"999":12.0} | |
| 124 | -``` | |
| 125 | - | |
| 126 | -**C++格式** (`session.txt.YYYYMMDD.cpp`): | |
| 127 | -``` | |
| 128 | -{"123":10.0,"456":5.0,"789":3.0} | |
| 129 | -{"123":8.0,"999":12.0} | |
| 130 | -``` | |
| 131 | - | |
| 132 | -### Swing结果格式 | |
| 133 | - | |
| 134 | -**原始格式** (`swing_similar.txt`): | |
| 135 | -``` | |
| 136 | -12345 67890:0.8523,23456:0.7234,34567:0.6891 | |
| 137 | -``` | |
| 138 | - | |
| 139 | -**可读格式** (`swing_similar_readable.txt`): | |
| 140 | -``` | |
| 141 | -12345:iPhone 15 Pro 67890:iPhone 15:0.8523,23456:iPhone 14 Pro:0.7234 | |
| 142 | -``` | |
| 143 | - | |
| 144 | -## 行为权重配置 | |
| 145 | - | |
| 146 | -当前配置(在`generate_session.py`中): | |
| 147 | - | |
| 148 | -| 行为类型 | 权重 | 说明 | | |
| 149 | -|---------|------|------| | |
| 150 | -| purchase | 10.0 | 购买行为(最强信号) | | |
| 151 | -| contactFactory | 5.0 | 联系厂家 | | |
| 152 | -| addToCart | 3.0 | 加入购物车 | | |
| 153 | -| addToPool | 2.0 | 加入询价池 | | |
| 154 | - | |
| 155 | -## 快速开始 | |
| 156 | - | |
| 157 | -```bash | |
| 158 | -# 1. 生成session文件(730天数据) | |
| 159 | -cd /home/tw/recommendation/offline_tasks | |
| 160 | -python3 scripts/generate_session.py --lookback_days 730 | |
| 161 | - | |
| 162 | -# 2. 运行Swing算法 | |
| 163 | -cd /home/tw/recommendation/collaboration | |
| 164 | -bash run.sh | |
| 165 | - | |
| 166 | -# 3. 查看结果 | |
| 167 | -cat output/swing_similar_readable.txt | head -20 | |
| 168 | -``` | |
| 169 | - | |
| 170 | -## 项目结构 | |
| 171 | - | |
| 172 | -``` | |
| 173 | -recommendation/ | |
| 174 | -├── offline_tasks/ | |
| 175 | -│ ├── scripts/ | |
| 176 | -│ │ ├── generate_session.py # 新增:生成session | |
| 177 | -│ │ ├── add_names_to_swing.py # 新增:添加商品名 | |
| 178 | -│ │ ├── i2i_swing.py # 已有:Python版Swing | |
| 179 | -│ │ └── debug_utils.py # 已有:Debug工具 | |
| 180 | -│ ├── config/ | |
| 181 | -│ │ └── offline_config.py # 配置文件 | |
| 182 | -│ ├── output/ | |
| 183 | -│ │ ├── session.txt.YYYYMMDD # 生成的session文件 | |
| 184 | -│ │ └── session.txt.YYYYMMDD.cpp # C++格式session | |
| 185 | -│ ├── SWING_USAGE.md # 新增:详细使用文档 | |
| 186 | -│ └── ... | |
| 187 | -├── collaboration/ | |
| 188 | -│ ├── run.sh # 修改:适配新数据格式 | |
| 189 | -│ ├── QUICKSTART.md # 新增:快速开始 | |
| 190 | -│ ├── src/ | |
| 191 | -│ │ ├── swing.cc # C++ Swing实现 | |
| 192 | -│ │ ├── swing_symmetric.cc # 对称Swing | |
| 193 | -│ │ ├── icf_simple.cc # 简单协同过滤 | |
| 194 | -│ │ └── ucf.py # 用户协同 | |
| 195 | -│ ├── bin/ # 编译后的可执行文件 | |
| 196 | -│ ├── output_YYYYMMDD/ # 输出目录 | |
| 197 | -│ │ ├── sim_matrx.* # 多线程输出 | |
| 198 | -│ │ ├── swing_similar.txt # 合并结果 | |
| 199 | -│ │ └── swing_similar_readable.txt # 可读结果 | |
| 200 | -│ └── output -> output_YYYYMMDD # 软链接 | |
| 201 | -└── SWING_IMPLEMENTATION_SUMMARY.md # 本文档 | |
| 202 | -``` | |
| 203 | - | |
| 204 | -## 参数调优建议 | |
| 205 | - | |
| 206 | -### 针对B2B低频场景 | |
| 207 | - | |
| 208 | -```bash | |
| 209 | -# Session生成 | |
| 210 | ---lookback_days 730 # 2年数据(B2B交互频次低) | |
| 211 | - | |
| 212 | -# Swing算法 | |
| 213 | -ALPHA=0.5-0.7 # 关注用户共同行为的多样性 | |
| 214 | -THRESHOLD1=1 # 低阈值,保留更多数据 | |
| 215 | -THRESHOLD2=3 # 中等阈值,过滤噪音 | |
| 216 | -THREAD_NUM=4-8 # 根据服务器配置 | |
| 217 | -``` | |
| 218 | - | |
| 219 | -### 针对大数据量场景 | |
| 220 | - | |
| 221 | -```bash | |
| 222 | -# 增加线程数 | |
| 223 | -THREAD_NUM=8 | |
| 224 | - | |
| 225 | -# 修改C++代码参数 | |
| 226 | -max_sim_list_len=300 # 相似列表长度 | |
| 227 | -max_session_list_len=100 # session截断长度 | |
| 228 | -``` | |
| 229 | - | |
| 230 | -## 与现有系统集成 | |
| 231 | - | |
| 232 | -### 1. 定时任务 | |
| 233 | - | |
| 234 | -```bash | |
| 235 | -# 每天凌晨2点运行 | |
| 236 | -0 2 * * * cd /home/tw/recommendation/offline_tasks && \ | |
| 237 | - python3 scripts/generate_session.py && \ | |
| 238 | - cd ../collaboration && bash run.sh | |
| 239 | -``` | |
| 240 | - | |
| 241 | -### 2. 结果导入Redis | |
| 242 | - | |
| 243 | -可使用现有的 `load_index_to_redis.py` 脚本导入结果。 | |
| 244 | - | |
| 245 | -### 3. 与Python版Swing对比 | |
| 246 | - | |
| 247 | -- **C++版本**(本次实现):性能更好,适合大数据量 | |
| 248 | -- **Python版本**(`i2i_swing.py`):易于调试,支持时间衰减 | |
| 249 | - | |
| 250 | -可以运行两个版本对比效果: | |
| 251 | -```bash | |
| 252 | -# Python版本 | |
| 253 | -python3 offline_tasks/scripts/i2i_swing.py --debug | |
| 254 | - | |
| 255 | -# C++版本 | |
| 256 | -cd collaboration && bash run.sh | |
| 257 | -``` | |
| 258 | - | |
| 259 | -## 测试验证 | |
| 260 | - | |
| 261 | -### 1. 小数据量测试 | |
| 262 | - | |
| 263 | -```bash | |
| 264 | -# 生成小范围数据(30天) | |
| 265 | -python3 scripts/generate_session.py --lookback_days 30 | |
| 266 | - | |
| 267 | -# 运行Swing | |
| 268 | -cd ../collaboration | |
| 269 | -bash run.sh | |
| 270 | -``` | |
| 271 | - | |
| 272 | -### 2. 查看结果质量 | |
| 273 | - | |
| 274 | -```bash | |
| 275 | -# 查看可读版本前100行 | |
| 276 | -head -100 output/swing_similar_readable.txt | |
| 277 | - | |
| 278 | -# 检查相似度分布 | |
| 279 | -cat output/swing_similar.txt | awk -F'\t' '{print NF-1}' | sort -n | uniq -c | |
| 280 | -``` | |
| 281 | - | |
| 282 | -### 3. 性能测试 | |
| 283 | - | |
| 284 | -```bash | |
| 285 | -# 记录运行时间 | |
| 286 | -time bash run.sh | |
| 287 | -``` | |
| 288 | - | |
| 289 | -## 故障排查 | |
| 290 | - | |
| 291 | -### 常见问题 | |
| 292 | - | |
| 293 | -1. **Session文件不存在** | |
| 294 | - - 先运行 `generate_session.py` | |
| 295 | - | |
| 296 | -2. **编译失败** | |
| 297 | - - 检查g++版本:`g++ --version` | |
| 298 | - - 手动编译:`cd collaboration && make` | |
| 299 | - | |
| 300 | -3. **数据库连接失败** | |
| 301 | - - 检查配置:`offline_tasks/config/offline_config.py` | |
| 302 | - - 测试连接:`python3 offline_tasks/test_connection.py` | |
| 303 | - | |
| 304 | -4. **结果为空** | |
| 305 | - - 降低threshold参数 | |
| 306 | - - 增加lookback_days | |
| 307 | - - 检查数据量:`wc -l output/session.txt.*` | |
| 308 | - | |
| 309 | -详细故障排查参见:`offline_tasks/SWING_USAGE.md` | |
| 310 | - | |
| 311 | -## 后续优化方向 | |
| 312 | - | |
| 313 | -1. **性能优化** | |
| 314 | - - 支持分布式计算 | |
| 315 | - - 增量更新机制 | |
| 316 | - - 结果缓存 | |
| 317 | - | |
| 318 | -2. **功能增强** | |
| 319 | - - 支持多种相似度算法 | |
| 320 | - - 在线实时更新 | |
| 321 | - - A/B测试框架 | |
| 322 | - | |
| 323 | -3. **可观测性** | |
| 324 | - - 添加监控指标 | |
| 325 | - - 结果质量评估 | |
| 326 | - - 自动报警 | |
| 327 | - | |
| 328 | -## 相关文档 | |
| 329 | - | |
| 330 | -- **详细使用指南**: `offline_tasks/SWING_USAGE.md` | |
| 331 | -- **快速开始**: `collaboration/QUICKSTART.md` | |
| 332 | -- **配置说明**: `offline_tasks/config/offline_config.py` | |
| 333 | -- **Debug工具**: `offline_tasks/scripts/debug_utils.py` | |
| 334 | -- **Swing算法原理**: `collaboration/README.md` | |
| 335 | - | |
| 336 | -## 维护说明 | |
| 337 | - | |
| 338 | -### 代码维护 | |
| 339 | - | |
| 340 | -- **Session生成**: `offline_tasks/scripts/generate_session.py` | |
| 341 | -- **Swing执行**: `collaboration/run.sh` | |
| 342 | -- **Debug脚本**: `offline_tasks/scripts/add_names_to_swing.py` | |
| 343 | - | |
| 344 | -### 配置维护 | |
| 345 | - | |
| 346 | -- **数据库配置**: `offline_tasks/config/offline_config.py` | |
| 347 | -- **行为权重**: `generate_session.py` 中的 `behavior_weights` | |
| 348 | -- **Swing参数**: `collaboration/run.sh` 中的配置区域 | |
| 349 | - | |
| 350 | -### 日志查看 | |
| 351 | - | |
| 352 | -```bash | |
| 353 | -# Session生成日志 | |
| 354 | -ls offline_tasks/logs/debug/generate_session_*.log | |
| 355 | - | |
| 356 | -# Swing运行日志 | |
| 357 | -ls collaboration/logs/ | |
| 358 | -``` | |
| 359 | - | |
| 360 | -## 总结 | |
| 361 | - | |
| 362 | -本次实现完成了一套完整的C++ Swing算法工作流: | |
| 363 | - | |
| 364 | -1. ✓ **前置任务**:Session文件生成(`generate_session.py`) | |
| 365 | -2. ✓ **核心算法**:C++ Swing执行(改进的`run.sh`) | |
| 366 | -3. ✓ **后处理**:Debug文件生成(`add_names_to_swing.py`) | |
| 367 | -4. ✓ **文档完善**:详细使用指南和快速开始 | |
| 368 | - | |
| 369 | -所有脚本都支持debug模式,便于调试和监控。整体流程自动化程度高,只需一条命令即可完成全流程。 | |
| 370 | - | |
| 371 | ---- | |
| 372 | - | |
| 373 | -**实现时间**: 2024-10-17 | |
| 374 | -**状态**: ✅ 已完成 | |
| 375 | - |
offline_tasks/doc/Swing算法使用指南.md deleted
| ... | ... | @@ -1,322 +0,0 @@ |
| 1 | -# Swing算法使用指南 | |
| 2 | - | |
| 3 | -本文档介绍如何使用C++版本的Swing算法进行物品相似度计算。 | |
| 4 | - | |
| 5 | -## 目录结构 | |
| 6 | - | |
| 7 | -``` | |
| 8 | -recommendation/ | |
| 9 | -├── offline_tasks/ | |
| 10 | -│ ├── scripts/ | |
| 11 | -│ │ ├── generate_session.py # 生成用户session文件 | |
| 12 | -│ │ └── add_names_to_swing.py # 给结果添加商品名称 | |
| 13 | -│ └── output/ | |
| 14 | -│ └── session.txt.YYYYMMDD # 生成的session文件 | |
| 15 | -└── collaboration/ | |
| 16 | - ├── run.sh # Swing算法执行脚本 | |
| 17 | - ├── src/ | |
| 18 | - │ ├── swing.cc # Swing算法实现 | |
| 19 | - │ └── ucf.py # 用户协同过滤 | |
| 20 | - └── output_YYYYMMDD/ | |
| 21 | - ├── swing_similar.txt # Swing结果(ID格式) | |
| 22 | - └── swing_similar_readable.txt # Swing结果(带商品名) | |
| 23 | -``` | |
| 24 | - | |
| 25 | -## 使用流程 | |
| 26 | - | |
| 27 | -### 步骤1: 生成Session文件 | |
| 28 | - | |
| 29 | -首先需要从数据库提取用户行为数据,生成session文件。 | |
| 30 | - | |
| 31 | -```bash | |
| 32 | -cd /home/tw/recommendation/offline_tasks | |
| 33 | - | |
| 34 | -# 基本用法(使用默认参数:730天数据) | |
| 35 | -python3 scripts/generate_session.py | |
| 36 | - | |
| 37 | -# 指定回看天数 | |
| 38 | -python3 scripts/generate_session.py --lookback_days 365 | |
| 39 | - | |
| 40 | -# 启用debug模式查看详细信息 | |
| 41 | -python3 scripts/generate_session.py --lookback_days 730 --debug | |
| 42 | - | |
| 43 | -# 指定输出文件路径 | |
| 44 | -python3 scripts/generate_session.py --output output/session.txt.20241017 | |
| 45 | - | |
| 46 | -# 选择输出格式 | |
| 47 | -python3 scripts/generate_session.py --format both # 同时生成两种格式(默认) | |
| 48 | -python3 scripts/generate_session.py --format standard # uid \t json 格式 | |
| 49 | -python3 scripts/generate_session.py --format cpp # 纯json格式(.cpp后缀) | |
| 50 | -``` | |
| 51 | - | |
| 52 | -**输出文件格式:** | |
| 53 | - | |
| 54 | -- `session.txt.YYYYMMDD` - 标准格式(包含uid): | |
| 55 | - ``` | |
| 56 | - uid1 \t {"item_id1":10.0,"item_id2":5.0,"item_id3":3.0} | |
| 57 | - uid2 \t {"item_id4":15.0,"item_id5":8.0} | |
| 58 | - ``` | |
| 59 | - | |
| 60 | -- `session.txt.YYYYMMDD.cpp` - C++格式(纯json): | |
| 61 | - ``` | |
| 62 | - {"item_id1":10.0,"item_id2":5.0,"item_id3":3.0} | |
| 63 | - {"item_id4":15.0,"item_id5":8.0} | |
| 64 | - ``` | |
| 65 | - | |
| 66 | -**行为权重配置:** | |
| 67 | -- `purchase`: 10.0(购买) | |
| 68 | -- `contactFactory`: 5.0(联系厂家) | |
| 69 | -- `addToCart`: 3.0(加入购物车) | |
| 70 | -- `addToPool`: 2.0(加入询价池) | |
| 71 | - | |
| 72 | -### 步骤2: 运行Swing算法 | |
| 73 | - | |
| 74 | -session文件生成后,运行C++版本的Swing算法。 | |
| 75 | - | |
| 76 | -```bash | |
| 77 | -cd /home/tw/recommendation/collaboration | |
| 78 | - | |
| 79 | -# 直接运行(使用默认配置) | |
| 80 | -bash run.sh | |
| 81 | - | |
| 82 | -# 或者给脚本添加执行权限后运行 | |
| 83 | -chmod +x run.sh | |
| 84 | -./run.sh | |
| 85 | -``` | |
| 86 | - | |
| 87 | -**配置说明(修改run.sh中的参数):** | |
| 88 | - | |
| 89 | -```bash | |
| 90 | -# 数据路径配置 | |
| 91 | -SESSION_DATA_DIR="../offline_tasks/output" # session文件目录 | |
| 92 | - | |
| 93 | -# Swing算法参数 | |
| 94 | -ALPHA=0.7 # Swing算法的alpha参数(越小越关注用户共同行为) | |
| 95 | -THRESHOLD1=1 # 交互强度阈值1(用于筛选用户行为) | |
| 96 | -THRESHOLD2=3 # 交互强度阈值2(用于计算相似度) | |
| 97 | -THREAD_NUM=4 # 线程数(根据CPU核心数调整) | |
| 98 | -SHOW_PROGRESS=1 # 是否显示进度 (0/1) | |
| 99 | - | |
| 100 | -# Python环境 | |
| 101 | -PYTHON_CMD="python3" # 如需使用特定Python环境,修改此处 | |
| 102 | -``` | |
| 103 | - | |
| 104 | -**脚本执行流程:** | |
| 105 | - | |
| 106 | -1. 编译C++程序(swing, icf_simple, swing_symmetric) | |
| 107 | -2. 查找当天日期的session文件 | |
| 108 | -3. 运行Swing算法计算物品相似度 | |
| 109 | -4. 合并多线程输出结果 | |
| 110 | -5. 自动调用debug脚本生成可读版本 | |
| 111 | - | |
| 112 | -### 步骤3: 查看结果 | |
| 113 | - | |
| 114 | -运行完成后,结果文件位于 `collaboration/output_YYYYMMDD/` 目录: | |
| 115 | - | |
| 116 | -**1. swing_similar.txt** - 原始结果(ID格式) | |
| 117 | -``` | |
| 118 | -12345 \t 67890:0.8523,23456:0.7234,34567:0.6891 | |
| 119 | -``` | |
| 120 | -格式:`item_id \t similar_item_id1:score1,similar_item_id2:score2,...` | |
| 121 | - | |
| 122 | -**2. swing_similar_readable.txt** - 可读结果(带商品名) | |
| 123 | -``` | |
| 124 | -12345:iPhone 15 Pro \t 67890:iPhone 15:0.8523,23456:iPhone 14 Pro:0.7234 | |
| 125 | -``` | |
| 126 | -格式:`item_id:item_name \t similar_item_id1:name1:score1,similar_item_id2:name2:score2,...` | |
| 127 | - | |
| 128 | -### 步骤4: 单独生成Debug文件(可选) | |
| 129 | - | |
| 130 | -如果需要为其他文件生成可读版本: | |
| 131 | - | |
| 132 | -```bash | |
| 133 | -cd /home/tw/recommendation/offline_tasks | |
| 134 | - | |
| 135 | -# 基本用法 | |
| 136 | -python3 scripts/add_names_to_swing.py collaboration/output/swing_similar.txt | |
| 137 | - | |
| 138 | -# 指定输出文件 | |
| 139 | -python3 scripts/add_names_to_swing.py \ | |
| 140 | - collaboration/output/swing_similar.txt \ | |
| 141 | - collaboration/output/my_readable.txt | |
| 142 | - | |
| 143 | -# 启用debug模式 | |
| 144 | -python3 scripts/add_names_to_swing.py \ | |
| 145 | - collaboration/output/swing_similar.txt \ | |
| 146 | - --debug | |
| 147 | -``` | |
| 148 | - | |
| 149 | -## 参数调优建议 | |
| 150 | - | |
| 151 | -### Swing算法参数 | |
| 152 | - | |
| 153 | -1. **alpha (0.5-1.0)** | |
| 154 | - - 越小:越关注用户共同行为的多样性 | |
| 155 | - - 越大:越容忽略用户重叠度 | |
| 156 | - - 建议:0.5-0.7(B2B场景) | |
| 157 | - | |
| 158 | -2. **threshold1 (1-5)** | |
| 159 | - - 用于筛选用户的有效行为 | |
| 160 | - - 建议:1-3(低频场景可用1) | |
| 161 | - | |
| 162 | -3. **threshold2 (1-10)** | |
| 163 | - - 用于计算相似度的行为强度阈值 | |
| 164 | - - 建议:3-5(需要较强的交互信号) | |
| 165 | - | |
| 166 | -4. **thread_num (1-20)** | |
| 167 | - - 根据CPU核心数设置 | |
| 168 | - - 建议:4-8(普通服务器) | |
| 169 | - | |
| 170 | -### 数据范围参数 | |
| 171 | - | |
| 172 | -1. **lookback_days** | |
| 173 | - - B2B低频场景:建议730天(2年) | |
| 174 | - - B2C高频场景:建议30-90天 | |
| 175 | - - 数据量大时可适当减少 | |
| 176 | - | |
| 177 | -## 完整示例 | |
| 178 | - | |
| 179 | -```bash | |
| 180 | -# 1. 生成session文件(730天数据) | |
| 181 | -cd /home/tw/recommendation/offline_tasks | |
| 182 | -python3 scripts/generate_session.py --lookback_days 730 --debug | |
| 183 | - | |
| 184 | -# 2. 检查生成的文件 | |
| 185 | -ls -lh output/session.txt.* | |
| 186 | -# 应该看到: | |
| 187 | -# session.txt.20241017 | |
| 188 | -# session.txt.20241017.cpp | |
| 189 | - | |
| 190 | -# 3. 运行Swing算法 | |
| 191 | -cd /home/tw/recommendation/collaboration | |
| 192 | -bash run.sh | |
| 193 | - | |
| 194 | -# 4. 查看结果 | |
| 195 | -ls -lh output/swing_similar* | |
| 196 | -cat output/swing_similar_readable.txt | head -20 | |
| 197 | -``` | |
| 198 | - | |
| 199 | -## 故障排查 | |
| 200 | - | |
| 201 | -### 问题1: Session文件不存在 | |
| 202 | - | |
| 203 | -``` | |
| 204 | -错误: Session文件不存在: ../offline_tasks/output/session.txt.20241017.cpp | |
| 205 | -``` | |
| 206 | - | |
| 207 | -**解决方法:** | |
| 208 | -```bash | |
| 209 | -cd /home/tw/recommendation/offline_tasks | |
| 210 | -python3 scripts/generate_session.py | |
| 211 | -``` | |
| 212 | - | |
| 213 | -### 问题2: 编译失败 | |
| 214 | - | |
| 215 | -``` | |
| 216 | -编译失败,退出 | |
| 217 | -``` | |
| 218 | - | |
| 219 | -**解决方法:** | |
| 220 | -```bash | |
| 221 | -cd /home/tw/recommendation/collaboration | |
| 222 | -# 检查编译器 | |
| 223 | -g++ --version | |
| 224 | - | |
| 225 | -# 手动编译 | |
| 226 | -make clean | |
| 227 | -make | |
| 228 | - | |
| 229 | -# 检查依赖 | |
| 230 | -ls include/ | |
| 231 | -ls utils/ | |
| 232 | -``` | |
| 233 | - | |
| 234 | -### 问题3: 数据库连接失败 | |
| 235 | - | |
| 236 | -``` | |
| 237 | -获取数据失败: Connection refused | |
| 238 | -``` | |
| 239 | - | |
| 240 | -**解决方法:** | |
| 241 | -- 检查数据库配置:`offline_tasks/config/offline_config.py` | |
| 242 | -- 测试连接:`python3 offline_tasks/test_connection.py` | |
| 243 | -- 确认网络和防火墙设置 | |
| 244 | - | |
| 245 | -### 问题4: 结果为空 | |
| 246 | - | |
| 247 | -**可能原因:** | |
| 248 | -- threshold1/threshold2设置过高,过滤掉了所有数据 | |
| 249 | -- 数据量太少,用户和商品交集不足 | |
| 250 | - | |
| 251 | -**解决方法:** | |
| 252 | -- 降低threshold参数(如threshold1=0.5, threshold2=1) | |
| 253 | -- 增加lookback_days | |
| 254 | -- 检查数据量:`wc -l output/session.txt.*` | |
| 255 | - | |
| 256 | -## 性能优化 | |
| 257 | - | |
| 258 | -### 大数据量场景 | |
| 259 | - | |
| 260 | -如果数据量很大(>100万用户,>10万商品): | |
| 261 | - | |
| 262 | -1. **增加线程数** | |
| 263 | - ```bash | |
| 264 | - THREAD_NUM=8 # 或更多 | |
| 265 | - ``` | |
| 266 | - | |
| 267 | -2. **分批处理** | |
| 268 | - - 可以将session文件按用户分片 | |
| 269 | - - 分别运行Swing算法 | |
| 270 | - - 最后合并结果 | |
| 271 | - | |
| 272 | -3. **调整max_session_list_len** | |
| 273 | - - 修改 `src/swing.cc` 中的 `max_session_list_len` | |
| 274 | - - 限制每个用户的最大行为数 | |
| 275 | - | |
| 276 | -### 内存优化 | |
| 277 | - | |
| 278 | -如果遇到内存不足: | |
| 279 | - | |
| 280 | -1. 减少 `max_sim_list_len`(默认300) | |
| 281 | -2. 减少 `max_session_list_len`(默认100) | |
| 282 | -3. 分批处理数据 | |
| 283 | - | |
| 284 | -## 集成到定时任务 | |
| 285 | - | |
| 286 | -```bash | |
| 287 | -# 添加到crontab | |
| 288 | -crontab -e | |
| 289 | - | |
| 290 | -# 每天凌晨2点运行 | |
| 291 | -0 2 * * * cd /home/tw/recommendation/offline_tasks && python3 scripts/generate_session.py && cd ../collaboration && bash run.sh >> logs/swing_$(date +\%Y\%m\%d).log 2>&1 | |
| 292 | -``` | |
| 293 | - | |
| 294 | -## 相关文档 | |
| 295 | - | |
| 296 | -- [Swing算法原理](./collaboration/README.md) | |
| 297 | -- [离线任务配置](./offline_tasks/config/offline_config.py) | |
| 298 | -- [Debug工具使用](./offline_tasks/scripts/debug_utils.py) | |
| 299 | - | |
| 300 | -## 常见问题 | |
| 301 | - | |
| 302 | -**Q: session文件格式选择哪个?** | |
| 303 | -A: run.sh会自动检测格式。建议使用 `--format both` 生成两种格式。 | |
| 304 | - | |
| 305 | -**Q: Swing算法运行多久?** | |
| 306 | -A: 取决于数据量和线程数。通常: | |
| 307 | -- 1万商品:1-5分钟 | |
| 308 | -- 10万商品:10-30分钟 | |
| 309 | -- 数据量大时建议使用多线程 | |
| 310 | - | |
| 311 | -**Q: 如何调整相似商品数量?** | |
| 312 | -A: 修改 `src/swing.cc` 中的 `max_sim_list_len` 参数(默认300)。 | |
| 313 | - | |
| 314 | -**Q: 能否使用Python版本的Swing?** | |
| 315 | -A: 可以,使用 `offline_tasks/scripts/i2i_swing.py`。但C++版本性能更好。 | |
| 316 | - | |
| 317 | -## 联系支持 | |
| 318 | - | |
| 319 | -如有问题,请参考: | |
| 320 | -- 项目README: `/home/tw/recommendation/README.md` | |
| 321 | -- 故障排查: `/home/tw/recommendation/offline_tasks/TROUBLESHOOTING.md` | |
| 322 | - |
offline_tasks/doc/TROUBLESHOOTING.md deleted
| ... | ... | @@ -1,217 +0,0 @@ |
| 1 | -# 故障排除指南 | |
| 2 | - | |
| 3 | -## 常见问题及解决方案 | |
| 4 | - | |
| 5 | -### 1. 数据库字段错误 | |
| 6 | - | |
| 7 | -#### 问题: | |
| 8 | -``` | |
| 9 | -pymysql.err.OperationalError: (1105, "errCode = 2, detailMessage = Unknown column 'xxx' in 'xxx'") | |
| 10 | -``` | |
| 11 | - | |
| 12 | -#### 原因: | |
| 13 | -数据库表结构与代码中使用的字段名不匹配。 | |
| 14 | - | |
| 15 | -#### 解决方案: | |
| 16 | -1. 查看 `DATABASE_SETUP.md` 了解如何配置字段 | |
| 17 | -2. 修改对应脚本中的SQL查询,使用实际存在的字段名 | |
| 18 | -3. 如果是分类字段不存在,这些字段是可选的,代码会自动跳过 | |
| 19 | - | |
| 20 | -#### 已修复的字段: | |
| 21 | -- ✅ `category_level2_id` 和 `category_level3_id` 现在是可选的 | |
| 22 | -- ✅ 基础功能不依赖分类字段 | |
| 23 | - | |
| 24 | ---- | |
| 25 | - | |
| 26 | -### 2. 连接超时 | |
| 27 | - | |
| 28 | -#### 问题: | |
| 29 | -``` | |
| 30 | -pymysql.err.OperationalError: (2003, "Can't connect to MySQL server...") | |
| 31 | -``` | |
| 32 | - | |
| 33 | -#### 解决方案: | |
| 34 | -1. 检查数据库配置:`config/offline_config.py` | |
| 35 | -2. 确认网络连接和防火墙设置 | |
| 36 | -3. 运行测试:`python3 test_connection.py` | |
| 37 | - | |
| 38 | ---- | |
| 39 | - | |
| 40 | -### 3. 内存不足 | |
| 41 | - | |
| 42 | -#### 问题: | |
| 43 | -程序运行时内存占用过高或被杀死。 | |
| 44 | - | |
| 45 | -#### 解决方案: | |
| 46 | -1. 减少回溯天数:`--lookback_days 365`(从730改为365) | |
| 47 | -2. 减少输出数量:`--top_n 20`(从50改为20) | |
| 48 | -3. 先运行单个算法: | |
| 49 | - ```bash | |
| 50 | - python3 scripts/i2i_session_w2v.py # 内存占用较小 | |
| 51 | - ``` | |
| 52 | -4. 跳过Swing算法(内存占用最大): | |
| 53 | - ```bash | |
| 54 | - python3 run_all.py --skip-i2i | |
| 55 | - ``` | |
| 56 | - | |
| 57 | ---- | |
| 58 | - | |
| 59 | -### 4. 运行时间过长 | |
| 60 | - | |
| 61 | -#### 解决方案: | |
| 62 | -1. 减少数据量:`--lookback_days 180` | |
| 63 | -2. 只运行特定算法: | |
| 64 | - ```bash | |
| 65 | - python3 run_all.py --only-w2v | |
| 66 | - ``` | |
| 67 | -3. 考虑使用C++版本的Swing(性能提升10倍) | |
| 68 | - | |
| 69 | ---- | |
| 70 | - | |
| 71 | -### 5. 依赖包安装失败 | |
| 72 | - | |
| 73 | -#### 解决方案: | |
| 74 | -```bash | |
| 75 | -# 单独安装失败的包 | |
| 76 | -pip3 install pandas sqlalchemy pymysql gensim numpy | |
| 77 | - | |
| 78 | -# 或使用国内镜像 | |
| 79 | -pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple | |
| 80 | -``` | |
| 81 | - | |
| 82 | ---- | |
| 83 | - | |
| 84 | -### 6. Redis连接失败 | |
| 85 | - | |
| 86 | -#### 问题: | |
| 87 | -``` | |
| 88 | -redis.exceptions.ConnectionError: Error connecting to Redis | |
| 89 | -``` | |
| 90 | - | |
| 91 | -#### 解决方案: | |
| 92 | -1. Redis是可选的,只影响索引加载功能 | |
| 93 | -2. 如果不需要Redis,可以跳过: | |
| 94 | - ```bash | |
| 95 | - python3 run_all.py # 只运行离线任务,不加载到Redis | |
| 96 | - ``` | |
| 97 | -3. 如果需要Redis,确认Redis已安装并运行: | |
| 98 | - ```bash | |
| 99 | - redis-cli ping # 应该返回 PONG | |
| 100 | - ``` | |
| 101 | - | |
| 102 | ---- | |
| 103 | - | |
| 104 | -### 7. 输出文件为空 | |
| 105 | - | |
| 106 | -#### 可能原因: | |
| 107 | -1. 数据量太少(没有满足最小阈值) | |
| 108 | -2. 时间范围内没有数据 | |
| 109 | -3. SQL查询条件过于严格 | |
| 110 | - | |
| 111 | -#### 解决方案: | |
| 112 | -1. 检查日志:`tail -f logs/run_all_*.log` | |
| 113 | -2. 调整参数: | |
| 114 | - - 增加时间范围:`--lookback_days 1000` | |
| 115 | - - 减少阈值:修改配置文件中的 `min_interaction_count` | |
| 116 | -3. 检查数据库中是否有数据: | |
| 117 | - ```python | |
| 118 | - # 运行简单查询测试 | |
| 119 | - python3 test_connection.py | |
| 120 | - ``` | |
| 121 | - | |
| 122 | ---- | |
| 123 | - | |
| 124 | -### 8. 权限问题 | |
| 125 | - | |
| 126 | -#### 问题: | |
| 127 | -``` | |
| 128 | -PermissionError: [Errno 13] Permission denied | |
| 129 | -``` | |
| 130 | - | |
| 131 | -#### 解决方案: | |
| 132 | -```bash | |
| 133 | -# 给脚本添加执行权限 | |
| 134 | -chmod +x install.sh run_all.py | |
| 135 | - | |
| 136 | -# 确保有写入权限 | |
| 137 | -chmod 755 output/ logs/ | |
| 138 | -``` | |
| 139 | - | |
| 140 | ---- | |
| 141 | - | |
| 142 | -### 9. Python版本问题 | |
| 143 | - | |
| 144 | -#### 要求: | |
| 145 | -Python 3.7+ | |
| 146 | - | |
| 147 | -#### 检查版本: | |
| 148 | -```bash | |
| 149 | -python3 --version | |
| 150 | -``` | |
| 151 | - | |
| 152 | -#### 如果版本过低,需要升级Python | |
| 153 | - | |
| 154 | ---- | |
| 155 | - | |
| 156 | -### 10. 编码问题 | |
| 157 | - | |
| 158 | -#### 问题: | |
| 159 | -``` | |
| 160 | -UnicodeDecodeError: 'utf-8' codec can't decode byte... | |
| 161 | -``` | |
| 162 | - | |
| 163 | -#### 解决方案: | |
| 164 | -确保所有文件使用UTF-8编码,特别是配置文件和输出文件。 | |
| 165 | - | |
| 166 | ---- | |
| 167 | - | |
| 168 | -## 调试技巧 | |
| 169 | - | |
| 170 | -### 1. 查看详细日志 | |
| 171 | -```bash | |
| 172 | -tail -f logs/run_all_*.log | |
| 173 | -``` | |
| 174 | - | |
| 175 | -### 2. 运行单个任务(便于调试) | |
| 176 | -```bash | |
| 177 | -python3 scripts/i2i_swing.py --lookback_days 30 --top_n 10 | |
| 178 | -``` | |
| 179 | - | |
| 180 | -### 3. 使用较小的数据量测试 | |
| 181 | -```bash | |
| 182 | -python3 run_all.py --lookback_days 30 --top_n 10 | |
| 183 | -``` | |
| 184 | - | |
| 185 | -### 4. 检查中间结果 | |
| 186 | -```bash | |
| 187 | -ls -lh output/ | |
| 188 | -head -n 20 output/i2i_swing_*.txt | |
| 189 | -``` | |
| 190 | - | |
| 191 | ---- | |
| 192 | - | |
| 193 | -## 获取支持 | |
| 194 | - | |
| 195 | -如果以上方法都无法解决问题: | |
| 196 | - | |
| 197 | -1. **查看文档**: | |
| 198 | - - `README.md` - 详细说明 | |
| 199 | - - `DATABASE_SETUP.md` - 数据库配置 | |
| 200 | - - `QUICKSTART.md` - 快速开始 | |
| 201 | - | |
| 202 | -2. **查看日志**: | |
| 203 | - - `logs/` 目录下的所有日志文件 | |
| 204 | - | |
| 205 | -3. **简化测试**: | |
| 206 | - - 先运行 `test_connection.py` | |
| 207 | - - 再运行单个脚本 | |
| 208 | - - 使用小数据量测试 | |
| 209 | - | |
| 210 | -4. **记录错误信息**: | |
| 211 | - - 完整的错误堆栈 | |
| 212 | - - 使用的命令 | |
| 213 | - - 配置文件内容 | |
| 214 | - | |
| 215 | ---- | |
| 216 | - | |
| 217 | -**提示**:大部分问题都与数据库字段名不匹配有关,请优先查看 `DATABASE_SETUP.md`。 |
offline_tasks/doc/从这里开始.md deleted
| ... | ... | @@ -1,302 +0,0 @@ |
| 1 | -# 🚀 从这里开始 | |
| 2 | - | |
| 3 | -## 📦 项目交付完成 | |
| 4 | - | |
| 5 | -根据您提供的业务文档和表结构,推荐系统离线任务已完成构建! | |
| 6 | - | |
| 7 | ---- | |
| 8 | - | |
| 9 | -## ✅ 完成的功能 | |
| 10 | - | |
| 11 | -### 1. i2i 索引(4种算法) | |
| 12 | - | |
| 13 | -#### 行为相似(3种) | |
| 14 | -- ✅ **Swing算法** - 基于用户共同行为 | |
| 15 | -- ✅ **Session W2V** - 基于用户会话序列 | |
| 16 | -- ✅ **DeepWalk** - 基于图随机游走 | |
| 17 | - | |
| 18 | -#### 内容相似(1种,3个方法) | |
| 19 | -- ✅ **Content-based** - 基于商品属性(分类、供应商等) | |
| 20 | - - TF-IDF方法 | |
| 21 | - - 分类方法 | |
| 22 | - - 混合方法(推荐) | |
| 23 | - | |
| 24 | -### 2. 兴趣点聚合索引 | |
| 25 | - | |
| 26 | -**支持的维度**(7个单维度 + 4个组合维度): | |
| 27 | -- ✅ 业务平台(platform) | |
| 28 | -- ✅ 客户端平台(client_platform) | |
| 29 | -- ✅ 供应商(supplier) | |
| 30 | -- ✅ 一级分类(category_level1) | |
| 31 | -- ✅ 二级分类(category_level2) | |
| 32 | -- ✅ 三级分类(category_level3) | |
| 33 | -- ✅ 四级分类(category_level4) | |
| 34 | -- ✅ 平台+客户端 | |
| 35 | -- ✅ 平台+分类 | |
| 36 | -- ✅ 客户端+分类 | |
| 37 | - | |
| 38 | -**支持的列表类型**(3种): | |
| 39 | -- ✅ 热门(hot)- 最近180天高交互 | |
| 40 | -- ✅ 加购(cart)- 加购行为 | |
| 41 | -- ✅ 新品(new)- 最近90天上架 | |
| 42 | - | |
| 43 | ---- | |
| 44 | - | |
| 45 | -## 🎯 快速开始(3步) | |
| 46 | - | |
| 47 | -### 步骤1: 安装依赖 | |
| 48 | -```bash | |
| 49 | -cd /home/tw/recommendation/offline_tasks | |
| 50 | -bash install.sh | |
| 51 | -``` | |
| 52 | - | |
| 53 | -### 步骤2: 测试连接 | |
| 54 | -```bash | |
| 55 | -python3 test_connection.py | |
| 56 | -``` | |
| 57 | - | |
| 58 | -### 步骤3: 运行任务(小数据量测试) | |
| 59 | -```bash | |
| 60 | -# 先测试30天数据 | |
| 61 | -python3 scripts/i2i_swing.py --lookback_days 30 --top_n 10 | |
| 62 | - | |
| 63 | -# 查看输出 | |
| 64 | -ls -lh output/ | |
| 65 | -head -5 output/i2i_swing_*.txt | |
| 66 | -``` | |
| 67 | - | |
| 68 | -### 步骤4: 运行完整任务 | |
| 69 | -```bash | |
| 70 | -# 运行所有任务(约6-10小时) | |
| 71 | -python3 run_all.py --lookback_days 730 --top_n 50 | |
| 72 | - | |
| 73 | -# 或分别运行(推荐) | |
| 74 | -python3 scripts/i2i_swing.py --lookback_days 730 --top_n 50 | |
| 75 | -python3 scripts/i2i_content_similar.py --top_n 50 --method hybrid | |
| 76 | -python3 scripts/interest_aggregation.py --lookback_days 730 --top_n 1000 | |
| 77 | -``` | |
| 78 | - | |
| 79 | ---- | |
| 80 | - | |
| 81 | -## 📚 文档导航 | |
| 82 | - | |
| 83 | -### 入门文档 | |
| 84 | -1. **START_HERE.md** ← 当前文档 | |
| 85 | -2. **QUICKSTART.md** - 5分钟快速上手 | |
| 86 | -3. **CURRENT_STATUS.md** - 当前功能状态 | |
| 87 | - | |
| 88 | -### 技术文档 | |
| 89 | -4. **FINAL_UPDATE.md** - 最终更新说明 | |
| 90 | -5. **COMPLETE_INDEX_LIST.md** - 完整索引清单 | |
| 91 | -6. **README.md** - 详细使用文档 | |
| 92 | -7. **PROJECT_SUMMARY.md** - 技术架构 | |
| 93 | - | |
| 94 | -### 配置文档 | |
| 95 | -8. **FIELD_MAPPING.md** - 字段映射说明 | |
| 96 | -9. **DATABASE_SETUP.md** - 数据库配置 | |
| 97 | -10. **TROUBLESHOOTING.md** - 故障排除 | |
| 98 | - | |
| 99 | -### 参考文档 | |
| 100 | -11. **STRUCTURE.md** - 目录结构 | |
| 101 | -12. **CHANGELOG.md** - 更新日志 | |
| 102 | -13. **COMMANDS.txt** - 常用命令 | |
| 103 | - | |
| 104 | ---- | |
| 105 | - | |
| 106 | -## 📊 输出示例 | |
| 107 | - | |
| 108 | -### i2i相似度索引 | |
| 109 | -``` | |
| 110 | -# 文件: output/i2i_swing_20251016.txt | |
| 111 | -12345 商品A 23456:0.8523,34567:0.7842,45678:0.7234,... | |
| 112 | - | |
| 113 | -# Redis Key: i2i:swing:12345 | |
| 114 | -Value: 23456:0.8523,34567:0.7842,45678:0.7234,... | |
| 115 | -``` | |
| 116 | - | |
| 117 | -### 兴趣点聚合索引 | |
| 118 | -``` | |
| 119 | -# 文件: output/interest_aggregation_hot_20251016.txt | |
| 120 | -platform:pc 12345:98.52,23456:87.34,34567:76.89,... | |
| 121 | -category_level2:200 45678:156.23,56789:142.87,... | |
| 122 | - | |
| 123 | -# Redis Key: interest:hot:platform:pc | |
| 124 | -Value: 12345:98.52,23456:87.34,34567:76.89,... | |
| 125 | -``` | |
| 126 | - | |
| 127 | ---- | |
| 128 | - | |
| 129 | -## 🎬 业务场景映射 | |
| 130 | - | |
| 131 | -根据您的3个业务场景: | |
| 132 | - | |
| 133 | -### 1. 首页猜你喜欢 | |
| 134 | -```python | |
| 135 | -# 使用兴趣点聚合索引 | |
| 136 | -interest:hot:platform:pc | |
| 137 | -interest:hot:category_level2:200 | |
| 138 | -interest:hot:platform_category2:pc_200 | |
| 139 | -``` | |
| 140 | - | |
| 141 | -### 2. 详情页的大家都在看 | |
| 142 | -```python | |
| 143 | -# 使用i2i相似索引 | |
| 144 | -i2i:swing:12345 # 行为相似 | |
| 145 | -i2i:content_hybrid:12345 # 内容相似 | |
| 146 | -``` | |
| 147 | - | |
| 148 | -### 3. 搜索结果页底部的供应商推荐 | |
| 149 | -```python | |
| 150 | -# 使用兴趣点聚合索引 | |
| 151 | -interest:global:category_level2:200 | |
| 152 | -interest:hot:supplier:10001 | |
| 153 | -``` | |
| 154 | - | |
| 155 | ---- | |
| 156 | - | |
| 157 | -## 🔢 关键数字 | |
| 158 | - | |
| 159 | -| 指标 | 数值 | | |
| 160 | -|------|------| | |
| 161 | -| i2i算法数量 | 4种(3行为+1内容) | | |
| 162 | -| 兴趣点维度数量 | 11个(7单+4组合) | | |
| 163 | -| 支持的分类层级 | 4级 | | |
| 164 | -| 列表类型 | 3种(热门/加购/新品) | | |
| 165 | -| 预计索引总数 | 10000-50000条 | | |
| 166 | -| 全部任务运行时间 | 6-10小时 | | |
| 167 | - | |
| 168 | ---- | |
| 169 | - | |
| 170 | -## 💡 核心优势 | |
| 171 | - | |
| 172 | -### 1. 完整性 | |
| 173 | -- ✅ 行为相似 + 内容相似 | |
| 174 | -- ✅ 短期热门 + 长期稳定 | |
| 175 | -- ✅ 粗粒度 + 细粒度 | |
| 176 | - | |
| 177 | -### 2. 灵活性 | |
| 178 | -- ✅ 支持4级分类查询 | |
| 179 | -- ✅ 支持供应商维度 | |
| 180 | -- ✅ 支持多维度组合 | |
| 181 | - | |
| 182 | -### 3. 可扩展性 | |
| 183 | -- ✅ 易于添加新维度 | |
| 184 | -- ✅ 易于添加新算法 | |
| 185 | -- ✅ 配置化管理 | |
| 186 | - | |
| 187 | -### 4. 实用性 | |
| 188 | -- ✅ 适配真实数据 | |
| 189 | -- ✅ 参考现有代码 | |
| 190 | -- ✅ 文档完善 | |
| 191 | - | |
| 192 | ---- | |
| 193 | - | |
| 194 | -## ⚙️ 配置文件 | |
| 195 | - | |
| 196 | -主要配置在 `config/offline_config.py`: | |
| 197 | - | |
| 198 | -```python | |
| 199 | -# 时间配置 | |
| 200 | -LOOKBACK_DAYS = 730 # 2年数据 | |
| 201 | - | |
| 202 | -# 行为权重 | |
| 203 | -behavior_weights = { | |
| 204 | - 'click': 1.0, | |
| 205 | - 'addToCart': 3.0, | |
| 206 | - 'contactFactory': 5.0, | |
| 207 | - 'purchase': 10.0 | |
| 208 | -} | |
| 209 | - | |
| 210 | -# 时间衰减 | |
| 211 | -time_decay_factor = 0.95 # 每30天衰减5% | |
| 212 | -``` | |
| 213 | - | |
| 214 | ---- | |
| 215 | - | |
| 216 | -## 🔧 运行选项 | |
| 217 | - | |
| 218 | -### 运行单个算法 | |
| 219 | -```bash | |
| 220 | -python3 run_all.py --only-swing # 只运行Swing | |
| 221 | -python3 run_all.py --only-content # 只运行内容相似 | |
| 222 | -python3 run_all.py --only-interest # 只运行兴趣点聚合 | |
| 223 | -``` | |
| 224 | - | |
| 225 | -### 跳过某些算法 | |
| 226 | -```bash | |
| 227 | -python3 run_all.py --skip-i2i # 跳过i2i | |
| 228 | -python3 run_all.py --skip-interest # 跳过兴趣点聚合 | |
| 229 | -``` | |
| 230 | - | |
| 231 | -### 调整参数 | |
| 232 | -```bash | |
| 233 | -# 小数据量测试 | |
| 234 | -python3 run_all.py --lookback_days 30 --top_n 10 | |
| 235 | - | |
| 236 | -# 完整数据 | |
| 237 | -python3 run_all.py --lookback_days 730 --top_n 50 | |
| 238 | -``` | |
| 239 | - | |
| 240 | ---- | |
| 241 | - | |
| 242 | -## 📞 遇到问题? | |
| 243 | - | |
| 244 | -### 1. 字段错误 | |
| 245 | -查看:**FIELD_MAPPING.md** 和 **DATABASE_SETUP.md** | |
| 246 | - | |
| 247 | -### 2. 运行错误 | |
| 248 | -查看:**TROUBLESHOOTING.md** | |
| 249 | - | |
| 250 | -### 3. 使用疑问 | |
| 251 | -查看:**README.md** 和 **COMPLETE_INDEX_LIST.md** | |
| 252 | - | |
| 253 | -### 4. 查看日志 | |
| 254 | -```bash | |
| 255 | -tail -f logs/run_all_*.log | |
| 256 | -``` | |
| 257 | - | |
| 258 | ---- | |
| 259 | - | |
| 260 | -## 🎉 开始使用 | |
| 261 | - | |
| 262 | -```bash | |
| 263 | -# 1. 进入目录 | |
| 264 | -cd /home/tw/recommendation/offline_tasks | |
| 265 | - | |
| 266 | -# 2. 安装依赖 | |
| 267 | -bash install.sh | |
| 268 | - | |
| 269 | -# 3. 测试连接 | |
| 270 | -python3 test_connection.py | |
| 271 | - | |
| 272 | -# 4. 运行任务 | |
| 273 | -python3 run_all.py --lookback_days 730 --top_n 50 | |
| 274 | - | |
| 275 | -# 5. 查看输出 | |
| 276 | -ls -lh output/ | |
| 277 | -head -5 output/* | |
| 278 | - | |
| 279 | -# 6. 加载到Redis(可选) | |
| 280 | -python3 scripts/load_index_to_redis.py | |
| 281 | -``` | |
| 282 | - | |
| 283 | ---- | |
| 284 | - | |
| 285 | -## 📦 交付清单 | |
| 286 | - | |
| 287 | -- ✅ 4种i2i算法实现 | |
| 288 | -- ✅ 兴趣点聚合(11个维度) | |
| 289 | -- ✅ 统一调度脚本 | |
| 290 | -- ✅ Redis加载工具 | |
| 291 | -- ✅ 测试和示例脚本 | |
| 292 | -- ✅ 13份完整文档 | |
| 293 | -- ✅ 配置文件和依赖清单 | |
| 294 | - | |
| 295 | ---- | |
| 296 | - | |
| 297 | -**状态**: ✅ 已完成并可用 | |
| 298 | -**版本**: v1.1 | |
| 299 | -**日期**: 2025-10-16 | |
| 300 | -**代码行数**: ~2500行 | |
| 301 | - | |
| 302 | -**开始探索**: 建议先阅读 **QUICKSTART.md** |
offline_tasks/doc/完整索引列表.md deleted
| ... | ... | @@ -1,350 +0,0 @@ |
| 1 | -# 完整索引清单 | |
| 2 | - | |
| 3 | -## 📋 所有可用的推荐索引 | |
| 4 | - | |
| 5 | -### 1. i2i 相似度索引 | |
| 6 | - | |
| 7 | -#### 1.1 行为相似索引(3种) | |
| 8 | - | |
| 9 | -**Swing算法**: | |
| 10 | -``` | |
| 11 | -i2i:swing:{item_id} | |
| 12 | -``` | |
| 13 | -示例:`i2i:swing:12345` | |
| 14 | - | |
| 15 | -**Session Word2Vec**: | |
| 16 | -``` | |
| 17 | -i2i:session_w2v:{item_id} | |
| 18 | -``` | |
| 19 | -示例:`i2i:session_w2v:12345` | |
| 20 | - | |
| 21 | -**DeepWalk**: | |
| 22 | -``` | |
| 23 | -i2i:deepwalk:{item_id} | |
| 24 | -``` | |
| 25 | -示例:`i2i:deepwalk:12345` | |
| 26 | - | |
| 27 | -#### 1.2 内容相似索引(3种方法) | |
| 28 | - | |
| 29 | -**混合方法(推荐)**: | |
| 30 | -``` | |
| 31 | -i2i:content_hybrid:{item_id} | |
| 32 | -``` | |
| 33 | -示例:`i2i:content_hybrid:12345` | |
| 34 | - | |
| 35 | -**TF-IDF方法**: | |
| 36 | -``` | |
| 37 | -i2i:content_tfidf:{item_id} | |
| 38 | -``` | |
| 39 | -示例:`i2i:content_tfidf:12345` | |
| 40 | - | |
| 41 | -**分类方法**: | |
| 42 | -``` | |
| 43 | -i2i:content_category:{item_id} | |
| 44 | -``` | |
| 45 | -示例:`i2i:content_category:12345` | |
| 46 | - | |
| 47 | ---- | |
| 48 | - | |
| 49 | -### 2. 兴趣点聚合索引 | |
| 50 | - | |
| 51 | -格式:`interest:{list_type}:{dimension}:{value}` | |
| 52 | - | |
| 53 | -#### 2.1 列表类型(list_type) | |
| 54 | - | |
| 55 | -- `hot` - 热门商品 | |
| 56 | -- `cart` - 加购商品 | |
| 57 | -- `new` - 新品 | |
| 58 | -- `global` - 全局(所有数据) | |
| 59 | - | |
| 60 | -#### 2.2 单维度索引 | |
| 61 | - | |
| 62 | -##### 业务平台(platform) | |
| 63 | -``` | |
| 64 | -interest:hot:platform:pc | |
| 65 | -interest:hot:platform:mobile | |
| 66 | -interest:cart:platform:pc | |
| 67 | -interest:new:platform:mobile | |
| 68 | -interest:global:platform:pc | |
| 69 | -``` | |
| 70 | - | |
| 71 | -##### 客户端平台(client_platform) | |
| 72 | -``` | |
| 73 | -interest:hot:client_platform:web | |
| 74 | -interest:hot:client_platform:app | |
| 75 | -interest:cart:client_platform:web | |
| 76 | -interest:new:client_platform:app | |
| 77 | -interest:global:client_platform:web | |
| 78 | -``` | |
| 79 | - | |
| 80 | -##### 供应商(supplier) | |
| 81 | -``` | |
| 82 | -interest:hot:supplier:10001 | |
| 83 | -interest:hot:supplier:10002 | |
| 84 | -interest:cart:supplier:10001 | |
| 85 | -interest:new:supplier:10002 | |
| 86 | -interest:global:supplier:10001 | |
| 87 | -``` | |
| 88 | - | |
| 89 | -##### 一级分类(category_level1) | |
| 90 | -``` | |
| 91 | -interest:hot:category_level1:100 | |
| 92 | -interest:cart:category_level1:100 | |
| 93 | -interest:new:category_level1:100 | |
| 94 | -interest:global:category_level1:100 | |
| 95 | -``` | |
| 96 | - | |
| 97 | -##### 二级分类(category_level2) | |
| 98 | -``` | |
| 99 | -interest:hot:category_level2:200 | |
| 100 | -interest:cart:category_level2:200 | |
| 101 | -interest:new:category_level2:200 | |
| 102 | -interest:global:category_level2:200 | |
| 103 | -``` | |
| 104 | - | |
| 105 | -##### 三级分类(category_level3) | |
| 106 | -``` | |
| 107 | -interest:hot:category_level3:300 | |
| 108 | -interest:cart:category_level3:300 | |
| 109 | -interest:new:category_level3:300 | |
| 110 | -interest:global:category_level3:300 | |
| 111 | -``` | |
| 112 | - | |
| 113 | -##### 四级分类(category_level4) | |
| 114 | -``` | |
| 115 | -interest:hot:category_level4:400 | |
| 116 | -interest:cart:category_level4:400 | |
| 117 | -interest:new:category_level4:400 | |
| 118 | -interest:global:category_level4:400 | |
| 119 | -``` | |
| 120 | - | |
| 121 | -#### 2.3 组合维度索引 | |
| 122 | - | |
| 123 | -##### 平台 + 客户端 | |
| 124 | -``` | |
| 125 | -interest:hot:platform_client:pc_web | |
| 126 | -interest:hot:platform_client:pc_app | |
| 127 | -interest:hot:platform_client:mobile_web | |
| 128 | -interest:hot:platform_client:mobile_app | |
| 129 | -``` | |
| 130 | - | |
| 131 | -##### 平台 + 二级分类 | |
| 132 | -``` | |
| 133 | -interest:hot:platform_category2:pc_200 | |
| 134 | -interest:hot:platform_category2:mobile_200 | |
| 135 | -interest:cart:platform_category2:pc_200 | |
| 136 | -interest:new:platform_category2:mobile_200 | |
| 137 | -``` | |
| 138 | - | |
| 139 | -##### 平台 + 三级分类 | |
| 140 | -``` | |
| 141 | -interest:hot:platform_category3:pc_300 | |
| 142 | -interest:hot:platform_category3:mobile_300 | |
| 143 | -interest:cart:platform_category3:pc_300 | |
| 144 | -interest:new:platform_category3:mobile_300 | |
| 145 | -``` | |
| 146 | - | |
| 147 | -##### 客户端平台 + 二级分类 | |
| 148 | -``` | |
| 149 | -interest:hot:client_category2:web_200 | |
| 150 | -interest:hot:client_category2:app_200 | |
| 151 | -interest:cart:client_category2:web_200 | |
| 152 | -interest:new:client_category2:app_200 | |
| 153 | -``` | |
| 154 | - | |
| 155 | ---- | |
| 156 | - | |
| 157 | -## 🎯 按业务场景的索引使用 | |
| 158 | - | |
| 159 | -### 场景1: 首页个性化推荐 | |
| 160 | - | |
| 161 | -**方案A: 基于平台** | |
| 162 | -```python | |
| 163 | -key = f"interest:hot:platform:{user_platform}" | |
| 164 | -# 示例:interest:hot:platform:pc | |
| 165 | -``` | |
| 166 | - | |
| 167 | -**方案B: 基于分类偏好** | |
| 168 | -```python | |
| 169 | -key = f"interest:hot:category_level2:{user_favorite_category}" | |
| 170 | -# 示例:interest:hot:category_level2:200 | |
| 171 | -``` | |
| 172 | - | |
| 173 | -**方案C: 基于平台+分类** | |
| 174 | -```python | |
| 175 | -key = f"interest:hot:platform_category2:{user_platform}_{category_id}" | |
| 176 | -# 示例:interest:hot:platform_category2:pc_200 | |
| 177 | -``` | |
| 178 | - | |
| 179 | -### 场景2: 详情页相关推荐 | |
| 180 | - | |
| 181 | -**方案A: 行为相似** | |
| 182 | -```python | |
| 183 | -key = f"i2i:swing:{current_item_id}" | |
| 184 | -# 示例:i2i:swing:12345 | |
| 185 | -``` | |
| 186 | - | |
| 187 | -**方案B: 内容相似** | |
| 188 | -```python | |
| 189 | -key = f"i2i:content_hybrid:{current_item_id}" | |
| 190 | -# 示例:i2i:content_hybrid:12345 | |
| 191 | -``` | |
| 192 | - | |
| 193 | -**方案C: 融合推荐** | |
| 194 | -```python | |
| 195 | -behavior_similar = redis.get(f"i2i:swing:{item_id}") | |
| 196 | -content_similar = redis.get(f"i2i:content_hybrid:{item_id}") | |
| 197 | -# 融合两种结果 | |
| 198 | -``` | |
| 199 | - | |
| 200 | -### 场景3: 分类页推荐 | |
| 201 | - | |
| 202 | -**方案A: 该分类热门** | |
| 203 | -```python | |
| 204 | -key = f"interest:hot:category_level2:{category_id}" | |
| 205 | -# 示例:interest:hot:category_level2:200 | |
| 206 | -``` | |
| 207 | - | |
| 208 | -**方案B: 该分类新品** | |
| 209 | -```python | |
| 210 | -key = f"interest:new:category_level2:{category_id}" | |
| 211 | -# 示例:interest:new:category_level2:200 | |
| 212 | -``` | |
| 213 | - | |
| 214 | -**方案C: 该分类+平台** | |
| 215 | -```python | |
| 216 | -key = f"interest:hot:platform_category2:{platform}_{category_id}" | |
| 217 | -# 示例:interest:hot:platform_category2:pc_200 | |
| 218 | -``` | |
| 219 | - | |
| 220 | -### 场景4: 供应商店铺页 | |
| 221 | - | |
| 222 | -**方案A: 供应商热门商品** | |
| 223 | -```python | |
| 224 | -key = f"interest:hot:supplier:{supplier_id}" | |
| 225 | -# 示例:interest:hot:supplier:10001 | |
| 226 | -``` | |
| 227 | - | |
| 228 | -**方案B: 供应商新品** | |
| 229 | -```python | |
| 230 | -key = f"interest:new:supplier:{supplier_id}" | |
| 231 | -# 示例:interest:new:supplier:10001 | |
| 232 | -``` | |
| 233 | - | |
| 234 | -### 场景5: 搜索结果页推荐 | |
| 235 | - | |
| 236 | -**方案A: 全局热门** | |
| 237 | -```python | |
| 238 | -key = "interest:global:platform:pc" | |
| 239 | -``` | |
| 240 | - | |
| 241 | -**方案B: 分类相关** | |
| 242 | -```python | |
| 243 | -key = f"interest:global:category_level2:{search_category}" | |
| 244 | -# 示例:interest:global:category_level2:200 | |
| 245 | -``` | |
| 246 | - | |
| 247 | ---- | |
| 248 | - | |
| 249 | -## 📊 索引数量统计 | |
| 250 | - | |
| 251 | -### i2i索引 | |
| 252 | -- 行为相似:3种算法 × 商品数量 | |
| 253 | -- 内容相似:3种方法 × 商品数量 | |
| 254 | -- **总计**:6 × 商品数量 | |
| 255 | - | |
| 256 | -### 兴趣点聚合索引 | |
| 257 | - | |
| 258 | -**单维度**: | |
| 259 | -- platform: 2-10个 | |
| 260 | -- client_platform: 2-5个 | |
| 261 | -- supplier: 100-1000个 | |
| 262 | -- category_level1: 10-50个 | |
| 263 | -- category_level2: 50-200个 | |
| 264 | -- category_level3: 200-1000个 | |
| 265 | -- category_level4: 1000-5000个 | |
| 266 | - | |
| 267 | -**组合维度**: | |
| 268 | -- platform_client: 4-50个 | |
| 269 | -- platform_category2: 100-2000个 | |
| 270 | -- platform_category3: 400-10000个 | |
| 271 | -- client_category2: 100-1000个 | |
| 272 | - | |
| 273 | -**列表类型**:每个维度 × 4种类型(hot/cart/new/global) | |
| 274 | - | |
| 275 | -**预估总数**:10000-50000条索引 | |
| 276 | - | |
| 277 | ---- | |
| 278 | - | |
| 279 | -## 🔍 查询示例代码 | |
| 280 | - | |
| 281 | -### Python示例 | |
| 282 | - | |
| 283 | -```python | |
| 284 | -import redis | |
| 285 | - | |
| 286 | -# 连接Redis | |
| 287 | -r = redis.Redis(host='localhost', port=6379, db=0, decode_responses=True) | |
| 288 | - | |
| 289 | -# 1. 查询商品的相似商品 | |
| 290 | -item_id = "12345" | |
| 291 | -similar_items = r.get(f"i2i:swing:{item_id}") | |
| 292 | -if similar_items: | |
| 293 | - items = similar_items.split(',') | |
| 294 | - for item in items[:5]: # 取前5个 | |
| 295 | - item_id, score = item.split(':') | |
| 296 | - print(f"商品ID: {item_id}, 相似度: {score}") | |
| 297 | - | |
| 298 | -# 2. 查询分类热门商品 | |
| 299 | -category_id = "200" | |
| 300 | -hot_items = r.get(f"interest:hot:category_level2:{category_id}") | |
| 301 | -if hot_items: | |
| 302 | - items = hot_items.split(',') | |
| 303 | - for item in items[:10]: # 取前10个 | |
| 304 | - item_id, score = item.split(':') | |
| 305 | - print(f"商品ID: {item_id}, 得分: {score}") | |
| 306 | - | |
| 307 | -# 3. 查询平台+分类组合 | |
| 308 | -platform = "pc" | |
| 309 | -category_id = "200" | |
| 310 | -key = f"interest:hot:platform_category2:{platform}_{category_id}" | |
| 311 | -items = r.get(key) | |
| 312 | -``` | |
| 313 | - | |
| 314 | -### Redis命令行示例 | |
| 315 | - | |
| 316 | -```bash | |
| 317 | -# 查询商品相似度 | |
| 318 | -redis-cli GET "i2i:swing:12345" | |
| 319 | - | |
| 320 | -# 查询分类热门 | |
| 321 | -redis-cli GET "interest:hot:category_level2:200" | |
| 322 | - | |
| 323 | -# 查询供应商商品 | |
| 324 | -redis-cli GET "interest:hot:supplier:10001" | |
| 325 | - | |
| 326 | -# 模糊查询所有热门索引 | |
| 327 | -redis-cli KEYS "interest:hot:*" | |
| 328 | - | |
| 329 | -# 查看某个分类的所有类型 | |
| 330 | -redis-cli KEYS "interest:*:category_level2:200" | |
| 331 | -``` | |
| 332 | - | |
| 333 | ---- | |
| 334 | - | |
| 335 | -## 📝 注意事项 | |
| 336 | - | |
| 337 | -1. **索引命名规范**:严格遵循 `type:subtype:dimension:value` 格式 | |
| 338 | -2. **值的格式**:`item_id1:score1,item_id2:score2,...` | |
| 339 | -3. **过期时间**:建议设置7天过期 | |
| 340 | -4. **更新频率**:建议每天更新一次 | |
| 341 | -5. **查询优先级**: | |
| 342 | - - 优先使用细粒度索引(如四级分类) | |
| 343 | - - 粗粒度索引作为后备(如一级分类) | |
| 344 | - - 融合多个索引结果 | |
| 345 | - | |
| 346 | ---- | |
| 347 | - | |
| 348 | -**版本**: v1.1 | |
| 349 | -**生成日期**: 2025-10-16 | |
| 350 | -**索引总数**: 约10000-50000条 |
offline_tasks/doc/快速开始.md deleted
| ... | ... | @@ -1,213 +0,0 @@ |
| 1 | -# 离线任务快速启动指南 | |
| 2 | - | |
| 3 | -## 一、环境准备 | |
| 4 | - | |
| 5 | -### 1. 安装依赖 | |
| 6 | - | |
| 7 | -```bash | |
| 8 | -cd /home/tw/recommendation | |
| 9 | -pip install -r requirements.txt | |
| 10 | -``` | |
| 11 | - | |
| 12 | -### 2. 配置数据库和Redis | |
| 13 | - | |
| 14 | -编辑配置文件 `offline_tasks/config/offline_config.py`,确保数据库和Redis连接信息正确: | |
| 15 | - | |
| 16 | -```python | |
| 17 | -# 数据库配置 | |
| 18 | -DB_CONFIG = { | |
| 19 | - 'host': 'your_db_host', | |
| 20 | - 'port': '9030', | |
| 21 | - 'database': 'datacenter', | |
| 22 | - 'username': 'readonly', | |
| 23 | - 'password': 'your_password' | |
| 24 | -} | |
| 25 | - | |
| 26 | -# Redis配置 | |
| 27 | -REDIS_CONFIG = { | |
| 28 | - 'host': 'your_redis_host', | |
| 29 | - 'port': 6379, | |
| 30 | - 'db': 0, | |
| 31 | - 'password': None | |
| 32 | -} | |
| 33 | -``` | |
| 34 | - | |
| 35 | -## 二、运行离线任务 | |
| 36 | - | |
| 37 | -### 方式1:运行所有任务(推荐) | |
| 38 | - | |
| 39 | -```bash | |
| 40 | -cd /home/tw/recommendation/offline_tasks | |
| 41 | -python run_all.py --lookback_days 730 --top_n 50 | |
| 42 | -``` | |
| 43 | - | |
| 44 | -这将依次运行: | |
| 45 | -1. Swing算法(i2i相似度) | |
| 46 | -2. Session Word2Vec(i2i相似度) | |
| 47 | -3. DeepWalk算法(i2i相似度) | |
| 48 | -4. 兴趣点聚合(多维度商品索引) | |
| 49 | - | |
| 50 | -### 方式2:运行单个任务 | |
| 51 | - | |
| 52 | -#### 运行Swing算法 | |
| 53 | - | |
| 54 | -```bash | |
| 55 | -cd /home/tw/recommendation/offline_tasks | |
| 56 | -python scripts/i2i_swing.py --lookback_days 730 --top_n 50 --time_decay | |
| 57 | -``` | |
| 58 | - | |
| 59 | -#### 运行Session Word2Vec | |
| 60 | - | |
| 61 | -```bash | |
| 62 | -python scripts/i2i_session_w2v.py --lookback_days 730 --top_n 50 --save_model | |
| 63 | -``` | |
| 64 | - | |
| 65 | -#### 运行DeepWalk | |
| 66 | - | |
| 67 | -```bash | |
| 68 | -python scripts/i2i_deepwalk.py --lookback_days 730 --top_n 50 --save_model --save_graph | |
| 69 | -``` | |
| 70 | - | |
| 71 | -#### 运行兴趣点聚合 | |
| 72 | - | |
| 73 | -```bash | |
| 74 | -python scripts/interest_aggregation.py --lookback_days 730 --top_n 1000 | |
| 75 | -``` | |
| 76 | - | |
| 77 | -## 三、将索引加载到Redis | |
| 78 | - | |
| 79 | -任务运行完成后,将生成的索引加载到Redis: | |
| 80 | - | |
| 81 | -```bash | |
| 82 | -cd /home/tw/recommendation/offline_tasks | |
| 83 | -python scripts/load_index_to_redis.py --redis-host localhost --redis-port 6379 --expire-days 7 | |
| 84 | -``` | |
| 85 | - | |
| 86 | -参数说明: | |
| 87 | -- `--redis-host`: Redis服务器地址 | |
| 88 | -- `--redis-port`: Redis端口 | |
| 89 | -- `--redis-db`: Redis数据库编号(默认0) | |
| 90 | -- `--expire-days`: 索引过期天数(默认7天) | |
| 91 | - | |
| 92 | -## 四、查看输出结果 | |
| 93 | - | |
| 94 | -所有输出文件都在 `offline_tasks/output/` 目录下: | |
| 95 | - | |
| 96 | -```bash | |
| 97 | -cd /home/tw/recommendation/offline_tasks/output | |
| 98 | -ls -lh | |
| 99 | -``` | |
| 100 | - | |
| 101 | -输出文件示例: | |
| 102 | -``` | |
| 103 | -i2i_swing_20251016.txt | |
| 104 | -i2i_session_w2v_20251016.txt | |
| 105 | -i2i_deepwalk_20251016.txt | |
| 106 | -interest_aggregation_hot_20251016.txt | |
| 107 | -interest_aggregation_cart_20251016.txt | |
| 108 | -interest_aggregation_new_20251016.txt | |
| 109 | -interest_aggregation_global_20251016.txt | |
| 110 | -``` | |
| 111 | - | |
| 112 | -## 五、查看日志 | |
| 113 | - | |
| 114 | -所有运行日志都在 `offline_tasks/logs/` 目录下: | |
| 115 | - | |
| 116 | -```bash | |
| 117 | -cd /home/tw/recommendation/offline_tasks/logs | |
| 118 | -tail -f run_all_20251016.log | |
| 119 | -``` | |
| 120 | - | |
| 121 | -## 六、设置定时任务 | |
| 122 | - | |
| 123 | -### 使用crontab设置每天运行 | |
| 124 | - | |
| 125 | -```bash | |
| 126 | -# 编辑crontab | |
| 127 | -crontab -e | |
| 128 | - | |
| 129 | -# 添加以下行(每天凌晨2点运行) | |
| 130 | -0 2 * * * cd /home/tw/recommendation/offline_tasks && /usr/bin/python3 run_all.py --lookback_days 730 --top_n 50 >> /home/tw/recommendation/offline_tasks/logs/cron.log 2>&1 | |
| 131 | -``` | |
| 132 | - | |
| 133 | -### 运行后自动加载到Redis | |
| 134 | - | |
| 135 | -可以在crontab中添加索引加载任务: | |
| 136 | - | |
| 137 | -```bash | |
| 138 | -# 凌晨6点加载索引到Redis(假设离线任务在4小时内完成) | |
| 139 | -0 6 * * * cd /home/tw/recommendation/offline_tasks && /usr/bin/python3 scripts/load_index_to_redis.py >> /home/tw/recommendation/offline_tasks/logs/load_redis.log 2>&1 | |
| 140 | -``` | |
| 141 | - | |
| 142 | -## 七、验证结果 | |
| 143 | - | |
| 144 | -### 查看文件内容 | |
| 145 | - | |
| 146 | -```bash | |
| 147 | -# 查看i2i相似度 | |
| 148 | -head -n 5 output/i2i_swing_20251016.txt | |
| 149 | - | |
| 150 | -# 查看兴趣点聚合 | |
| 151 | -head -n 5 output/interest_aggregation_hot_20251016.txt | |
| 152 | -``` | |
| 153 | - | |
| 154 | -### 从Redis查询 | |
| 155 | - | |
| 156 | -```bash | |
| 157 | -# 使用redis-cli | |
| 158 | -redis-cli | |
| 159 | - | |
| 160 | -# 查看i2i相似度 | |
| 161 | -GET i2i:swing:123456 | |
| 162 | - | |
| 163 | -# 查看兴趣点索引 | |
| 164 | -GET interest:hot:platform:PC | |
| 165 | -GET interest:global:country:US | |
| 166 | -``` | |
| 167 | - | |
| 168 | -## 八、常见问题 | |
| 169 | - | |
| 170 | -### Q1: 任务运行时间太长怎么办? | |
| 171 | - | |
| 172 | -A: 可以尝试: | |
| 173 | -1. 减少 `--lookback_days` 参数(如改为365天) | |
| 174 | -2. 减少 `--top_n` 参数(如改为20) | |
| 175 | -3. 在更强大的机器上运行 | |
| 176 | -4. 考虑分布式运行不同算法 | |
| 177 | - | |
| 178 | -### Q2: 内存不足怎么办? | |
| 179 | - | |
| 180 | -A: | |
| 181 | -1. Swing算法特别消耗内存,可以先跳过:`python run_all.py --skip-i2i` | |
| 182 | -2. 只运行DeepWalk或Session W2V | |
| 183 | -3. 对数据进行采样 | |
| 184 | - | |
| 185 | -### Q3: 数据库连接超时怎么办? | |
| 186 | - | |
| 187 | -A: | |
| 188 | -1. 检查数据库配置是否正确 | |
| 189 | -2. 检查网络连接 | |
| 190 | -3. 增加SQL查询的超时时间 | |
| 191 | -4. 分批查询数据 | |
| 192 | - | |
| 193 | -### Q4: 如何只更新特定维度的索引? | |
| 194 | - | |
| 195 | -A: 修改 `interest_aggregation.py` 脚本,注释掉不需要的维度计算代码。 | |
| 196 | - | |
| 197 | -## 九、性能参考 | |
| 198 | - | |
| 199 | -在标准配置(730天数据,top_n=50)下的预估运行时间: | |
| 200 | - | |
| 201 | -| 任务 | 数据量 | 预估时间 | 内存占用 | | |
| 202 | -|------|--------|---------|---------| | |
| 203 | -| Swing | 100万条行为 | 2-4小时 | 4-8GB | | |
| 204 | -| Session W2V | 100万条行为 | 30-60分钟 | 2-4GB | | |
| 205 | -| DeepWalk | 100万条行为 | 1-2小时 | 2-4GB | | |
| 206 | -| 兴趣点聚合 | 100万条行为 | 30-60分钟 | 2-4GB | | |
| 207 | - | |
| 208 | -实际时间会因数据量和机器配置而异。 | |
| 209 | - | |
| 210 | -## 十、联系与支持 | |
| 211 | - | |
| 212 | -如有问题,请查看日志文件或联系开发团队。 | |
| 213 | - |
offline_tasks/doc/故障排查指南.md deleted
| ... | ... | @@ -1,217 +0,0 @@ |
| 1 | -# 故障排除指南 | |
| 2 | - | |
| 3 | -## 常见问题及解决方案 | |
| 4 | - | |
| 5 | -### 1. 数据库字段错误 | |
| 6 | - | |
| 7 | -#### 问题: | |
| 8 | -``` | |
| 9 | -pymysql.err.OperationalError: (1105, "errCode = 2, detailMessage = Unknown column 'xxx' in 'xxx'") | |
| 10 | -``` | |
| 11 | - | |
| 12 | -#### 原因: | |
| 13 | -数据库表结构与代码中使用的字段名不匹配。 | |
| 14 | - | |
| 15 | -#### 解决方案: | |
| 16 | -1. 查看 `DATABASE_SETUP.md` 了解如何配置字段 | |
| 17 | -2. 修改对应脚本中的SQL查询,使用实际存在的字段名 | |
| 18 | -3. 如果是分类字段不存在,这些字段是可选的,代码会自动跳过 | |
| 19 | - | |
| 20 | -#### 已修复的字段: | |
| 21 | -- ✅ `category_level2_id` 和 `category_level3_id` 现在是可选的 | |
| 22 | -- ✅ 基础功能不依赖分类字段 | |
| 23 | - | |
| 24 | ---- | |
| 25 | - | |
| 26 | -### 2. 连接超时 | |
| 27 | - | |
| 28 | -#### 问题: | |
| 29 | -``` | |
| 30 | -pymysql.err.OperationalError: (2003, "Can't connect to MySQL server...") | |
| 31 | -``` | |
| 32 | - | |
| 33 | -#### 解决方案: | |
| 34 | -1. 检查数据库配置:`config/offline_config.py` | |
| 35 | -2. 确认网络连接和防火墙设置 | |
| 36 | -3. 运行测试:`python3 test_connection.py` | |
| 37 | - | |
| 38 | ---- | |
| 39 | - | |
| 40 | -### 3. 内存不足 | |
| 41 | - | |
| 42 | -#### 问题: | |
| 43 | -程序运行时内存占用过高或被杀死。 | |
| 44 | - | |
| 45 | -#### 解决方案: | |
| 46 | -1. 减少回溯天数:`--lookback_days 365`(从730改为365) | |
| 47 | -2. 减少输出数量:`--top_n 20`(从50改为20) | |
| 48 | -3. 先运行单个算法: | |
| 49 | - ```bash | |
| 50 | - python3 scripts/i2i_session_w2v.py # 内存占用较小 | |
| 51 | - ``` | |
| 52 | -4. 跳过Swing算法(内存占用最大): | |
| 53 | - ```bash | |
| 54 | - python3 run_all.py --skip-i2i | |
| 55 | - ``` | |
| 56 | - | |
| 57 | ---- | |
| 58 | - | |
| 59 | -### 4. 运行时间过长 | |
| 60 | - | |
| 61 | -#### 解决方案: | |
| 62 | -1. 减少数据量:`--lookback_days 180` | |
| 63 | -2. 只运行特定算法: | |
| 64 | - ```bash | |
| 65 | - python3 run_all.py --only-w2v | |
| 66 | - ``` | |
| 67 | -3. 考虑使用C++版本的Swing(性能提升10倍) | |
| 68 | - | |
| 69 | ---- | |
| 70 | - | |
| 71 | -### 5. 依赖包安装失败 | |
| 72 | - | |
| 73 | -#### 解决方案: | |
| 74 | -```bash | |
| 75 | -# 单独安装失败的包 | |
| 76 | -pip3 install pandas sqlalchemy pymysql gensim numpy | |
| 77 | - | |
| 78 | -# 或使用国内镜像 | |
| 79 | -pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple | |
| 80 | -``` | |
| 81 | - | |
| 82 | ---- | |
| 83 | - | |
| 84 | -### 6. Redis连接失败 | |
| 85 | - | |
| 86 | -#### 问题: | |
| 87 | -``` | |
| 88 | -redis.exceptions.ConnectionError: Error connecting to Redis | |
| 89 | -``` | |
| 90 | - | |
| 91 | -#### 解决方案: | |
| 92 | -1. Redis是可选的,只影响索引加载功能 | |
| 93 | -2. 如果不需要Redis,可以跳过: | |
| 94 | - ```bash | |
| 95 | - python3 run_all.py # 只运行离线任务,不加载到Redis | |
| 96 | - ``` | |
| 97 | -3. 如果需要Redis,确认Redis已安装并运行: | |
| 98 | - ```bash | |
| 99 | - redis-cli ping # 应该返回 PONG | |
| 100 | - ``` | |
| 101 | - | |
| 102 | ---- | |
| 103 | - | |
| 104 | -### 7. 输出文件为空 | |
| 105 | - | |
| 106 | -#### 可能原因: | |
| 107 | -1. 数据量太少(没有满足最小阈值) | |
| 108 | -2. 时间范围内没有数据 | |
| 109 | -3. SQL查询条件过于严格 | |
| 110 | - | |
| 111 | -#### 解决方案: | |
| 112 | -1. 检查日志:`tail -f logs/run_all_*.log` | |
| 113 | -2. 调整参数: | |
| 114 | - - 增加时间范围:`--lookback_days 1000` | |
| 115 | - - 减少阈值:修改配置文件中的 `min_interaction_count` | |
| 116 | -3. 检查数据库中是否有数据: | |
| 117 | - ```python | |
| 118 | - # 运行简单查询测试 | |
| 119 | - python3 test_connection.py | |
| 120 | - ``` | |
| 121 | - | |
| 122 | ---- | |
| 123 | - | |
| 124 | -### 8. 权限问题 | |
| 125 | - | |
| 126 | -#### 问题: | |
| 127 | -``` | |
| 128 | -PermissionError: [Errno 13] Permission denied | |
| 129 | -``` | |
| 130 | - | |
| 131 | -#### 解决方案: | |
| 132 | -```bash | |
| 133 | -# 给脚本添加执行权限 | |
| 134 | -chmod +x install.sh run_all.py | |
| 135 | - | |
| 136 | -# 确保有写入权限 | |
| 137 | -chmod 755 output/ logs/ | |
| 138 | -``` | |
| 139 | - | |
| 140 | ---- | |
| 141 | - | |
| 142 | -### 9. Python版本问题 | |
| 143 | - | |
| 144 | -#### 要求: | |
| 145 | -Python 3.7+ | |
| 146 | - | |
| 147 | -#### 检查版本: | |
| 148 | -```bash | |
| 149 | -python3 --version | |
| 150 | -``` | |
| 151 | - | |
| 152 | -#### 如果版本过低,需要升级Python | |
| 153 | - | |
| 154 | ---- | |
| 155 | - | |
| 156 | -### 10. 编码问题 | |
| 157 | - | |
| 158 | -#### 问题: | |
| 159 | -``` | |
| 160 | -UnicodeDecodeError: 'utf-8' codec can't decode byte... | |
| 161 | -``` | |
| 162 | - | |
| 163 | -#### 解决方案: | |
| 164 | -确保所有文件使用UTF-8编码,特别是配置文件和输出文件。 | |
| 165 | - | |
| 166 | ---- | |
| 167 | - | |
| 168 | -## 调试技巧 | |
| 169 | - | |
| 170 | -### 1. 查看详细日志 | |
| 171 | -```bash | |
| 172 | -tail -f logs/run_all_*.log | |
| 173 | -``` | |
| 174 | - | |
| 175 | -### 2. 运行单个任务(便于调试) | |
| 176 | -```bash | |
| 177 | -python3 scripts/i2i_swing.py --lookback_days 30 --top_n 10 | |
| 178 | -``` | |
| 179 | - | |
| 180 | -### 3. 使用较小的数据量测试 | |
| 181 | -```bash | |
| 182 | -python3 run_all.py --lookback_days 30 --top_n 10 | |
| 183 | -``` | |
| 184 | - | |
| 185 | -### 4. 检查中间结果 | |
| 186 | -```bash | |
| 187 | -ls -lh output/ | |
| 188 | -head -n 20 output/i2i_swing_*.txt | |
| 189 | -``` | |
| 190 | - | |
| 191 | ---- | |
| 192 | - | |
| 193 | -## 获取支持 | |
| 194 | - | |
| 195 | -如果以上方法都无法解决问题: | |
| 196 | - | |
| 197 | -1. **查看文档**: | |
| 198 | - - `README.md` - 详细说明 | |
| 199 | - - `DATABASE_SETUP.md` - 数据库配置 | |
| 200 | - - `QUICKSTART.md` - 快速开始 | |
| 201 | - | |
| 202 | -2. **查看日志**: | |
| 203 | - - `logs/` 目录下的所有日志文件 | |
| 204 | - | |
| 205 | -3. **简化测试**: | |
| 206 | - - 先运行 `test_connection.py` | |
| 207 | - - 再运行单个脚本 | |
| 208 | - - 使用小数据量测试 | |
| 209 | - | |
| 210 | -4. **记录错误信息**: | |
| 211 | - - 完整的错误堆栈 | |
| 212 | - - 使用的命令 | |
| 213 | - - 配置文件内容 | |
| 214 | - | |
| 215 | ---- | |
| 216 | - | |
| 217 | -**提示**:大部分问题都与数据库字段名不匹配有关,请优先查看 `DATABASE_SETUP.md`。 |
offline_tasks/doc/数据库配置说明.md deleted
| ... | ... | @@ -1,179 +0,0 @@ |
| 1 | -# 数据库字段配置说明 | |
| 2 | - | |
| 3 | -## 问题说明 | |
| 4 | - | |
| 5 | -如果运行时遇到类似 `Unknown column 'xxx'` 的错误,说明数据库表结构与代码中使用的字段名不匹配。 | |
| 6 | - | |
| 7 | -## 已适配的基础字段 | |
| 8 | - | |
| 9 | -当前代码已经适配了以下基础字段(参考 `item_sim.py`): | |
| 10 | - | |
| 11 | -### sensors_events 表 | |
| 12 | -- `anonymous_id` - 用户ID | |
| 13 | -- `item_id` - 商品ID | |
| 14 | -- `event` - 事件类型 | |
| 15 | -- `create_time` - 创建时间 | |
| 16 | -- `platform` - 平台(可选) | |
| 17 | -- `country` - 国家(可选) | |
| 18 | -- `customer_type` - 客户类型(可选) | |
| 19 | - | |
| 20 | -### prd_goods_sku 表 | |
| 21 | -- `id` - 商品ID | |
| 22 | -- `name` - 商品名称 | |
| 23 | -- `create_time` - 创建时间(用于判断新品) | |
| 24 | - | |
| 25 | -## 可选字段配置 | |
| 26 | - | |
| 27 | -如果您的数据库表包含以下字段,可以在SQL查询中添加它们以支持更多维度: | |
| 28 | - | |
| 29 | -### 分类字段(可选) | |
| 30 | -- `category_level1_id` - 一级分类ID | |
| 31 | -- `category_level2_id` - 二级分类ID | |
| 32 | -- `category_level3_id` - 三级分类ID | |
| 33 | - | |
| 34 | -## 如何添加分类字段支持 | |
| 35 | - | |
| 36 | -如果您的数据库有分类字段,可以按以下步骤启用: | |
| 37 | - | |
| 38 | -### 步骤1: 修改 SQL 查询 | |
| 39 | - | |
| 40 | -编辑 `scripts/interest_aggregation.py`,找到 SQL 查询部分,添加分类字段: | |
| 41 | - | |
| 42 | -```python | |
| 43 | -sql_query = f""" | |
| 44 | -SELECT | |
| 45 | - se.anonymous_id AS user_id, | |
| 46 | - se.item_id, | |
| 47 | - se.event AS event_type, | |
| 48 | - se.create_time, | |
| 49 | - pgs.name AS item_name, | |
| 50 | - pgs.create_time AS item_create_time, | |
| 51 | - pgs.category_level2_id, # 添加这一行 | |
| 52 | - pgs.category_level3_id, # 添加这一行 | |
| 53 | - se.platform, | |
| 54 | - se.country, | |
| 55 | - se.customer_type | |
| 56 | -FROM | |
| 57 | - sensors_events se | |
| 58 | -LEFT JOIN prd_goods_sku pgs ON se.item_id = pgs.id | |
| 59 | -... | |
| 60 | -""" | |
| 61 | -``` | |
| 62 | - | |
| 63 | -### 步骤2: 修改聚合逻辑 | |
| 64 | - | |
| 65 | -在 `aggregate_by_dimensions` 函数中,字段检查已经做好了,如果字段存在会自动使用: | |
| 66 | - | |
| 67 | -```python | |
| 68 | -# 维度4: 二级分类 (category_level2) - 如果字段存在 | |
| 69 | -if 'category_level2_id' in row and pd.notna(row.get('category_level2_id')): | |
| 70 | - key = f"category_level2:{row['category_level2_id']}" | |
| 71 | - aggregations[key][item_id] += weight | |
| 72 | -``` | |
| 73 | - | |
| 74 | -这段代码会自动检测字段是否存在,如果存在就使用,不存在就跳过。 | |
| 75 | - | |
| 76 | -## 查看实际表结构 | |
| 77 | - | |
| 78 | -运行以下命令查看您的数据库表结构: | |
| 79 | - | |
| 80 | -```python | |
| 81 | -# 创建一个简单的脚本查看表结构 | |
| 82 | -import pandas as pd | |
| 83 | -from db_service import create_db_connection | |
| 84 | -from offline_tasks.config.offline_config import DB_CONFIG | |
| 85 | - | |
| 86 | -engine = create_db_connection( | |
| 87 | - DB_CONFIG['host'], | |
| 88 | - DB_CONFIG['port'], | |
| 89 | - DB_CONFIG['database'], | |
| 90 | - DB_CONFIG['username'], | |
| 91 | - DB_CONFIG['password'] | |
| 92 | -) | |
| 93 | - | |
| 94 | -# 查看 prd_goods_sku 表结构 | |
| 95 | -df = pd.read_sql("SELECT * FROM prd_goods_sku LIMIT 1", engine) | |
| 96 | -print("prd_goods_sku 字段列表:") | |
| 97 | -for col in df.columns: | |
| 98 | - print(f" - {col}") | |
| 99 | - | |
| 100 | -# 查看 sensors_events 表结构 | |
| 101 | -df = pd.read_sql("SELECT * FROM sensors_events LIMIT 1", engine) | |
| 102 | -print("\nsensors_events 字段列表:") | |
| 103 | -for col in df.columns: | |
| 104 | - print(f" - {col}") | |
| 105 | -``` | |
| 106 | - | |
| 107 | -## 常见字段名映射 | |
| 108 | - | |
| 109 | -如果您的数据库使用不同的字段名,需要在SQL查询中做映射: | |
| 110 | - | |
| 111 | -| 代码中的字段 | 可能的实际字段名 | 修改方式 | | |
| 112 | -|-------------|----------------|---------| | |
| 113 | -| `category_level2_id` | `cat2_id`, `category2`, `second_category` | `pgs.cat2_id AS category_level2_id` | | |
| 114 | -| `category_level3_id` | `cat3_id`, `category3`, `third_category` | `pgs.cat3_id AS category_level3_id` | | |
| 115 | -| `anonymous_id` | `user_id`, `uid`, `visitor_id` | `se.user_id AS anonymous_id` | | |
| 116 | -| `customer_type` | `client_type`, `buyer_type` | `se.client_type AS customer_type` | | |
| 117 | - | |
| 118 | -## 完整示例 | |
| 119 | - | |
| 120 | -假设您的表结构是: | |
| 121 | -- `prd_goods_sku` 有字段:`id`, `title`, `cat2`, `cat3`, `add_time` | |
| 122 | -- `sensors_events` 有字段:`uid`, `goods_id`, `action`, `time` | |
| 123 | - | |
| 124 | -则需要修改SQL为: | |
| 125 | - | |
| 126 | -```python | |
| 127 | -sql_query = f""" | |
| 128 | -SELECT | |
| 129 | - se.uid AS user_id, | |
| 130 | - se.goods_id AS item_id, | |
| 131 | - se.action AS event_type, | |
| 132 | - se.time AS create_time, | |
| 133 | - pgs.title AS item_name, | |
| 134 | - pgs.add_time AS item_create_time, | |
| 135 | - pgs.cat2 AS category_level2_id, | |
| 136 | - pgs.cat3 AS category_level3_id | |
| 137 | -FROM | |
| 138 | - sensors_events se | |
| 139 | -LEFT JOIN prd_goods_sku pgs ON se.goods_id = pgs.id | |
| 140 | -... | |
| 141 | -""" | |
| 142 | -``` | |
| 143 | - | |
| 144 | -## 最小化配置 | |
| 145 | - | |
| 146 | -如果只想先测试基本功能,可以只使用最基础的字段: | |
| 147 | - | |
| 148 | -### i2i 算法只需要: | |
| 149 | -- `anonymous_id` / `user_id` | |
| 150 | -- `item_id` | |
| 151 | -- `event` / `event_type` | |
| 152 | -- `create_time` | |
| 153 | -- `name` (商品名称) | |
| 154 | - | |
| 155 | -### 兴趣点聚合至少需要: | |
| 156 | -- 以上i2i的字段 | |
| 157 | -- 至少一个维度字段(如 `platform` 或 `country`) | |
| 158 | - | |
| 159 | -## 测试连接 | |
| 160 | - | |
| 161 | -修改后,运行测试脚本验证: | |
| 162 | - | |
| 163 | -```bash | |
| 164 | -cd /home/tw/recommendation/offline_tasks | |
| 165 | -python3 test_connection.py | |
| 166 | -``` | |
| 167 | - | |
| 168 | -## 获取帮助 | |
| 169 | - | |
| 170 | -如果仍有问题,请: | |
| 171 | -1. 查看日志文件:`logs/run_all_*.log` | |
| 172 | -2. 运行单个脚本测试,便于调试 | |
| 173 | -3. 使用 `--help` 参数查看命令行选项 | |
| 174 | - | |
| 175 | -```bash | |
| 176 | -python3 scripts/i2i_swing.py --help | |
| 177 | -python3 scripts/interest_aggregation.py --help | |
| 178 | -``` | |
| 179 | - |
offline_tasks/doc/更新日志.md deleted
| ... | ... | @@ -1,43 +0,0 @@ |
| 1 | -# 更新日志 | |
| 2 | - | |
| 3 | -## v1.0.1 (2025-10-16) | |
| 4 | - | |
| 5 | -### 修复 | |
| 6 | -- **数据库字段适配**: 移除了不存在的 `category_level2_id` 和 `category_level3_id` 字段 | |
| 7 | - - 修改了 `scripts/i2i_swing.py` 中的SQL查询 | |
| 8 | - - 修改了 `scripts/interest_aggregation.py` 中的SQL查询和聚合逻辑 | |
| 9 | - - 分类字段现在是可选的,如果数据库有这些字段可以手动添加 | |
| 10 | - | |
| 11 | -### 改进 | |
| 12 | -- **兼容性增强**: 代码现在自动检测字段是否存在再使用 | |
| 13 | -- **文档补充**: 新增 `DATABASE_SETUP.md` 说明如何配置数据库字段 | |
| 14 | - | |
| 15 | -### 使用建议 | |
| 16 | -如果您的数据库有分类字段,请参考 `DATABASE_SETUP.md` 手动添加支持。 | |
| 17 | - | |
| 18 | -基础功能(i2i相似度)不需要分类字段即可正常运行。 | |
| 19 | - | |
| 20 | -## v1.0.0 (2025-10-16) | |
| 21 | - | |
| 22 | -### 新功能 | |
| 23 | -- ✅ 实现 Swing 算法(i2i行为相似) | |
| 24 | -- ✅ 实现 Session Word2Vec 算法 | |
| 25 | -- ✅ 实现 DeepWalk 算法 | |
| 26 | -- ✅ 实现兴趣点聚合索引生成 | |
| 27 | -- ✅ 支持多维度查询(平台/国家/客户类型) | |
| 28 | -- ✅ 支持多列表类型(热门/加购/新品) | |
| 29 | -- ✅ 时间衰减和行为加权 | |
| 30 | -- ✅ 统一调度脚本 | |
| 31 | -- ✅ Redis加载工具 | |
| 32 | -- ✅ 完整文档 | |
| 33 | - | |
| 34 | -### 技术特性 | |
| 35 | -- 参考 `item_sim.py` 适配真实数据 | |
| 36 | -- 改写自 `collaboration/` 和 `graphembedding/` 模块 | |
| 37 | -- 支持2年历史数据处理 | |
| 38 | -- 支持定时任务调度 | |
| 39 | - | |
| 40 | ---- | |
| 41 | - | |
| 42 | -**说明**: 如果遇到字段不匹配的问题,请查看 `DATABASE_SETUP.md` 进行配置。 | |
| 43 | - |
offline_tasks/doc/系统改进总结-20241017.md deleted
| ... | ... | @@ -1,445 +0,0 @@ |
| 1 | -# 推荐系统离线任务改进总结 | |
| 2 | - | |
| 3 | -**日期**: 2024-10-17 | |
| 4 | -**改进内容**: 前置任务优化、文档整理、算法增强 | |
| 5 | - | |
| 6 | ---- | |
| 7 | - | |
| 8 | -## ✅ 完成的改进 | |
| 9 | - | |
| 10 | -### 1. 前置任务:商品属性获取 | |
| 11 | - | |
| 12 | -**问题**: 多个脚本都需要获取ID->名称映射,导致重复查询数据库,效率低下。 | |
| 13 | - | |
| 14 | -**解决方案**: | |
| 15 | -- ✅ 创建 `fetch_item_attributes.py` 作为前置任务 | |
| 16 | -- ✅ 一次性从数据库获取所有ID->名称映射 | |
| 17 | -- ✅ 保存到本地JSON文件 (`item_attributes_mappings.json`) | |
| 18 | -- ✅ 后续任务直接加载本地文件,避免重复查询 | |
| 19 | - | |
| 20 | -**新增文件**: | |
| 21 | -``` | |
| 22 | -offline_tasks/scripts/fetch_item_attributes.py | |
| 23 | -offline_tasks/output/item_attributes_mappings.json | |
| 24 | -offline_tasks/output/item_attributes_stats.txt | |
| 25 | -``` | |
| 26 | - | |
| 27 | -**修改文件**: | |
| 28 | -``` | |
| 29 | -offline_tasks/scripts/debug_utils.py | |
| 30 | - - 新增 load_name_mappings_from_file() 函数 | |
| 31 | - - fetch_name_mappings() 标记为已弃用 | |
| 32 | - | |
| 33 | -offline_tasks/scripts/add_names_to_swing.py | |
| 34 | - - 改用 load_name_mappings_from_file() | |
| 35 | - - 移除数据库连接代码 | |
| 36 | - | |
| 37 | -offline_tasks/scripts/i2i_swing.py | |
| 38 | - - 改用 load_name_mappings_from_file() | |
| 39 | - - Debug模式加载本地映射 | |
| 40 | - | |
| 41 | -offline_tasks/run_all.py | |
| 42 | - - 添加前置任务1: fetch_item_attributes | |
| 43 | - - 添加前置任务2: generate_session | |
| 44 | - - 调整任务执行顺序 | |
| 45 | -``` | |
| 46 | - | |
| 47 | -**效果**: | |
| 48 | -- ⚡ 大幅减少数据库查询次数 | |
| 49 | -- 🚀 提升整体任务执行速度 | |
| 50 | -- 💾 统一的映射数据源,避免不一致 | |
| 51 | - | |
| 52 | ---- | |
| 53 | - | |
| 54 | -### 2. Session文件生成前置化 | |
| 55 | - | |
| 56 | -**改进**: 将session文件生成作为独立的前置任务 | |
| 57 | - | |
| 58 | -**新增任务流程**: | |
| 59 | -``` | |
| 60 | -run_all.py 执行顺序: | |
| 61 | -前置任务: | |
| 62 | -1. fetch_item_attributes.py → 获取商品属性 | |
| 63 | -2. generate_session.py → 生成用户session文件 | |
| 64 | -3. run_cpp_swing() → C++ Swing算法(使用session) | |
| 65 | - | |
| 66 | -核心算法任务: | |
| 67 | -4. i2i_swing.py → Python Swing算法(启用日期维度) | |
| 68 | -5. i2i_session_w2v.py → Session W2V | |
| 69 | -6. i2i_deepwalk.py → DeepWalk | |
| 70 | -7. i2i_content_similar.py → 内容相似度 | |
| 71 | -8. interest_aggregation.py → 兴趣聚合 | |
| 72 | -``` | |
| 73 | - | |
| 74 | -**好处**: | |
| 75 | -- 📦 Session文件可复用于多个任务 | |
| 76 | -- 🔄 C++版Swing算法可直接使用session文件 | |
| 77 | -- 🎯 数据准备与算法执行解耦 | |
| 78 | - | |
| 79 | ---- | |
| 80 | - | |
| 81 | -### 3. Swing算法增强:支持日期维度 | |
| 82 | - | |
| 83 | -**功能**: i2i_swing.py 现在支持 uid+日期 作为额外的session维度 | |
| 84 | - | |
| 85 | -**实现方式**: | |
| 86 | -```python | |
| 87 | -# 数据duplicate: | |
| 88 | -# 1. 原始数据:uid -> items | |
| 89 | -# 2. 日期数据:uid_YYYYMMDD -> items | |
| 90 | -# 3. 合并后输入Swing算法 | |
| 91 | - | |
| 92 | -# 新增参数 | |
| 93 | ---use_daily_session # 启用日期维度(默认开启) | |
| 94 | ---no_daily_session # 禁用日期维度 | |
| 95 | -``` | |
| 96 | - | |
| 97 | -**示例**: | |
| 98 | -```bash | |
| 99 | -# 使用日期维度(默认) | |
| 100 | -python3 scripts/i2i_swing.py --lookback_days 730 --debug | |
| 101 | - | |
| 102 | -# 禁用日期维度 | |
| 103 | -python3 scripts/i2i_swing.py --lookback_days 730 --no_daily_session | |
| 104 | -``` | |
| 105 | - | |
| 106 | -**效果**: | |
| 107 | -- 📈 同时考虑用户整体行为和单日行为 | |
| 108 | -- 🎯 更精准的物品相似度计算 | |
| 109 | -- 🔍 捕获用户短期和长期兴趣 | |
| 110 | - | |
| 111 | -**原理**: | |
| 112 | -``` | |
| 113 | -原始数据: | |
| 114 | - user_A -> [item1, item2, item3] (跨多天的行为) | |
| 115 | - | |
| 116 | -Duplicate后: | |
| 117 | - user_A -> [item1, item2, item3] # 原始session | |
| 118 | - user_A_20241015 -> [item1] # 10月15日session | |
| 119 | - user_A_20241016 -> [item2, item3] # 10月16日session | |
| 120 | - | |
| 121 | -算法同时考虑: | |
| 122 | -- 用户整体偏好(跨时间) | |
| 123 | -- 用户单日集中行为(同一天购买的商品更相关) | |
| 124 | -``` | |
| 125 | - | |
| 126 | ---- | |
| 127 | - | |
| 128 | -### 4. 文档整理与规范化 | |
| 129 | - | |
| 130 | -**问题**: 文档散乱,临时记录太多,命名不规范。 | |
| 131 | - | |
| 132 | -**解决方案**: | |
| 133 | - | |
| 134 | -#### 4.1 创建统一文档中心 | |
| 135 | -``` | |
| 136 | -offline_tasks/doc/ | |
| 137 | -├── README.md # 文档索引 | |
| 138 | -├── 从这里开始.md | |
| 139 | -├── 快速开始.md | |
| 140 | -├── Swing算法使用指南.md | |
| 141 | -├── 运行脚本指南.md | |
| 142 | -├── 调试指南.md | |
| 143 | -├── 离线索引数据规范.md | |
| 144 | -├── Redis数据规范.md | |
| 145 | -├── 完整索引列表.md | |
| 146 | -├── 数据库配置说明.md | |
| 147 | -├── 故障排查指南.md | |
| 148 | -├── 更新日志.md | |
| 149 | -└── Swing实现总结.md | |
| 150 | -``` | |
| 151 | - | |
| 152 | -#### 4.2 删除临时文档 | |
| 153 | -``` | |
| 154 | -已删除的临时文档(offline_tasks/): | |
| 155 | -- MEMORY_MONITORING_UPDATE.md | |
| 156 | -- LATEST_UPDATES.md | |
| 157 | -- CONTENT_SIMILARITY_UPDATE.md | |
| 158 | -- QUICKSTART_NEW.md | |
| 159 | -- CHANGES_SUMMARY.md | |
| 160 | -- B2B_LOW_FREQUENCY_OPTIMIZATION.md | |
| 161 | -- FIX_NAME_MAPPING.md | |
| 162 | -- QUICK_DEBUG_SUMMARY.md | |
| 163 | -- UPDATE_CONFIG_GUIDE.md | |
| 164 | -- FINAL_UPDATE.md | |
| 165 | -- FINAL_SUMMARY.md | |
| 166 | -- CURRENT_STATUS.md | |
| 167 | -- DELIVERY.md | |
| 168 | -- PROJECT_SUMMARY.md | |
| 169 | -- STRUCTURE.md | |
| 170 | -- FIELD_MAPPING.md | |
| 171 | - | |
| 172 | -已删除的临时文档(根目录): | |
| 173 | -- DEBUG_IMPLEMENTATION_SUMMARY.md | |
| 174 | -- CONFIG_CHANGES_SUMMARY.md | |
| 175 | -- OFFLINE_TASKS_SUMMARY.md | |
| 176 | -- OFFLINE_TASKS_README.md | |
| 177 | -- tables_structure.md | |
| 178 | -``` | |
| 179 | - | |
| 180 | -#### 4.3 文档命名规范 | |
| 181 | -- ✅ 所有重要文档使用中文名 | |
| 182 | -- ✅ 统一放在 `doc/` 目录 | |
| 183 | -- ✅ 创建 `doc/README.md` 索引 | |
| 184 | -- ✅ collaboration目录下的文档同步规范 | |
| 185 | - | |
| 186 | ---- | |
| 187 | - | |
| 188 | -## 📊 改进效果对比 | |
| 189 | - | |
| 190 | -### 数据库查询优化 | |
| 191 | - | |
| 192 | -**改进前**: | |
| 193 | -``` | |
| 194 | -每次运行任务: | |
| 195 | - 1. i2i_swing.py → 查询商品名称 | |
| 196 | - 2. add_names_to_swing → 查询商品名称 | |
| 197 | - 3. 其他debug任务 → 重复查询 | |
| 198 | - | |
| 199 | -总查询次数: 5-10次(取决于任务数) | |
| 200 | -``` | |
| 201 | - | |
| 202 | -**改进后**: | |
| 203 | -``` | |
| 204 | -每次运行任务: | |
| 205 | - 1. fetch_item_attributes.py → 查询1次,保存文件 | |
| 206 | - 2. 所有后续任务 → 加载本地文件 | |
| 207 | - | |
| 208 | -总查询次数: 1次 | |
| 209 | -``` | |
| 210 | - | |
| 211 | -**性能提升**: 减少 80-90% 的数据库查询 | |
| 212 | - | |
| 213 | -### Session文件生成 | |
| 214 | - | |
| 215 | -**改进前**: | |
| 216 | -``` | |
| 217 | -- i2i_swing.py 内部查询数据库 | |
| 218 | -- C++ Swing需要手动准备数据 | |
| 219 | -``` | |
| 220 | - | |
| 221 | -**改进后**: | |
| 222 | -``` | |
| 223 | -- generate_session.py 统一生成 | |
| 224 | -- 支持两种格式(标准/C++) | |
| 225 | -- 所有算法可复用 | |
| 226 | -``` | |
| 227 | - | |
| 228 | -### 文档管理 | |
| 229 | - | |
| 230 | -**改进前**: | |
| 231 | -- 30+ 散乱的Markdown文件 | |
| 232 | -- 无明确分类和索引 | |
| 233 | -- 大量临时记录 | |
| 234 | - | |
| 235 | -**改进后**: | |
| 236 | -- 13个核心文档 | |
| 237 | -- 统一在 doc/ 目录 | |
| 238 | -- 清晰的索引和分类 | |
| 239 | - | |
| 240 | ---- | |
| 241 | - | |
| 242 | -## 🚀 使用指南 | |
| 243 | - | |
| 244 | -### 运行完整流程 | |
| 245 | - | |
| 246 | -```bash | |
| 247 | -cd /home/tw/recommendation/offline_tasks | |
| 248 | - | |
| 249 | -# 方式1: 运行全部任务(推荐) | |
| 250 | -bash run.sh | |
| 251 | - | |
| 252 | -# 方式2: 使用Python版本(简化版) | |
| 253 | -python3 run_all.py --debug | |
| 254 | - | |
| 255 | -# 方式3: 分步运行 | |
| 256 | -# 步骤1: 获取商品属性 | |
| 257 | -python3 scripts/fetch_item_attributes.py | |
| 258 | - | |
| 259 | -# 步骤2: 生成session文件 | |
| 260 | -python3 scripts/generate_session.py --lookback_days 730 | |
| 261 | - | |
| 262 | -# 步骤3: 运行C++ Swing | |
| 263 | -cd collaboration && bash run.sh && cd .. | |
| 264 | - | |
| 265 | -# 步骤4: 运行Python Swing(启用日期维度) | |
| 266 | -python3 scripts/i2i_swing.py --lookback_days 730 --use_daily_session --debug | |
| 267 | -``` | |
| 268 | - | |
| 269 | -### C++ Swing算法 | |
| 270 | - | |
| 271 | -```bash | |
| 272 | -# C++ Swing现已集成到run.sh,会自动执行 | |
| 273 | -# 如需单独运行: | |
| 274 | -cd /home/tw/recommendation/offline_tasks/collaboration | |
| 275 | -bash run.sh | |
| 276 | - | |
| 277 | -# 查看结果 | |
| 278 | -ls -lh output/swing_similar*.txt | |
| 279 | -cat output/swing_similar_readable.txt | head -20 | |
| 280 | -``` | |
| 281 | - | |
| 282 | -### 查看文档 | |
| 283 | - | |
| 284 | -```bash | |
| 285 | -cd /home/tw/recommendation/offline_tasks/doc | |
| 286 | - | |
| 287 | -# 查看文档索引 | |
| 288 | -cat README.md | |
| 289 | - | |
| 290 | -# 快速开始 | |
| 291 | -cat 快速开始.md | |
| 292 | - | |
| 293 | -# 详细使用指南 | |
| 294 | -cat Swing算法使用指南.md | |
| 295 | -``` | |
| 296 | - | |
| 297 | ---- | |
| 298 | - | |
| 299 | -## 📁 文件结构 | |
| 300 | - | |
| 301 | -``` | |
| 302 | -recommendation/ | |
| 303 | -├── offline_tasks/ | |
| 304 | -│ ├── scripts/ | |
| 305 | -│ │ ├── fetch_item_attributes.py # 新增:前置任务 | |
| 306 | -│ │ ├── generate_session.py # 已有:session生成 | |
| 307 | -│ │ ├── add_names_to_swing.py # 修改:使用本地映射 | |
| 308 | -│ │ ├── i2i_swing.py # 修改:支持日期维度 | |
| 309 | -│ │ └── debug_utils.py # 修改:添加加载函数 | |
| 310 | -│ ├── collaboration/ # 移动:C++ Swing目录 | |
| 311 | -│ │ ├── src/ | |
| 312 | -│ │ ├── bin/ | |
| 313 | -│ │ ├── run.sh # 修改:路径更新 | |
| 314 | -│ │ └── output/ | |
| 315 | -│ ├── doc/ # 新增:文档中心 | |
| 316 | -│ │ ├── README.md | |
| 317 | -│ │ ├── 快速开始.md | |
| 318 | -│ │ ├── Swing算法使用指南.md | |
| 319 | -│ │ └── ... | |
| 320 | -│ ├── output/ | |
| 321 | -│ │ ├── item_attributes_mappings.json # 新增:映射文件 | |
| 322 | -│ │ ├── item_attributes_stats.txt # 新增:统计信息 | |
| 323 | -│ │ └── session.txt.YYYYMMDD # session文件 | |
| 324 | -│ ├── run.sh # 新增:主执行脚本 | |
| 325 | -│ ├── run_all.py # 修改:简化版本 | |
| 326 | -│ └── README.md | |
| 327 | -``` | |
| 328 | - | |
| 329 | ---- | |
| 330 | - | |
| 331 | -## 🔧 C++ Swing算法集成 | |
| 332 | - | |
| 333 | -### 改进内容 | |
| 334 | - | |
| 335 | -**之前**: C++ Swing在外层目录,需要手动切换 | |
| 336 | -```bash | |
| 337 | -cd /home/tw/recommendation/collaboration | |
| 338 | -bash run.sh | |
| 339 | -``` | |
| 340 | - | |
| 341 | -**现在**: 已移入offline_tasks,集成到`run.sh`自动执行 | |
| 342 | - | |
| 343 | -### 执行流程 | |
| 344 | - | |
| 345 | -``` | |
| 346 | -run.sh: | |
| 347 | -1. fetch_item_attributes.py | |
| 348 | -2. generate_session.py ← 生成session.txt.YYYYMMDD.cpp | |
| 349 | -3. collaboration/run.sh ← 直接调用C++ Swing | |
| 350 | - ├─ 编译C++程序 | |
| 351 | - ├─ 读取session文件 | |
| 352 | - ├─ 运行Swing算法 | |
| 353 | - ├─ 合并多线程结果 | |
| 354 | - └─ 生成可读版本(自动添加商品名) | |
| 355 | -4. i2i_swing.py ← Python Swing | |
| 356 | -5. i2i_session_w2v.py ← Session W2V | |
| 357 | -6. i2i_deepwalk.py ← DeepWalk | |
| 358 | -7. i2i_content_similar.py ← 内容相似度 | |
| 359 | -8. interest_aggregation.py ← 兴趣聚合 | |
| 360 | -9. load_index_to_redis.py ← 加载到Redis | |
| 361 | -``` | |
| 362 | - | |
| 363 | -### 输出结果 | |
| 364 | - | |
| 365 | -C++ Swing执行后,结果保存在: | |
| 366 | -``` | |
| 367 | -offline_tasks/collaboration/output_YYYYMMDD/ | |
| 368 | -├── sim_matrx.* # 多线程输出 | |
| 369 | -├── swing_similar.txt # 合并结果(ID格式) | |
| 370 | -└── swing_similar_readable.txt # 可读版本(ID:名称格式) | |
| 371 | - | |
| 372 | -offline_tasks/collaboration/output -> output_YYYYMMDD # 软链接 | |
| 373 | -``` | |
| 374 | - | |
| 375 | -### 优势 | |
| 376 | - | |
| 377 | -- ✅ **自动化**: 无需手动切换目录 | |
| 378 | -- ✅ **依赖管理**: 确保session文件已生成 | |
| 379 | -- ✅ **错误处理**: 失败不影响后续任务 | |
| 380 | -- ✅ **日志统一**: 所有任务日志在同一个文件 | |
| 381 | -- ✅ **性能**: C++版本比Python版快10-100倍 | |
| 382 | - | |
| 383 | -### 单独运行 | |
| 384 | - | |
| 385 | -如需单独运行C++ Swing(不执行其他任务): | |
| 386 | -```bash | |
| 387 | -cd /home/tw/recommendation/offline_tasks/collaboration | |
| 388 | -bash run.sh | |
| 389 | -``` | |
| 390 | - | |
| 391 | ---- | |
| 392 | - | |
| 393 | -## 🎯 核心改进点总结 | |
| 394 | - | |
| 395 | -1. **✅ 性能优化**: 减少80-90%的数据库查询 | |
| 396 | -2. **✅ 架构优化**: 前置任务解耦,数据准备与算法分离 | |
| 397 | -3. **✅ 功能增强**: Swing算法支持日期维度 | |
| 398 | -4. **✅ 集成优化**: C++ Swing集成到统一流程 | |
| 399 | -5. **✅ 文档规范**: 统一管理,中文命名,清晰索引 | |
| 400 | -6. **✅ 代码质量**: 无Linter错误,统一编码规范 | |
| 401 | - | |
| 402 | ---- | |
| 403 | - | |
| 404 | -## 📝 后续建议 | |
| 405 | - | |
| 406 | -### 短期优化 | |
| 407 | - | |
| 408 | -1. **监控与告警** | |
| 409 | - - 添加任务执行时间监控 | |
| 410 | - - 映射文件过期检测 | |
| 411 | - - 自动重新获取机制 | |
| 412 | - | |
| 413 | -2. **性能优化** | |
| 414 | - - Session文件增量更新 | |
| 415 | - - 映射文件分批加载 | |
| 416 | - - 并行任务执行 | |
| 417 | - | |
| 418 | -### 长期规划 | |
| 419 | - | |
| 420 | -1. **分布式支持** | |
| 421 | - - 多机协同计算 | |
| 422 | - - 数据分片处理 | |
| 423 | - | |
| 424 | -2. **实时更新** | |
| 425 | - - 在线学习机制 | |
| 426 | - - 增量索引更新 | |
| 427 | - | |
| 428 | -3. **A/B测试框架** | |
| 429 | - - 多版本算法对比 | |
| 430 | - - 效果评估系统 | |
| 431 | - | |
| 432 | ---- | |
| 433 | - | |
| 434 | -## 📞 相关文档 | |
| 435 | - | |
| 436 | -- **快速开始**: [doc/快速开始.md](./快速开始.md) | |
| 437 | -- **详细指南**: [doc/Swing算法使用指南.md](./Swing算法使用指南.md) | |
| 438 | -- **故障排查**: [doc/故障排查指南.md](./故障排查指南.md) | |
| 439 | -- **文档索引**: [doc/README.md](./README.md) | |
| 440 | - | |
| 441 | ---- | |
| 442 | - | |
| 443 | -**改进完成时间**: 2024-10-17 | |
| 444 | -**状态**: ✅ 已完成并测试通过 | |
| 445 | - |
| ... | ... | @@ -0,0 +1,711 @@ |
| 1 | +# 推荐系统离线任务详细设计文档 | |
| 2 | + | |
| 3 | +## 📋 文档说明 | |
| 4 | + | |
| 5 | +本文档是推荐系统离线任务的详细设计文档,包含系统架构、功能模块、实现细节和使用指南。 | |
| 6 | + | |
| 7 | +**最后更新**: 2024-10-17 | |
| 8 | +**版本**: v1.1 | |
| 9 | +**状态**: ✅ 已完成并可用 | |
| 10 | + | |
| 11 | +--- | |
| 12 | + | |
| 13 | +## 📦 项目概述 | |
| 14 | + | |
| 15 | +推荐系统离线任务负责生成各类推荐索引,包括商品相似度索引(i2i)和兴趣点聚合索引,为在线推荐系统提供数据支撑。 | |
| 16 | + | |
| 17 | +### 核心功能 | |
| 18 | + | |
| 19 | +1. **i2i相似度索引**(4种算法) | |
| 20 | + - Swing算法(C++高性能版 + Python版) | |
| 21 | + - Session Word2Vec | |
| 22 | + - DeepWalk | |
| 23 | + - Content-based(内容相似度) | |
| 24 | + | |
| 25 | +2. **兴趣点聚合索引**(11个维度) | |
| 26 | + - 7个单维度:platform、client_platform、supplier、category_level1-4 | |
| 27 | + - 4个组合维度:platform_client、platform_category2、platform_category3、client_category2 | |
| 28 | + - 3种列表类型:hot(热门)、cart(加购)、new(新品)、global(全局) | |
| 29 | + | |
| 30 | +### 技术特点 | |
| 31 | + | |
| 32 | +- ✅ **完整性**: 行为相似 + 内容相似,短期热门 + 长期稳定 | |
| 33 | +- ✅ **灵活性**: 支持4级分类查询,支持多维度组合 | |
| 34 | +- ✅ **可扩展性**: 易于添加新维度和新算法 | |
| 35 | +- ✅ **高性能**: C++ Swing算法性能比Python快10-100倍 | |
| 36 | + | |
| 37 | +--- | |
| 38 | + | |
| 39 | +## 🏗️ 系统架构 | |
| 40 | + | |
| 41 | +### 目录结构 | |
| 42 | + | |
| 43 | +``` | |
| 44 | +offline_tasks/ | |
| 45 | +├── scripts/ # Python脚本 | |
| 46 | +│ ├── fetch_item_attributes.py # 前置任务:获取商品属性 | |
| 47 | +│ ├── generate_session.py # 前置任务:生成session | |
| 48 | +│ ├── i2i_swing.py # Python Swing算法 | |
| 49 | +│ ├── i2i_session_w2v.py # Session W2V | |
| 50 | +│ ├── i2i_deepwalk.py # DeepWalk | |
| 51 | +│ ├── i2i_content_similar.py # 内容相似度 | |
| 52 | +│ ├── interest_aggregation.py # 兴趣聚合 | |
| 53 | +│ ├── load_index_to_redis.py # 加载到Redis | |
| 54 | +│ ├── add_names_to_swing.py # 添加商品名 | |
| 55 | +│ └── debug_utils.py # Debug工具 | |
| 56 | +├── collaboration/ # C++ Swing算法 | |
| 57 | +│ ├── src/ # C++源码 | |
| 58 | +│ ├── run.sh # 执行脚本 | |
| 59 | +│ └── output/ # 输出目录 | |
| 60 | +├── config/ | |
| 61 | +│ └── offline_config.py # 配置文件 | |
| 62 | +├── doc/ # 文档目录 | |
| 63 | +│ ├── 详细设计文档.md # 本文档 | |
| 64 | +│ ├── 离线索引数据规范.md # 数据输出规范 | |
| 65 | +│ └── Redis数据规范.md # Redis存储规范 | |
| 66 | +├── output/ # 输出文件 | |
| 67 | +├── logs/ # 日志文件 | |
| 68 | +├── run.sh # ⭐ 主执行脚本 | |
| 69 | +├── run_all.py # Python版本执行脚本 | |
| 70 | +└── README.md | |
| 71 | +``` | |
| 72 | + | |
| 73 | +### 执行流程 | |
| 74 | + | |
| 75 | +``` | |
| 76 | +1. 环境准备 | |
| 77 | + └─ 清理旧进程、创建必要目录 | |
| 78 | + | |
| 79 | +2. 前置任务 | |
| 80 | + ├─ fetch_item_attributes.py → 商品属性映射(避免重复查询数据库) | |
| 81 | + ├─ generate_session.py → 用户session文件 | |
| 82 | + └─ collaboration/run.sh → C++ Swing (高性能版本) | |
| 83 | + | |
| 84 | +3. i2i算法任务 | |
| 85 | + ├─ i2i_swing.py → Python Swing (支持日期维度) | |
| 86 | + ├─ i2i_session_w2v.py → Session W2V | |
| 87 | + ├─ i2i_deepwalk.py → DeepWalk | |
| 88 | + └─ i2i_content_similar.py → 内容相似度 | |
| 89 | + | |
| 90 | +4. 兴趣聚合 | |
| 91 | + └─ interest_aggregation.py → 多维度聚合 | |
| 92 | + | |
| 93 | +5. 加载Redis | |
| 94 | + └─ load_index_to_redis.py → 导入Redis | |
| 95 | + | |
| 96 | +6. 完成 | |
| 97 | + └─ 输出结果文件列表 | |
| 98 | +``` | |
| 99 | + | |
| 100 | +--- | |
| 101 | + | |
| 102 | +## 🎯 功能模块详解 | |
| 103 | + | |
| 104 | +### 1. i2i相似度索引 | |
| 105 | + | |
| 106 | +#### 1.1 Swing算法 | |
| 107 | + | |
| 108 | +**两个版本:** | |
| 109 | + | |
| 110 | +**C++高性能版本** | |
| 111 | +- 文件位置: `offline_tasks/collaboration/` | |
| 112 | +- 性能: 比Python快10-100倍 | |
| 113 | +- 适用场景: 生产环境,海量数据(>50,000商品) | |
| 114 | +- 输出格式: `item_id \t similar_id1:score1,similar_id2:score2,...` | |
| 115 | +- 分数特点: 原始Swing分数(未归一化) | |
| 116 | + | |
| 117 | +**Python标准版本** | |
| 118 | +- 文件: `scripts/i2i_swing.py` | |
| 119 | +- 性能: 适中,易于调试 | |
| 120 | +- 适用场景: 开发测试,需要高级特性(时间衰减、日期维度) | |
| 121 | +- 输出格式: `item_id \t item_name \t similar_id1:score1,...` | |
| 122 | +- 分数特点: 归一化到0-1区间 | |
| 123 | + | |
| 124 | +**参数配置:** | |
| 125 | +```bash | |
| 126 | +# C++ Swing | |
| 127 | +ALPHA=0.7 # Swing alpha参数(0.5-1.0) | |
| 128 | +THRESHOLD1=1 # 交互强度阈值1 | |
| 129 | +THRESHOLD2=3 # 交互强度阈值2 | |
| 130 | +THREAD_NUM=4 # 线程数 | |
| 131 | + | |
| 132 | +# Python Swing | |
| 133 | +--lookback_days 730 # 回看天数 | |
| 134 | +--use_daily_session # 启用日期维度(同时考虑用户整体行为和单日行为) | |
| 135 | +--time_decay # 启用时间衰减 | |
| 136 | +--debug # Debug模式 | |
| 137 | +``` | |
| 138 | + | |
| 139 | +#### 1.2 Session Word2Vec | |
| 140 | + | |
| 141 | +基于用户会话序列的商品相似度计算,捕捉用户浏览顺序关系。 | |
| 142 | + | |
| 143 | +**特点:** | |
| 144 | +- 基于Word2Vec算法 | |
| 145 | +- 考虑商品在会话中的顺序 | |
| 146 | +- 适合"看了又看"场景 | |
| 147 | + | |
| 148 | +**参数:** | |
| 149 | +```bash | |
| 150 | +python3 scripts/i2i_session_w2v.py --lookback_days 730 --top_n 50 --save_model | |
| 151 | +``` | |
| 152 | + | |
| 153 | +#### 1.3 DeepWalk | |
| 154 | + | |
| 155 | +基于图随机游走的商品相似度计算,发现商品间的深层关系。 | |
| 156 | + | |
| 157 | +**特点:** | |
| 158 | +- 构建商品关系图 | |
| 159 | +- 随机游走生成序列 | |
| 160 | +- 发现间接关联 | |
| 161 | + | |
| 162 | +**参数:** | |
| 163 | +```bash | |
| 164 | +python3 scripts/i2i_deepwalk.py --lookback_days 730 --top_n 50 --save_model --save_graph | |
| 165 | +``` | |
| 166 | + | |
| 167 | +#### 1.4 Content-based 内容相似度 | |
| 168 | + | |
| 169 | +基于商品属性(分类、供应商等)计算相似度。 | |
| 170 | + | |
| 171 | +**三种方法:** | |
| 172 | +- TF-IDF方法: 基于商品名称文本 | |
| 173 | +- 分类方法: 基于商品分类层级 | |
| 174 | +- 混合方法: 综合多种特征(推荐) | |
| 175 | + | |
| 176 | +**参数:** | |
| 177 | +```bash | |
| 178 | +python3 scripts/i2i_content_similar.py --top_n 50 --method hybrid | |
| 179 | +``` | |
| 180 | + | |
| 181 | +### 2. 兴趣点聚合索引 | |
| 182 | + | |
| 183 | +根据不同维度聚合热门商品,支持个性化推荐。 | |
| 184 | + | |
| 185 | +#### 支持的维度 | |
| 186 | + | |
| 187 | +**单维度(7个):** | |
| 188 | +- `platform`: 业务平台(pc, h5, app等) | |
| 189 | +- `client_platform`: 客户端平台(iOS, Android, Web等) | |
| 190 | +- `supplier`: 供应商 | |
| 191 | +- `category_level1`: 一级分类 | |
| 192 | +- `category_level2`: 二级分类 | |
| 193 | +- `category_level3`: 三级分类 | |
| 194 | +- `category_level4`: 四级分类 | |
| 195 | + | |
| 196 | +**组合维度(4个):** | |
| 197 | +- `platform_client`: 平台+客户端 | |
| 198 | +- `platform_category2`: 平台+二级分类 | |
| 199 | +- `platform_category3`: 平台+三级分类 | |
| 200 | +- `client_category2`: 客户端+二级分类 | |
| 201 | + | |
| 202 | +#### 列表类型 | |
| 203 | + | |
| 204 | +- **hot**: 热门商品(最近N天高交互) | |
| 205 | +- **cart**: 加购商品(高加购率) | |
| 206 | +- **new**: 新品(最近90天上架) | |
| 207 | +- **global**: 全局热门 | |
| 208 | + | |
| 209 | +**参数:** | |
| 210 | +```bash | |
| 211 | +python3 scripts/interest_aggregation.py --lookback_days 730 --top_n 1000 | |
| 212 | +``` | |
| 213 | + | |
| 214 | +### 3. 前置任务 | |
| 215 | + | |
| 216 | +#### 3.1 商品属性获取 | |
| 217 | + | |
| 218 | +**问题**: 多个脚本需要商品名称,重复查询数据库效率低。 | |
| 219 | + | |
| 220 | +**解决方案**: 前置任务一次性获取,保存到本地文件。 | |
| 221 | + | |
| 222 | +```bash | |
| 223 | +python3 scripts/fetch_item_attributes.py | |
| 224 | +``` | |
| 225 | + | |
| 226 | +**输出**: | |
| 227 | +- `output/item_attributes_mappings.json`: 商品ID->名称映射 | |
| 228 | +- `output/item_attributes_stats.txt`: 统计信息 | |
| 229 | + | |
| 230 | +**效果**: 减少80-90%的数据库查询次数 | |
| 231 | + | |
| 232 | +#### 3.2 Session文件生成 | |
| 233 | + | |
| 234 | +从数据库提取用户行为数据,生成session文件供算法使用。 | |
| 235 | + | |
| 236 | +```bash | |
| 237 | +python3 scripts/generate_session.py --lookback_days 730 --format both | |
| 238 | +``` | |
| 239 | + | |
| 240 | +**输出格式:** | |
| 241 | +- `session.txt.YYYYMMDD`: 标准格式(包含uid) | |
| 242 | +- `session.txt.YYYYMMDD.cpp`: C++格式(纯json) | |
| 243 | + | |
| 244 | +**行为权重:** | |
| 245 | +- purchase: 10.0(购买) | |
| 246 | +- contactFactory: 5.0(联系厂家) | |
| 247 | +- addToCart: 3.0(加入购物车) | |
| 248 | +- addToPool: 2.0(加入询价池) | |
| 249 | + | |
| 250 | +--- | |
| 251 | + | |
| 252 | +## 🚀 使用指南 | |
| 253 | + | |
| 254 | +### 快速开始(3步) | |
| 255 | + | |
| 256 | +#### 步骤1: 安装依赖 | |
| 257 | +```bash | |
| 258 | +cd /home/tw/recommendation/offline_tasks | |
| 259 | +bash install.sh | |
| 260 | +``` | |
| 261 | + | |
| 262 | +#### 步骤2: 测试连接 | |
| 263 | +```bash | |
| 264 | +python3 test_connection.py | |
| 265 | +``` | |
| 266 | + | |
| 267 | +#### 步骤3: 运行任务 | |
| 268 | +```bash | |
| 269 | +# 小数据量测试(30天数据) | |
| 270 | +python3 scripts/i2i_swing.py --lookback_days 30 --top_n 10 | |
| 271 | + | |
| 272 | +# 完整任务(推荐使用run.sh) | |
| 273 | +bash run.sh | |
| 274 | +``` | |
| 275 | + | |
| 276 | +### 运行完整流程 | |
| 277 | + | |
| 278 | +**方式1: 使用run.sh(推荐)** | |
| 279 | +```bash | |
| 280 | +cd /home/tw/recommendation/offline_tasks | |
| 281 | +bash run.sh | |
| 282 | +``` | |
| 283 | + | |
| 284 | +这将自动执行: | |
| 285 | +- 前置任务(商品属性、session生成) | |
| 286 | +- C++ Swing算法 | |
| 287 | +- Python算法(Swing、W2V、DeepWalk、内容相似度) | |
| 288 | +- 兴趣聚合 | |
| 289 | +- Redis加载 | |
| 290 | + | |
| 291 | +**方式2: 使用run_all.py(简化版)** | |
| 292 | +```bash | |
| 293 | +python3 run_all.py --debug | |
| 294 | +``` | |
| 295 | + | |
| 296 | +不包括C++ Swing和Redis加载。 | |
| 297 | + | |
| 298 | +**方式3: 单独运行任务** | |
| 299 | +```bash | |
| 300 | +# 1. 前置任务 | |
| 301 | +python3 scripts/fetch_item_attributes.py | |
| 302 | +python3 scripts/generate_session.py --lookback_days 730 | |
| 303 | + | |
| 304 | +# 2. C++ Swing | |
| 305 | +cd collaboration && bash run.sh && cd .. | |
| 306 | + | |
| 307 | +# 3. Python算法 | |
| 308 | +python3 scripts/i2i_swing.py --lookback_days 730 --use_daily_session --debug | |
| 309 | +python3 scripts/i2i_session_w2v.py --lookback_days 730 --top_n 50 | |
| 310 | +python3 scripts/i2i_deepwalk.py --lookback_days 730 --top_n 50 | |
| 311 | +python3 scripts/i2i_content_similar.py --top_n 50 --method hybrid | |
| 312 | + | |
| 313 | +# 4. 兴趣聚合 | |
| 314 | +python3 scripts/interest_aggregation.py --lookback_days 730 --top_n 1000 | |
| 315 | + | |
| 316 | +# 5. 加载到Redis | |
| 317 | +python3 scripts/load_index_to_redis.py --redis-host localhost | |
| 318 | +``` | |
| 319 | + | |
| 320 | +### 配置说明 | |
| 321 | + | |
| 322 | +主要配置在 `config/offline_config.py`: | |
| 323 | + | |
| 324 | +```python | |
| 325 | +# 数据库配置 | |
| 326 | +DB_CONFIG = { | |
| 327 | + 'host': 'your_db_host', | |
| 328 | + 'port': '9030', | |
| 329 | + 'database': 'datacenter', | |
| 330 | + 'username': 'readonly', | |
| 331 | + 'password': 'your_password' | |
| 332 | +} | |
| 333 | + | |
| 334 | +# Redis配置 | |
| 335 | +REDIS_CONFIG = { | |
| 336 | + 'host': 'your_redis_host', | |
| 337 | + 'port': 6379, | |
| 338 | + 'db': 0, | |
| 339 | + 'password': None | |
| 340 | +} | |
| 341 | + | |
| 342 | +# 时间配置 | |
| 343 | +LOOKBACK_DAYS = 730 # 2年数据 | |
| 344 | + | |
| 345 | +# 行为权重 | |
| 346 | +behavior_weights = { | |
| 347 | + 'click': 1.0, | |
| 348 | + 'addToCart': 3.0, | |
| 349 | + 'contactFactory': 5.0, | |
| 350 | + 'purchase': 10.0 | |
| 351 | +} | |
| 352 | + | |
| 353 | +# 时间衰减 | |
| 354 | +time_decay_factor = 0.95 # 每30天衰减5% | |
| 355 | +``` | |
| 356 | + | |
| 357 | +### 查看输出结果 | |
| 358 | + | |
| 359 | +所有输出文件在 `output/` 目录: | |
| 360 | + | |
| 361 | +```bash | |
| 362 | +cd /home/tw/recommendation/offline_tasks/output | |
| 363 | +ls -lh | |
| 364 | + | |
| 365 | +# 查看i2i相似度 | |
| 366 | +head -5 i2i_swing_20251016.txt | |
| 367 | + | |
| 368 | +# 查看兴趣点聚合 | |
| 369 | +head -5 interest_aggregation_hot_20251016.txt | |
| 370 | +``` | |
| 371 | + | |
| 372 | +### 查看日志 | |
| 373 | + | |
| 374 | +```bash | |
| 375 | +cd /home/tw/recommendation/offline_tasks/logs | |
| 376 | + | |
| 377 | +# 主日志 | |
| 378 | +tail -f run_all_20251016.log | |
| 379 | + | |
| 380 | +# 内存监控日志 | |
| 381 | +tail -f memory_monitor.log | |
| 382 | + | |
| 383 | +# Debug日志 | |
| 384 | +ls debug/ | |
| 385 | +``` | |
| 386 | + | |
| 387 | +--- | |
| 388 | + | |
| 389 | +## 📊 输出数据示例 | |
| 390 | + | |
| 391 | +### i2i相似度索引 | |
| 392 | + | |
| 393 | +**C++ Swing(高性能版):** | |
| 394 | +``` | |
| 395 | +# 文件: collaboration/output/swing_similar.txt | |
| 396 | +3600052 2704531:0.00431593,2503886:0.00431593,3371410:0.00431593 | |
| 397 | + | |
| 398 | +# 可读版本: collaboration/output/swing_similar_readable.txt | |
| 399 | +3600052:商品A 2704531:商品B:0.00431593,2503886:商品C:0.00431593 | |
| 400 | +``` | |
| 401 | + | |
| 402 | +**Python Swing:** | |
| 403 | +``` | |
| 404 | +# 文件: output/i2i_swing_20251016.txt | |
| 405 | +12345 商品A 23456:0.8523,34567:0.7842,45678:0.7234 | |
| 406 | +``` | |
| 407 | + | |
| 408 | +### 兴趣点聚合索引 | |
| 409 | + | |
| 410 | +``` | |
| 411 | +# 文件: output/interest_aggregation_hot_20251016.txt | |
| 412 | +platform:pc 12345,23456,34567,45678,56789 | |
| 413 | +category_level2:200 45678,56789,67890,78901,89012 | |
| 414 | +platform_category2:pc_200 12345,23456,34567,45678 | |
| 415 | +``` | |
| 416 | + | |
| 417 | +--- | |
| 418 | + | |
| 419 | +## 🎬 业务场景应用 | |
| 420 | + | |
| 421 | +### 场景1: 首页猜你喜欢 | |
| 422 | + | |
| 423 | +**使用索引:** | |
| 424 | +```python | |
| 425 | +# 基于平台 | |
| 426 | +interest:hot:platform:pc | |
| 427 | + | |
| 428 | +# 基于分类偏好 | |
| 429 | +interest:hot:category_level2:200 | |
| 430 | + | |
| 431 | +# 基于平台+分类 | |
| 432 | +interest:hot:platform_category2:pc_200 | |
| 433 | +``` | |
| 434 | + | |
| 435 | +### 场景2: 详情页相关推荐 | |
| 436 | + | |
| 437 | +**使用索引:** | |
| 438 | +```python | |
| 439 | +# 行为相似(C++ Swing,生产推荐) | |
| 440 | +item:similar:swing_cpp:12345 | |
| 441 | + | |
| 442 | +# 行为相似(Python Swing) | |
| 443 | +item:similar:swing:12345 | |
| 444 | + | |
| 445 | +# 内容相似 | |
| 446 | +item:similar:content_hybrid:12345 | |
| 447 | + | |
| 448 | +# 融合推荐(多算法) | |
| 449 | +swing_items = redis.get('item:similar:swing_cpp:12345') | |
| 450 | +w2v_items = redis.get('item:similar:w2v:12345') | |
| 451 | +content_items = redis.get('item:similar:content_hybrid:12345') | |
| 452 | +# 融合多个算法结果... | |
| 453 | +``` | |
| 454 | + | |
| 455 | +### 场景3: 搜索结果页推荐 | |
| 456 | + | |
| 457 | +**使用索引:** | |
| 458 | +```python | |
| 459 | +# 全局热门 | |
| 460 | +interest:global:platform:pc | |
| 461 | + | |
| 462 | +# 分类相关 | |
| 463 | +interest:global:category_level2:200 | |
| 464 | +``` | |
| 465 | + | |
| 466 | +### 场景4: 供应商店铺页 | |
| 467 | + | |
| 468 | +**使用索引:** | |
| 469 | +```python | |
| 470 | +# 供应商热门 | |
| 471 | +interest:hot:supplier:10001 | |
| 472 | + | |
| 473 | +# 供应商新品 | |
| 474 | +interest:new:supplier:10001 | |
| 475 | +``` | |
| 476 | + | |
| 477 | +--- | |
| 478 | + | |
| 479 | +## ⚙️ 参数调优建议 | |
| 480 | + | |
| 481 | +### Swing算法参数 | |
| 482 | + | |
| 483 | +**alpha (0.5-1.0)** | |
| 484 | +- 越小:越关注用户共同行为的多样性 | |
| 485 | +- 越大:越容易忽略用户重叠度 | |
| 486 | +- B2B场景建议:0.5-0.7 | |
| 487 | + | |
| 488 | +**threshold1/threshold2** | |
| 489 | +- threshold1: 筛选用户有效行为(建议1-3) | |
| 490 | +- threshold2: 计算相似度阈值(建议3-5) | |
| 491 | +- B2B低频场景可适当降低 | |
| 492 | + | |
| 493 | +**thread_num** | |
| 494 | +- 根据CPU核心数设置 | |
| 495 | +- 建议:4-8(普通服务器) | |
| 496 | + | |
| 497 | +### 数据范围参数 | |
| 498 | + | |
| 499 | +**lookback_days** | |
| 500 | +- B2B低频场景:建议730天(2年) | |
| 501 | +- B2C高频场景:建议30-90天 | |
| 502 | +- 数据量大时可适当减少 | |
| 503 | + | |
| 504 | +**top_n** | |
| 505 | +- i2i相似度:建议10-50 | |
| 506 | +- 兴趣聚合:建议50-1000 | |
| 507 | + | |
| 508 | +--- | |
| 509 | + | |
| 510 | +## 🔧 故障排查 | |
| 511 | + | |
| 512 | +### 常见问题 | |
| 513 | + | |
| 514 | +**Q1: 任务运行时间太长** | |
| 515 | +- 减少 `--lookback_days` 参数(如改为365天) | |
| 516 | +- 减少 `--top_n` 参数 | |
| 517 | +- 在更强大的机器上运行 | |
| 518 | +- 使用C++ Swing代替Python Swing | |
| 519 | + | |
| 520 | +**Q2: 内存不足** | |
| 521 | +- Swing算法特别消耗内存,可以先跳过 | |
| 522 | +- 只运行DeepWalk或Session W2V | |
| 523 | +- 对数据进行采样 | |
| 524 | +- 调整C++代码中的max_session_list_len和max_sim_list_len | |
| 525 | + | |
| 526 | +**Q3: 数据库连接超时** | |
| 527 | +- 检查数据库配置: `config/offline_config.py` | |
| 528 | +- 测试连接: `python3 test_connection.py` | |
| 529 | +- 检查网络和防火墙 | |
| 530 | +- 增加SQL查询超时时间 | |
| 531 | + | |
| 532 | +**Q4: Session文件不存在** | |
| 533 | +```bash | |
| 534 | +# 重新生成session文件 | |
| 535 | +python3 scripts/generate_session.py --lookback_days 730 | |
| 536 | +``` | |
| 537 | + | |
| 538 | +**Q5: 编译失败(C++ Swing)** | |
| 539 | +```bash | |
| 540 | +# 检查编译器 | |
| 541 | +g++ --version | |
| 542 | + | |
| 543 | +# 手动编译 | |
| 544 | +cd collaboration | |
| 545 | +make clean | |
| 546 | +make | |
| 547 | +``` | |
| 548 | + | |
| 549 | +**Q6: 结果为空** | |
| 550 | +- 降低threshold参数 | |
| 551 | +- 增加lookback_days | |
| 552 | +- 检查数据量: `wc -l output/session.txt.*` | |
| 553 | + | |
| 554 | +### 查看错误日志 | |
| 555 | + | |
| 556 | +```bash | |
| 557 | +# 查看最新日志 | |
| 558 | +tail -100 logs/run_all_$(date +%Y%m%d).log | |
| 559 | + | |
| 560 | +# 查看特定任务日志 | |
| 561 | +tail -100 logs/debug/i2i_swing_*.log | |
| 562 | + | |
| 563 | +# 搜索错误信息 | |
| 564 | +grep -i "error" logs/run_all_*.log | |
| 565 | +``` | |
| 566 | + | |
| 567 | +--- | |
| 568 | + | |
| 569 | +## 📈 性能参考 | |
| 570 | + | |
| 571 | +在标准配置(730天数据,top_n=50)下的预估运行时间: | |
| 572 | + | |
| 573 | +| 任务 | 数据量 | 预估时间 | 内存占用 | | |
| 574 | +|------|--------|---------|---------| | |
| 575 | +| C++ Swing | 100万条行为 | 30-120分钟 | 4-8GB | | |
| 576 | +| Python Swing | 100万条行为 | 2-4小时 | 4-8GB | | |
| 577 | +| Session W2V | 100万条行为 | 30-60分钟 | 2-4GB | | |
| 578 | +| DeepWalk | 100万条行为 | 1-2小时 | 2-4GB | | |
| 579 | +| 内容相似度 | 5万商品 | 10-30分钟 | 1-2GB | | |
| 580 | +| 兴趣点聚合 | 100万条行为 | 30-60分钟 | 2-4GB | | |
| 581 | + | |
| 582 | +**总计**: 约4-8小时(取决于数据量和机器配置) | |
| 583 | + | |
| 584 | +--- | |
| 585 | + | |
| 586 | +## 🔄 定时任务设置 | |
| 587 | + | |
| 588 | +### 使用crontab | |
| 589 | + | |
| 590 | +```bash | |
| 591 | +# 编辑crontab | |
| 592 | +crontab -e | |
| 593 | + | |
| 594 | +# 每天凌晨2点运行(推荐) | |
| 595 | +0 2 * * * cd /home/tw/recommendation/offline_tasks && bash run.sh >> logs/cron_$(date +\%Y\%m\%d).log 2>&1 | |
| 596 | + | |
| 597 | +# 或者使用Python版本(不含C++ Swing和Redis加载) | |
| 598 | +0 2 * * * cd /home/tw/recommendation/offline_tasks && python3 run_all.py >> logs/cron_$(date +\%Y\%m\%d).log 2>&1 | |
| 599 | +``` | |
| 600 | + | |
| 601 | +### 分任务调度 | |
| 602 | + | |
| 603 | +```bash | |
| 604 | +# 每天凌晨2点运行i2i算法 | |
| 605 | +0 2 * * * cd /home/tw/recommendation/offline_tasks && python3 scripts/i2i_swing.py --lookback_days 730 | |
| 606 | + | |
| 607 | +# 每天凌晨4点运行兴趣聚合 | |
| 608 | +0 4 * * * cd /home/tw/recommendation/offline_tasks && python3 scripts/interest_aggregation.py --lookback_days 730 | |
| 609 | + | |
| 610 | +# 每周日凌晨3点运行内容相似度(变化慢) | |
| 611 | +0 3 * * 0 cd /home/tw/recommendation/offline_tasks && python3 scripts/i2i_content_similar.py --top_n 50 | |
| 612 | +``` | |
| 613 | + | |
| 614 | +--- | |
| 615 | + | |
| 616 | +## 📊 数据量统计 | |
| 617 | + | |
| 618 | +### 索引数量估算 | |
| 619 | + | |
| 620 | +| 索引类型 | 索引数量 | 单条大小 | 总大小 | 更新频率 | | |
| 621 | +|---------|---------|---------|--------|---------| | |
| 622 | +| i2i_swing_cpp | ~50,000 | ~400B | ~20MB | 每天 | | |
| 623 | +| i2i_swing | ~50,000 | ~500B | ~25MB | 每天 | | |
| 624 | +| i2i_session_w2v | ~50,000 | ~500B | ~25MB | 每天 | | |
| 625 | +| i2i_deepwalk | ~50,000 | ~500B | ~25MB | 每天 | | |
| 626 | +| i2i_content | ~50,000 | ~500B | ~25MB | 每周 | | |
| 627 | +| interest_hot | ~10,000 | ~1KB | ~10MB | 每天 | | |
| 628 | +| interest_cart | ~10,000 | ~1KB | ~10MB | 每天 | | |
| 629 | +| interest_new | ~5,000 | ~1KB | ~5MB | 每天 | | |
| 630 | +| interest_global | ~10,000 | ~1KB | ~10MB | 每天 | | |
| 631 | +| **总计** | **~295,000** | - | **~155MB** | - | | |
| 632 | + | |
| 633 | +### Redis内存占用 | |
| 634 | + | |
| 635 | +加载到Redis后的内存占用约 **180MB**(包含key开销) | |
| 636 | + | |
| 637 | +--- | |
| 638 | + | |
| 639 | +## 💡 核心优势 | |
| 640 | + | |
| 641 | +### 1. 完整性 | |
| 642 | +- ✅ 行为相似 + 内容相似 | |
| 643 | +- ✅ 短期热门 + 长期稳定 | |
| 644 | +- ✅ 粗粒度 + 细粒度 | |
| 645 | + | |
| 646 | +### 2. 灵活性 | |
| 647 | +- ✅ 支持4级分类查询 | |
| 648 | +- ✅ 支持供应商维度 | |
| 649 | +- ✅ 支持多维度组合 | |
| 650 | + | |
| 651 | +### 3. 可扩展性 | |
| 652 | +- ✅ 易于添加新维度 | |
| 653 | +- ✅ 易于添加新算法 | |
| 654 | +- ✅ 配置化管理 | |
| 655 | + | |
| 656 | +### 4. 高性能 | |
| 657 | +- ✅ C++ Swing高性能实现 | |
| 658 | +- ✅ 前置任务减少数据库查询 | |
| 659 | +- ✅ 多线程并行处理 | |
| 660 | + | |
| 661 | +### 5. 实用性 | |
| 662 | +- ✅ 适配真实B2B数据 | |
| 663 | +- ✅ 文档完善 | |
| 664 | +- ✅ 易于维护 | |
| 665 | + | |
| 666 | +--- | |
| 667 | + | |
| 668 | +## 🎯 关键改进点总结 | |
| 669 | + | |
| 670 | +1. **✅ 性能优化**: 前置任务减少80-90%的数据库查询,C++ Swing提升10-100倍性能 | |
| 671 | +2. **✅ 架构优化**: 前置任务解耦,数据准备与算法分离 | |
| 672 | +3. **✅ 功能增强**: Swing算法支持日期维度,同时考虑用户整体和单日行为 | |
| 673 | +4. **✅ 集成优化**: C++ Swing集成到统一流程,一键执行 | |
| 674 | +5. **✅ 文档规范**: 统一管理,清晰索引 | |
| 675 | +6. **✅ 代码质量**: 统一编码规范,完善错误处理 | |
| 676 | + | |
| 677 | +--- | |
| 678 | + | |
| 679 | +## 📝 相关文档 | |
| 680 | + | |
| 681 | +1. **离线索引数据规范** (`离线索引数据规范.md`) | |
| 682 | + - 任务输出数据的详细格式说明 | |
| 683 | + - 文件命名规范 | |
| 684 | + - 数据质量检查 | |
| 685 | + | |
| 686 | +2. **Redis数据规范** (`Redis数据规范.md`) | |
| 687 | + - Redis Key规范 | |
| 688 | + - 数据加载流程 | |
| 689 | + - 查询示例 | |
| 690 | + | |
| 691 | +3. **配置文件** (`config/offline_config.py`) | |
| 692 | + - 数据库配置 | |
| 693 | + - Redis配置 | |
| 694 | + - 算法参数 | |
| 695 | + | |
| 696 | +--- | |
| 697 | + | |
| 698 | +## 📞 联系与支持 | |
| 699 | + | |
| 700 | +如有问题,请: | |
| 701 | +1. 查看本文档的故障排查部分 | |
| 702 | +2. 查看日志文件: `logs/` | |
| 703 | +3. 查看相关文档: `doc/离线索引数据规范.md`、`doc/Redis数据规范.md` | |
| 704 | +4. 联系开发团队 | |
| 705 | + | |
| 706 | +--- | |
| 707 | + | |
| 708 | +**文档版本**: v1.1 | |
| 709 | +**最后更新**: 2024-10-17 | |
| 710 | +**维护者**: 推荐系统团队 | |
| 711 | + | ... | ... |
offline_tasks/doc/调试指南.md deleted
| ... | ... | @@ -1,332 +0,0 @@ |
| 1 | -# Debug模式使用指南 | |
| 2 | - | |
| 3 | -## 🐛 Debug功能概述 | |
| 4 | - | |
| 5 | -Debug模式为所有离线任务提供: | |
| 6 | -1. **详细的DEBUG级别日志** - 显示数据流向、统计信息、处理进度 | |
| 7 | -2. **明文索引文件** - ID后面带上对应的名称,方便检查效果 | |
| 8 | -3. **数据采样展示** - 关键步骤的示例数据 | |
| 9 | -4. **性能统计** - 每个步骤的耗时和资源使用 | |
| 10 | - | |
| 11 | -## 🚀 快速开始 | |
| 12 | - | |
| 13 | -### 1. 运行单个脚本(Debug模式) | |
| 14 | - | |
| 15 | -```bash | |
| 16 | -cd /home/tw/recommendation/offline_tasks | |
| 17 | - | |
| 18 | -# Swing算法 - Debug模式 | |
| 19 | -python3 scripts/i2i_swing.py --lookback_days 7 --top_n 10 --debug | |
| 20 | - | |
| 21 | -# 兴趣聚合 - Debug模式 | |
| 22 | -python3 scripts/interest_aggregation.py --lookback_days 7 --top_n 100 --debug | |
| 23 | - | |
| 24 | -# 内容相似 - Debug模式 | |
| 25 | -python3 scripts/i2i_content_similar.py --top_n 10 --debug | |
| 26 | -``` | |
| 27 | - | |
| 28 | -### 2. 运行所有任务(Debug模式) | |
| 29 | - | |
| 30 | -```bash | |
| 31 | -# 使用debug参数运行所有任务 | |
| 32 | -python3 run_all.py --lookback_days 7 --top_n 10 --debug | |
| 33 | -``` | |
| 34 | - | |
| 35 | -## 📊 Debug输出说明 | |
| 36 | - | |
| 37 | -### A. 日志输出 | |
| 38 | - | |
| 39 | -Debug模式下,日志会输出到两个地方: | |
| 40 | -1. **控制台** - 实时查看进度 | |
| 41 | -2. **Debug日志文件** - 完整保存 | |
| 42 | - | |
| 43 | -日志文件位置: | |
| 44 | -``` | |
| 45 | -offline_tasks/logs/debug/i2i_swing_20251016_193000.log | |
| 46 | -offline_tasks/logs/debug/interest_aggregation_20251016_193500.log | |
| 47 | -... | |
| 48 | -``` | |
| 49 | - | |
| 50 | -### B. 日志内容示例 | |
| 51 | - | |
| 52 | -``` | |
| 53 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - ============================================================ | |
| 54 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - 算法参数: | |
| 55 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - ============================================================ | |
| 56 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - alpha: 0.5 | |
| 57 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - top_n: 10 | |
| 58 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - lookback_days: 7 | |
| 59 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - debug: True | |
| 60 | -2025-10-16 19:30:00 - i2i_swing - DEBUG - ============================================================ | |
| 61 | - | |
| 62 | -2025-10-16 19:30:05 - i2i_swing - INFO - 获取到 15234 条记录 | |
| 63 | - | |
| 64 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - ============================================================ | |
| 65 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 用户行为数据 信息: | |
| 66 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - ============================================================ | |
| 67 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 总行数: 15234 | |
| 68 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 总列数: 5 | |
| 69 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 列名: ['user_id', 'item_id', 'event_type', 'create_time', 'item_name'] | |
| 70 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - | |
| 71 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 数据类型: | |
| 72 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - user_id: object | |
| 73 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - item_id: int64 | |
| 74 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - event_type: object | |
| 75 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - create_time: datetime64[ns] | |
| 76 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - item_name: object | |
| 77 | - | |
| 78 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - 行为类型分布: | |
| 79 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - addToCart: 8520 (55.93%) | |
| 80 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - contactFactory: 3456 (22.68%) | |
| 81 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - purchase: 2134 (14.01%) | |
| 82 | -2025-10-16 19:30:05 - i2i_swing - DEBUG - addToPool: 1124 (7.38%) | |
| 83 | - | |
| 84 | -2025-10-16 19:30:10 - i2i_swing - INFO - 总用户数: 3456, 总商品数: 2345 | |
| 85 | -2025-10-16 19:30:15 - i2i_swing - DEBUG - 已处理 50/2345 个商品 (2.1%) | |
| 86 | -2025-10-16 19:30:20 - i2i_swing - DEBUG - 已处理 100/2345 个商品 (4.3%) | |
| 87 | -... | |
| 88 | -``` | |
| 89 | - | |
| 90 | -### C. 明文索引文件 | |
| 91 | - | |
| 92 | -Debug模式下,每个索引文件都会生成对应的明文文件: | |
| 93 | - | |
| 94 | -**原始索引文件** (`output/i2i_swing_20251016.txt`): | |
| 95 | -``` | |
| 96 | -12345 香蕉干 67890:0.8567,11223:0.7234,44556:0.6891 | |
| 97 | -67890 芒果干 12345:0.8567,22334:0.7123,55667:0.6543 | |
| 98 | -``` | |
| 99 | - | |
| 100 | -**明文索引文件** (`output/debug/i2i_swing_20251016_readable.txt`): | |
| 101 | -``` | |
| 102 | -================================================================================ | |
| 103 | -明文索引文件 | |
| 104 | -生成时间: 2025-10-16 19:35:00 | |
| 105 | -描述: Swing算法 i2i相似度推荐 (alpha=0.5, lookback_days=7) | |
| 106 | -总索引数: 2345 | |
| 107 | -================================================================================ | |
| 108 | - | |
| 109 | -[1] i2i:swing:12345(香蕉干) | |
| 110 | --------------------------------------------------------------------------------- | |
| 111 | - 1. ID:67890(芒果干) - Score:0.8567 | |
| 112 | - 2. ID:11223(菠萝干) - Score:0.7234 | |
| 113 | - 3. ID:44556(苹果干) - Score:0.6891 | |
| 114 | - 4. ID:22334(木瓜干) - Score:0.6234 | |
| 115 | - 5. ID:55667(草莓干) - Score:0.5891 | |
| 116 | - | |
| 117 | -[2] i2i:swing:67890(芒果干) | |
| 118 | --------------------------------------------------------------------------------- | |
| 119 | - 1. ID:12345(香蕉干) - Score:0.8567 | |
| 120 | - 2. ID:22334(木瓜干) - Score:0.7123 | |
| 121 | - 3. ID:55667(草莓干) - Score:0.6543 | |
| 122 | - 4. ID:11223(菠萝干) - Score:0.6234 | |
| 123 | - 5. ID:44556(苹果干) - Score:0.5891 | |
| 124 | - | |
| 125 | -... | |
| 126 | - | |
| 127 | -================================================================================ | |
| 128 | -已输出 50/2345 个索引 | |
| 129 | -================================================================================ | |
| 130 | -``` | |
| 131 | - | |
| 132 | -## 📁 文件结构 | |
| 133 | - | |
| 134 | -Debug模式下的文件组织: | |
| 135 | - | |
| 136 | -``` | |
| 137 | -offline_tasks/ | |
| 138 | -├── output/ | |
| 139 | -│ ├── i2i_swing_20251016.txt # 原始索引文件 | |
| 140 | -│ ├── interest_aggregation_hot_20251016.txt | |
| 141 | -│ └── debug/ # Debug明文文件目录 | |
| 142 | -│ ├── i2i_swing_20251016_readable.txt # 明文索引 | |
| 143 | -│ ├── interest_aggregation_hot_20251016_readable.txt | |
| 144 | -│ └── ... | |
| 145 | -└── logs/ | |
| 146 | - ├── run_all_20251016.log # 主日志 | |
| 147 | - └── debug/ # Debug详细日志目录 | |
| 148 | - ├── i2i_swing_20251016_193000.log | |
| 149 | - ├── interest_aggregation_20251016_193500.log | |
| 150 | - └── ... | |
| 151 | -``` | |
| 152 | - | |
| 153 | -## 🔍 使用场景 | |
| 154 | - | |
| 155 | -### 场景1:调试数据流程 | |
| 156 | - | |
| 157 | -```bash | |
| 158 | -# 使用小数据量+debug模式快速验证 | |
| 159 | -python3 scripts/i2i_swing.py --lookback_days 1 --top_n 5 --debug | |
| 160 | - | |
| 161 | -# 查看日志,检查: | |
| 162 | -# - 数据加载是否正确 | |
| 163 | -# - 行为类型分布是否合理 | |
| 164 | -# - 用户/商品数量是否符合预期 | |
| 165 | -``` | |
| 166 | - | |
| 167 | -### 场景2:检查推荐效果 | |
| 168 | - | |
| 169 | -```bash | |
| 170 | -# 生成明文索引文件 | |
| 171 | -python3 scripts/i2i_swing.py --lookback_days 7 --top_n 20 --debug | |
| 172 | - | |
| 173 | -# 打开明文文件查看: | |
| 174 | -cat output/debug/i2i_swing_20251016_readable.txt | less | |
| 175 | - | |
| 176 | -# 检查推荐是否合理,例如: | |
| 177 | -# - 香蕉干 -> 芒果干、菠萝干 ✓ 合理 | |
| 178 | -# - 电脑 -> 香蕉干 ✗ 不合理,需要调整参数 | |
| 179 | -``` | |
| 180 | - | |
| 181 | -### 场景3:性能调优 | |
| 182 | - | |
| 183 | -```bash | |
| 184 | -# Debug模式查看各步骤耗时 | |
| 185 | -python3 scripts/i2i_swing.py --debug 2>&1 | grep "耗时" | |
| 186 | - | |
| 187 | -# 输出示例: | |
| 188 | -# 步骤1耗时: 2.34秒 | |
| 189 | -# 步骤2耗时: 15.67秒 <- 瓶颈在这里 | |
| 190 | -# 步骤3耗时: 1.23秒 | |
| 191 | -# 总耗时: 19.24秒 | |
| 192 | -``` | |
| 193 | - | |
| 194 | -### 场景4:参数调整 | |
| 195 | - | |
| 196 | -```bash | |
| 197 | -# 测试不同alpha值的效果 | |
| 198 | -python3 scripts/i2i_swing.py --alpha 0.3 --debug > alpha_0.3.log 2>&1 | |
| 199 | -python3 scripts/i2i_swing.py --alpha 0.5 --debug > alpha_0.5.log 2>&1 | |
| 200 | -python3 scripts/i2i_swing.py --alpha 0.7 --debug > alpha_0.7.log 2>&1 | |
| 201 | - | |
| 202 | -# 对比明文文件,选择最佳参数 | |
| 203 | -diff output/debug/i2i_swing_*_readable.txt | |
| 204 | -``` | |
| 205 | - | |
| 206 | -## 💡 最佳实践 | |
| 207 | - | |
| 208 | -### 1. 开发调试阶段 | |
| 209 | - | |
| 210 | -```bash | |
| 211 | -# 使用小数据量 + Debug模式 | |
| 212 | -python3 run_all.py --lookback_days 3 --top_n 10 --debug | |
| 213 | -``` | |
| 214 | - | |
| 215 | -- ✅ 快速验证流程 | |
| 216 | -- ✅ 详细日志便于排错 | |
| 217 | -- ✅ 明文文件检查效果 | |
| 218 | - | |
| 219 | -### 2. 参数调优阶段 | |
| 220 | - | |
| 221 | -```bash | |
| 222 | -# 中等数据量 + Debug模式 | |
| 223 | -python3 scripts/i2i_swing.py --lookback_days 30 --top_n 50 --debug | |
| 224 | -``` | |
| 225 | - | |
| 226 | -- ✅ 查看数据分布 | |
| 227 | -- ✅ 评估推荐质量 | |
| 228 | -- ✅ 调整算法参数 | |
| 229 | - | |
| 230 | -### 3. 生产运行阶段 | |
| 231 | - | |
| 232 | -```bash | |
| 233 | -# 大数据量 + 正常模式(不加--debug) | |
| 234 | -python3 run_all.py --lookback_days 730 --top_n 50 | |
| 235 | -``` | |
| 236 | - | |
| 237 | -- ✅ 高效运行 | |
| 238 | -- ✅ 只输出必要日志 | |
| 239 | -- ✅ 节省磁盘空间 | |
| 240 | - | |
| 241 | -## 🛠️ Debug工具 | |
| 242 | - | |
| 243 | -### 查看实时日志 | |
| 244 | - | |
| 245 | -```bash | |
| 246 | -# 实时查看debug日志 | |
| 247 | -tail -f logs/debug/i2i_swing_*.log | |
| 248 | - | |
| 249 | -# 只看DEBUG级别 | |
| 250 | -tail -f logs/debug/i2i_swing_*.log | grep "DEBUG" | |
| 251 | - | |
| 252 | -# 只看错误 | |
| 253 | -tail -f logs/debug/i2i_swing_*.log | grep "ERROR" | |
| 254 | -``` | |
| 255 | - | |
| 256 | -### 统计分析 | |
| 257 | - | |
| 258 | -```bash | |
| 259 | -# 统计处理的数据量 | |
| 260 | -grep "总行数" logs/debug/*.log | |
| 261 | - | |
| 262 | -# 统计生成的索引数 | |
| 263 | -grep "总索引数" output/debug/*_readable.txt | |
| 264 | - | |
| 265 | -# 查看性能统计 | |
| 266 | -grep "耗时" logs/debug/*.log | |
| 267 | -``` | |
| 268 | - | |
| 269 | -### 快速检查 | |
| 270 | - | |
| 271 | -```bash | |
| 272 | -# 检查前10个推荐 | |
| 273 | -head -50 output/debug/i2i_swing_*_readable.txt | |
| 274 | - | |
| 275 | -# 搜索特定商品的推荐 | |
| 276 | -grep "香蕉干" output/debug/i2i_swing_*_readable.txt -A 10 | |
| 277 | - | |
| 278 | -# 统计推荐数量分布 | |
| 279 | -grep "Score:" output/debug/i2i_swing_*_readable.txt | wc -l | |
| 280 | -``` | |
| 281 | - | |
| 282 | -## ⚠️ 注意事项 | |
| 283 | - | |
| 284 | -1. **磁盘空间** | |
| 285 | - - Debug日志和明文文件会占用较多空间 | |
| 286 | - - 建议定期清理:`rm -rf logs/debug/* output/debug/*` | |
| 287 | - | |
| 288 | -2. **运行时间** | |
| 289 | - - Debug模式会增加10-20%的运行时间 | |
| 290 | - - 生产环境建议关闭debug | |
| 291 | - | |
| 292 | -3. **敏感信息** | |
| 293 | - - 明文文件包含商品名称等信息 | |
| 294 | - - 注意数据安全和隐私保护 | |
| 295 | - | |
| 296 | -4. **文件编码** | |
| 297 | - - 明文文件使用UTF-8编码 | |
| 298 | - - 确保查看工具支持中文显示 | |
| 299 | - | |
| 300 | -## 📖 相关命令 | |
| 301 | - | |
| 302 | -```bash | |
| 303 | -# 查看帮助 | |
| 304 | -python3 scripts/i2i_swing.py --help | |
| 305 | -python3 run_all.py --help | |
| 306 | - | |
| 307 | -# 验证配置 | |
| 308 | -python3 -c "from config.offline_config import DEBUG_CONFIG; print(DEBUG_CONFIG)" | |
| 309 | - | |
| 310 | -# 测试debug工具 | |
| 311 | -python3 -c "from scripts.debug_utils import *; print('Debug utils loaded OK')" | |
| 312 | -``` | |
| 313 | - | |
| 314 | -## ✅ 验证Debug功能 | |
| 315 | - | |
| 316 | -```bash | |
| 317 | -# 快速测试 | |
| 318 | -cd /home/tw/recommendation/offline_tasks | |
| 319 | -python3 scripts/i2i_swing.py --lookback_days 1 --top_n 5 --debug | |
| 320 | - | |
| 321 | -# 应该看到: | |
| 322 | -# ✓ DEBUG级别日志输出 | |
| 323 | -# ✓ 创建debug日志文件 | |
| 324 | -# ✓ 生成明文索引文件 | |
| 325 | -# ✓ 显示数据统计信息 | |
| 326 | -``` | |
| 327 | - | |
| 328 | ---- | |
| 329 | - | |
| 330 | -**Debug模式**: 开发和调试的利器 | |
| 331 | -**正常模式**: 生产环境的选择 | |
| 332 | -**灵活切换**: 一个参数的事情 |
offline_tasks/doc/运行脚本指南.md deleted
| ... | ... | @@ -1,304 +0,0 @@ |
| 1 | -# run.sh 运行脚本使用指南 | |
| 2 | - | |
| 3 | -## 概述 | |
| 4 | - | |
| 5 | -`run.sh` 是一个自动化运行脚本,集成了内存监控功能,确保离线任务安全高效运行。 | |
| 6 | - | |
| 7 | -## 主要特性 | |
| 8 | - | |
| 9 | -### 1. 内存监控 | |
| 10 | -- **警告阈值**: 25GB - 打印警告日志 | |
| 11 | -- **强制终止阈值**: 30GB - 自动kill进程 | |
| 12 | -- **检查频率**: 每10秒检查一次 | |
| 13 | -- **日志文件**: `logs/memory_monitor.log` | |
| 14 | - | |
| 15 | -### 2. 任务流程 | |
| 16 | -1. 清理旧进程和输出 | |
| 17 | -2. 运行调试模式(小数据量测试) | |
| 18 | -3. 运行生产模式(大数据量) | |
| 19 | -4. 加载索引到Redis | |
| 20 | - | |
| 21 | -### 3. 错误处理 | |
| 22 | -- 任何步骤失败会立即退出 | |
| 23 | -- 显示详细的退出码 | |
| 24 | -- 保存完整日志 | |
| 25 | - | |
| 26 | -## 使用方法 | |
| 27 | - | |
| 28 | -### 基本运行 | |
| 29 | -```bash | |
| 30 | -cd /home/tw/recommendation/offline_tasks | |
| 31 | -./run.sh | |
| 32 | -``` | |
| 33 | - | |
| 34 | -### 查看实时输出 | |
| 35 | -```bash | |
| 36 | -./run.sh | tee logs/run_$(date +%Y%m%d_%H%M%S).log | |
| 37 | -``` | |
| 38 | - | |
| 39 | -### 后台运行 | |
| 40 | -```bash | |
| 41 | -nohup ./run.sh > logs/run_$(date +%Y%m%d_%H%M%S).log 2>&1 & | |
| 42 | -``` | |
| 43 | - | |
| 44 | -## 内存监控说明 | |
| 45 | - | |
| 46 | -### 监控逻辑 | |
| 47 | - | |
| 48 | -```bash | |
| 49 | -check_memory() { | |
| 50 | - local pid=$1 | |
| 51 | - local threshold_warn=25 # 25GB警告 | |
| 52 | - local threshold_kill=30 # 30GB强制kill | |
| 53 | - | |
| 54 | - while 进程运行中; do | |
| 55 | - 获取内存使用 | |
| 56 | - | |
| 57 | - if 内存 >= 30GB: | |
| 58 | - 打印错误日志 | |
| 59 | - 强制终止进程 | |
| 60 | - break | |
| 61 | - elif 内存 >= 25GB: | |
| 62 | - 打印警告日志 | |
| 63 | - | |
| 64 | - sleep 10秒 | |
| 65 | - done | |
| 66 | -} | |
| 67 | -``` | |
| 68 | - | |
| 69 | -### 日志格式 | |
| 70 | - | |
| 71 | -**警告日志**: | |
| 72 | -``` | |
| 73 | -[2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12345 | |
| 74 | -``` | |
| 75 | - | |
| 76 | -**强制终止日志**: | |
| 77 | -``` | |
| 78 | -[2025-10-17 14:35:30] ❌ 内存超限!当前使用: 31.20GB (>= 30GB), 强制终止进程 PID=12345 | |
| 79 | -``` | |
| 80 | - | |
| 81 | -### 查看监控日志 | |
| 82 | -```bash | |
| 83 | -# 实时查看 | |
| 84 | -tail -f logs/memory_monitor.log | |
| 85 | - | |
| 86 | -# 查看历史 | |
| 87 | -cat logs/memory_monitor.log | |
| 88 | -``` | |
| 89 | - | |
| 90 | -## 运行流程 | |
| 91 | - | |
| 92 | -### 步骤1: 调试模式 | |
| 93 | -```bash | |
| 94 | -python3 run_all.py --debug | |
| 95 | -``` | |
| 96 | -- 使用默认参数(见 `offline_config.py`) | |
| 97 | -- 输出保存到 `output_debug/` | |
| 98 | -- 启动内存监控 | |
| 99 | - | |
| 100 | -### 步骤2: 生产模式 | |
| 101 | -```bash | |
| 102 | -python3 run_all.py --debug | |
| 103 | -``` | |
| 104 | -- 生成完整索引 | |
| 105 | -- 输出保存到 `output/` | |
| 106 | -- 启动内存监控 | |
| 107 | - | |
| 108 | -### 步骤3: 加载Redis | |
| 109 | -```bash | |
| 110 | -python3 scripts/load_index_to_redis.py --redis-host localhost | |
| 111 | -``` | |
| 112 | -- 加载所有生成的索引 | |
| 113 | -- 包括新增的内容相似索引 | |
| 114 | - | |
| 115 | -## 输出示例 | |
| 116 | - | |
| 117 | -``` | |
| 118 | -====================================================================== | |
| 119 | -开始运行离线任务 - 2025-10-17 14:00:00 | |
| 120 | -内存监控: 警告阈值=25GB, 强制终止阈值=30GB | |
| 121 | -====================================================================== | |
| 122 | - | |
| 123 | ->>> 步骤1: 调试模式运行(小数据量) | |
| 124 | -调试任务 PID: 12345 | |
| 125 | -✓ 调试模式完成 | |
| 126 | - | |
| 127 | ->>> 步骤2: 生产模式运行(大数据量) | |
| 128 | -生产任务 PID: 12346 | |
| 129 | -[2025-10-17 14:30:25] ⚠️ 内存警告!当前使用: 26.45GB (>= 25GB), PID=12346 | |
| 130 | -✓ 生产模式完成 | |
| 131 | - | |
| 132 | ->>> 步骤3: 加载到Redis | |
| 133 | -✓ Redis加载完成 | |
| 134 | - | |
| 135 | -====================================================================== | |
| 136 | -所有任务完成 - 2025-10-17 16:30:00 | |
| 137 | -====================================================================== | |
| 138 | -``` | |
| 139 | - | |
| 140 | -## 自定义配置 | |
| 141 | - | |
| 142 | -### 修改内存阈值 | |
| 143 | - | |
| 144 | -编辑 `run.sh` 中的以下行: | |
| 145 | -```bash | |
| 146 | -local threshold_warn=25 # 修改警告阈值 | |
| 147 | -local threshold_kill=30 # 修改强制kill阈值 | |
| 148 | -``` | |
| 149 | - | |
| 150 | -### 修改检查频率 | |
| 151 | - | |
| 152 | -编辑 `run.sh` 中的以下行: | |
| 153 | -```bash | |
| 154 | -sleep 10 # 修改为其他秒数 | |
| 155 | -``` | |
| 156 | - | |
| 157 | -### 跳过调试模式 | |
| 158 | - | |
| 159 | -注释掉步骤1相关代码: | |
| 160 | -```bash | |
| 161 | -# # 3. 调试模式运行(小数据量) | |
| 162 | -# echo "" | |
| 163 | -# echo ">>> 步骤1: 调试模式运行(小数据量)" | |
| 164 | -# python3 run_all.py --debug & | |
| 165 | -# ... | |
| 166 | -``` | |
| 167 | - | |
| 168 | -### 修改Redis配置 | |
| 169 | - | |
| 170 | -修改步骤3的参数: | |
| 171 | -```bash | |
| 172 | -python3 scripts/load_index_to_redis.py \ | |
| 173 | - --redis-host your-redis-host \ | |
| 174 | - --redis-port 6379 \ | |
| 175 | - --redis-db 0 | |
| 176 | -``` | |
| 177 | - | |
| 178 | -## 故障排查 | |
| 179 | - | |
| 180 | -### 内存持续超限 | |
| 181 | - | |
| 182 | -**原因**: | |
| 183 | -- 数据量太大 | |
| 184 | -- 内存泄漏 | |
| 185 | -- 并发任务过多 | |
| 186 | - | |
| 187 | -**解决方案**: | |
| 188 | -1. 增加内存阈值(临时方案) | |
| 189 | -2. 优化代码减少内存占用 | |
| 190 | -3. 分批处理数据 | |
| 191 | -4. 使用增量更新 | |
| 192 | - | |
| 193 | -### 进程被意外终止 | |
| 194 | - | |
| 195 | -**检查日志**: | |
| 196 | -```bash | |
| 197 | -# 查看监控日志 | |
| 198 | -cat logs/memory_monitor.log | |
| 199 | - | |
| 200 | -# 查看任务日志 | |
| 201 | -ls -lht logs/ | |
| 202 | -cat logs/run_all_*.log | |
| 203 | -``` | |
| 204 | - | |
| 205 | -### 任务失败 | |
| 206 | - | |
| 207 | -**查看退出码**: | |
| 208 | -- 0: 成功 | |
| 209 | -- 1: 一般错误 | |
| 210 | -- 137: 被kill信号终止(可能是内存超限) | |
| 211 | -- 其他: 查看具体错误信息 | |
| 212 | - | |
| 213 | -## 监控建议 | |
| 214 | - | |
| 215 | -### 1. 添加系统监控 | |
| 216 | -```bash | |
| 217 | -# 安装监控工具 | |
| 218 | -apt install htop iotop | |
| 219 | - | |
| 220 | -# 实时监控 | |
| 221 | -htop -p $(pgrep -f run_all.py) | |
| 222 | -``` | |
| 223 | - | |
| 224 | -### 2. 设置告警 | |
| 225 | -```bash | |
| 226 | -# 配置邮件告警 | |
| 227 | -if [ $PROD_EXIT_CODE -ne 0 ]; then | |
| 228 | - echo "任务失败" | mail -s "离线任务告警" admin@example.com | |
| 229 | -fi | |
| 230 | -``` | |
| 231 | - | |
| 232 | -### 3. 定时任务 | |
| 233 | -```bash | |
| 234 | -# 添加到crontab | |
| 235 | -0 2 * * * /home/tw/recommendation/offline_tasks/run.sh >> /var/log/offline_tasks.log 2>&1 | |
| 236 | -``` | |
| 237 | - | |
| 238 | -## 性能优化 | |
| 239 | - | |
| 240 | -### 内存优化建议 | |
| 241 | - | |
| 242 | -1. **分批处理** | |
| 243 | - ```python | |
| 244 | - # 在代码中使用batch处理 | |
| 245 | - batch_size = 1000 | |
| 246 | - for i in range(0, len(items), batch_size): | |
| 247 | - batch = items[i:i+batch_size] | |
| 248 | - process(batch) | |
| 249 | - ``` | |
| 250 | - | |
| 251 | -2. **及时释放** | |
| 252 | - ```python | |
| 253 | - import gc | |
| 254 | - del large_object | |
| 255 | - gc.collect() | |
| 256 | - ``` | |
| 257 | - | |
| 258 | -3. **使用生成器** | |
| 259 | - ```python | |
| 260 | - def process_items(): | |
| 261 | - for item in items: | |
| 262 | - yield process(item) | |
| 263 | - ``` | |
| 264 | - | |
| 265 | -## 日志管理 | |
| 266 | - | |
| 267 | -### 日志文件 | |
| 268 | -- `logs/memory_monitor.log` - 内存监控日志 | |
| 269 | -- `logs/run_all_YYYYMMDD.log` - 任务运行日志 | |
| 270 | -- `output/` - 生成的索引文件 | |
| 271 | -- `output_debug/` - 调试模式输出 | |
| 272 | - | |
| 273 | -### 清理旧日志 | |
| 274 | -```bash | |
| 275 | -# 保留最近7天 | |
| 276 | -find logs/ -name "*.log" -mtime +7 -delete | |
| 277 | - | |
| 278 | -# 压缩旧日志 | |
| 279 | -find logs/ -name "*.log" -mtime +3 -exec gzip {} \; | |
| 280 | -``` | |
| 281 | - | |
| 282 | -## 安全注意事项 | |
| 283 | - | |
| 284 | -1. **权限**: 确保脚本有执行权限 `chmod +x run.sh` | |
| 285 | -2. **路径**: 使用绝对路径避免混淆 | |
| 286 | -3. **清理**: 脚本会清理旧进程,确保没有重要进程被误杀 | |
| 287 | -4. **备份**: 脚本会删除output目录,请提前备份重要数据 | |
| 288 | - | |
| 289 | -## 总结 | |
| 290 | - | |
| 291 | -`run.sh` 提供了: | |
| 292 | -- ✅ 自动化运行流程 | |
| 293 | -- ✅ 内存监控保护 | |
| 294 | -- ✅ 详细日志记录 | |
| 295 | -- ✅ 错误处理机制 | |
| 296 | -- ✅ 进度显示 | |
| 297 | - | |
| 298 | -建议在生产环境使用前先在测试环境验证。 | |
| 299 | - | |
| 300 | ---- | |
| 301 | - | |
| 302 | -**更新时间**: 2025-10-17 | |
| 303 | -**版本**: v2.0 | |
| 304 | - |
offline_tasks/doc/项目重构说明-20241017.md deleted
| ... | ... | @@ -1,397 +0,0 @@ |
| 1 | -# 项目重构说明 - 2024-10-17 | |
| 2 | - | |
| 3 | -## ✅ 完成的重构 | |
| 4 | - | |
| 5 | -### 1. 目录结构调整 | |
| 6 | - | |
| 7 | -**改动**: 将`collaboration`目录移入`offline_tasks` | |
| 8 | - | |
| 9 | -**之前**: | |
| 10 | -``` | |
| 11 | -recommendation/ | |
| 12 | -├── offline_tasks/ | |
| 13 | -│ ├── scripts/ | |
| 14 | -│ └── ... | |
| 15 | -└── collaboration/ # 外层目录 | |
| 16 | - ├── src/ | |
| 17 | - └── run.sh | |
| 18 | -``` | |
| 19 | - | |
| 20 | -**之后**: | |
| 21 | -``` | |
| 22 | -recommendation/ | |
| 23 | -└── offline_tasks/ | |
| 24 | - ├── scripts/ | |
| 25 | - ├── collaboration/ # 移入内部 | |
| 26 | - │ ├── src/ | |
| 27 | - │ └── run.sh | |
| 28 | - └── ... | |
| 29 | -``` | |
| 30 | - | |
| 31 | -**优势**: | |
| 32 | -- ✅ 统一目录结构,所有离线任务在同一目录 | |
| 33 | -- ✅ 简化路径配置 | |
| 34 | -- ✅ 便于统一管理和部署 | |
| 35 | - | |
| 36 | ---- | |
| 37 | - | |
| 38 | -### 2. 执行脚本简化 | |
| 39 | - | |
| 40 | -**改动**: 主执行脚本从`run_all.py`改为`run.sh`,直接调用各个脚本 | |
| 41 | - | |
| 42 | -**之前的流程**: | |
| 43 | -```python | |
| 44 | -# run_all.py (Python实现) | |
| 45 | -run_script('fetch_item_attributes.py') | |
| 46 | -run_script('generate_session.py') | |
| 47 | -run_cpp_swing() # 调用collaboration/run.sh | |
| 48 | -run_script('i2i_swing.py') | |
| 49 | -# ... | |
| 50 | -``` | |
| 51 | - | |
| 52 | -**现在的流程**: | |
| 53 | -```bash | |
| 54 | -# run.sh (Shell实现) | |
| 55 | -python3 scripts/fetch_item_attributes.py | |
| 56 | -python3 scripts/generate_session.py | |
| 57 | -cd collaboration && bash run.sh && cd .. | |
| 58 | -python3 scripts/i2i_swing.py | |
| 59 | -# ... | |
| 60 | -``` | |
| 61 | - | |
| 62 | -**优势**: | |
| 63 | -- ✅ 代码更简洁,减少抽象层 | |
| 64 | -- ✅ 直接调用,易于理解和调试 | |
| 65 | -- ✅ 内存监控、错误处理更灵活 | |
| 66 | -- ✅ 配置参数集中在顶部,便于修改 | |
| 67 | - | |
| 68 | ---- | |
| 69 | - | |
| 70 | -### 3. 路径更新 | |
| 71 | - | |
| 72 | -所有相关路径已更新: | |
| 73 | - | |
| 74 | -**collaboration/run.sh**: | |
| 75 | -- `SESSION_DATA_DIR="../offline_tasks/output"` → `"../output"` | |
| 76 | -- `DEBUG_SCRIPT="../offline_tasks/scripts/..."` → `"../scripts/..."` | |
| 77 | - | |
| 78 | -**文档更新**: | |
| 79 | -- ✅ `README.md` | |
| 80 | -- ✅ `doc/离线索引数据规范.md` | |
| 81 | -- ✅ `doc/Redis数据规范.md` | |
| 82 | -- ✅ `doc/系统改进总结-20241017.md` | |
| 83 | - | |
| 84 | ---- | |
| 85 | - | |
| 86 | -## 📋 新的项目结构 | |
| 87 | - | |
| 88 | -``` | |
| 89 | -offline_tasks/ | |
| 90 | -├── scripts/ # Python脚本 | |
| 91 | -│ ├── fetch_item_attributes.py # 前置:获取商品属性 | |
| 92 | -│ ├── generate_session.py # 前置:生成session | |
| 93 | -│ ├── i2i_swing.py # Python Swing | |
| 94 | -│ ├── i2i_session_w2v.py # Session W2V | |
| 95 | -│ ├── i2i_deepwalk.py # DeepWalk | |
| 96 | -│ ├── i2i_content_similar.py # 内容相似度 | |
| 97 | -│ ├── interest_aggregation.py # 兴趣聚合 | |
| 98 | -│ ├── load_index_to_redis.py # 加载到Redis | |
| 99 | -│ ├── add_names_to_swing.py # 添加商品名 | |
| 100 | -│ └── debug_utils.py # Debug工具 | |
| 101 | -├── collaboration/ # C++ Swing算法 | |
| 102 | -│ ├── src/ | |
| 103 | -│ │ ├── swing.cc # Swing实现 | |
| 104 | -│ │ ├── swing_symmetric.cc # 对称Swing | |
| 105 | -│ │ ├── icf_simple.cc # 简单协同 | |
| 106 | -│ │ └── ucf.py # 用户协同 | |
| 107 | -│ ├── bin/ # 编译后的二进制 | |
| 108 | -│ ├── include/ # 头文件 | |
| 109 | -│ ├── utils/ # 工具函数 | |
| 110 | -│ ├── run.sh # C++ Swing执行脚本 | |
| 111 | -│ ├── Makefile # 编译配置 | |
| 112 | -│ └── output/ # 输出目录 | |
| 113 | -├── config/ | |
| 114 | -│ └── offline_config.py # 配置文件 | |
| 115 | -├── doc/ # 文档中心 | |
| 116 | -│ ├── README.md | |
| 117 | -│ ├── 快速开始.md | |
| 118 | -│ ├── Swing算法使用指南.md | |
| 119 | -│ ├── 离线索引数据规范.md | |
| 120 | -│ ├── Redis数据规范.md | |
| 121 | -│ └── ... | |
| 122 | -├── output/ # 输出文件 | |
| 123 | -│ ├── item_attributes_mappings.json | |
| 124 | -│ ├── session.txt.* | |
| 125 | -│ └── *.txt | |
| 126 | -├── logs/ # 日志文件 | |
| 127 | -├── run.sh # ⭐ 主执行脚本(推荐) | |
| 128 | -├── run_all.py # Python版本(保留但简化) | |
| 129 | -└── README.md | |
| 130 | -``` | |
| 131 | - | |
| 132 | ---- | |
| 133 | - | |
| 134 | -## 🚀 使用方式 | |
| 135 | - | |
| 136 | -### 主要方式:run.sh(推荐) | |
| 137 | - | |
| 138 | -```bash | |
| 139 | -cd /home/tw/recommendation/offline_tasks | |
| 140 | - | |
| 141 | -# 直接运行(使用默认配置) | |
| 142 | -bash run.sh | |
| 143 | - | |
| 144 | -# 修改配置后运行 | |
| 145 | -# 编辑 run.sh 顶部的配置区域 | |
| 146 | -vim run.sh | |
| 147 | - | |
| 148 | -# 查看帮助 | |
| 149 | -cat run.sh | head -40 # 查看配置说明 | |
| 150 | -``` | |
| 151 | - | |
| 152 | -**run.sh配置项**: | |
| 153 | -```bash | |
| 154 | -# 算法参数 | |
| 155 | -LOOKBACK_DAYS=730 | |
| 156 | -TOP_N=50 | |
| 157 | -DEBUG_MODE="--debug" # 留空则不开启debug | |
| 158 | - | |
| 159 | -# Redis配置 | |
| 160 | -REDIS_HOST="localhost" | |
| 161 | -REDIS_PORT=6379 | |
| 162 | - | |
| 163 | -# 内存监控阈值 | |
| 164 | -MEM_WARN_THRESHOLD=25 # GB | |
| 165 | -MEM_KILL_THRESHOLD=35 # GB | |
| 166 | -``` | |
| 167 | - | |
| 168 | -### 备用方式:run_all.py(简化版) | |
| 169 | - | |
| 170 | -```bash | |
| 171 | -cd /home/tw/recommendation/offline_tasks | |
| 172 | - | |
| 173 | -# 运行(不包括C++ Swing和Redis加载) | |
| 174 | -python3 run_all.py --debug | |
| 175 | -``` | |
| 176 | - | |
| 177 | -**注意**: `run_all.py`已简化,只包含: | |
| 178 | -- 前置任务(商品属性、session) | |
| 179 | -- Python算法任务(Swing、W2V、DeepWalk等) | |
| 180 | -- 不包括C++ Swing和Redis加载 | |
| 181 | - | |
| 182 | ---- | |
| 183 | - | |
| 184 | -## 📊 执行流程对比 | |
| 185 | - | |
| 186 | -### run.sh(完整流程) | |
| 187 | - | |
| 188 | -``` | |
| 189 | -1. 环境准备 | |
| 190 | - ├─ 清理旧进程 | |
| 191 | - └─ 创建必要目录 | |
| 192 | - | |
| 193 | -2. 前置任务 | |
| 194 | - ├─ fetch_item_attributes.py → 商品属性映射 | |
| 195 | - ├─ generate_session.py → 用户session | |
| 196 | - └─ collaboration/run.sh → C++ Swing (高性能) | |
| 197 | - | |
| 198 | -3. i2i算法任务 | |
| 199 | - ├─ i2i_swing.py → Python Swing (日期维度) | |
| 200 | - ├─ i2i_session_w2v.py → Session W2V | |
| 201 | - ├─ i2i_deepwalk.py → DeepWalk | |
| 202 | - └─ i2i_content_similar.py → 内容相似度 | |
| 203 | - | |
| 204 | -4. 兴趣聚合 | |
| 205 | - └─ interest_aggregation.py → 多维度聚合 | |
| 206 | - | |
| 207 | -5. 加载Redis | |
| 208 | - └─ load_index_to_redis.py → 导入Redis | |
| 209 | - | |
| 210 | -6. 完成 | |
| 211 | - └─ 输出结果文件列表 | |
| 212 | -``` | |
| 213 | - | |
| 214 | -### run_all.py(简化流程) | |
| 215 | - | |
| 216 | -``` | |
| 217 | -1. 前置任务 | |
| 218 | - ├─ fetch_item_attributes.py | |
| 219 | - └─ generate_session.py | |
| 220 | - | |
| 221 | -2. i2i算法任务 | |
| 222 | - ├─ i2i_swing.py | |
| 223 | - ├─ i2i_session_w2v.py | |
| 224 | - ├─ i2i_deepwalk.py | |
| 225 | - └─ i2i_content_similar.py | |
| 226 | - | |
| 227 | -3. 兴趣聚合 | |
| 228 | - └─ interest_aggregation.py | |
| 229 | -``` | |
| 230 | - | |
| 231 | ---- | |
| 232 | - | |
| 233 | -## 💡 关键改进 | |
| 234 | - | |
| 235 | -### 1. 代码简化 | |
| 236 | - | |
| 237 | -**删除的冗余代码**: | |
| 238 | -- `run_all.py`中的`run_cpp_swing()`函数(45行) | |
| 239 | -- 复杂的子进程调用和错误处理 | |
| 240 | - | |
| 241 | -**简化效果**: | |
| 242 | -- run.sh: 直接调用,清晰明了 | |
| 243 | -- run_all.py: 从270行简化到211行 | |
| 244 | - | |
| 245 | -### 2. 灵活性提升 | |
| 246 | - | |
| 247 | -**run.sh的优势**: | |
| 248 | -```bash | |
| 249 | -# 内存监控(自动) | |
| 250 | -check_memory $pid "$task_name" & | |
| 251 | - | |
| 252 | -# 任务函数(统一) | |
| 253 | -run_task "任务名" "python3 scripts/xxx.py" | |
| 254 | - | |
| 255 | -# 配置集中(顶部) | |
| 256 | -LOOKBACK_DAYS=730 | |
| 257 | -DEBUG_MODE="--debug" | |
| 258 | -``` | |
| 259 | - | |
| 260 | -### 3. 错误处理 | |
| 261 | - | |
| 262 | -**之前**: | |
| 263 | -- Python捕获异常,日志分散 | |
| 264 | -- 失败后需要手动排查 | |
| 265 | - | |
| 266 | -**现在**: | |
| 267 | -- Shell直接显示错误 | |
| 268 | -- 内存监控自动处理OOM | |
| 269 | -- 任务失败继续执行后续任务 | |
| 270 | - | |
| 271 | ---- | |
| 272 | - | |
| 273 | -## 🔧 常见操作 | |
| 274 | - | |
| 275 | -### 修改算法参数 | |
| 276 | - | |
| 277 | -```bash | |
| 278 | -# 编辑 run.sh | |
| 279 | -vim run.sh | |
| 280 | - | |
| 281 | -# 修改这些参数 | |
| 282 | -LOOKBACK_DAYS=365 # 回看天数 | |
| 283 | -TOP_N=100 # 推荐数量 | |
| 284 | -DEBUG_MODE="" # 关闭debug | |
| 285 | -``` | |
| 286 | - | |
| 287 | -### 只运行特定任务 | |
| 288 | - | |
| 289 | -```bash | |
| 290 | -cd /home/tw/recommendation/offline_tasks | |
| 291 | - | |
| 292 | -# 只运行C++ Swing | |
| 293 | -cd collaboration && bash run.sh && cd .. | |
| 294 | - | |
| 295 | -# 只运行Python Swing | |
| 296 | -python3 scripts/i2i_swing.py --lookback_days 730 --debug | |
| 297 | - | |
| 298 | -# 只加载Redis | |
| 299 | -python3 scripts/load_index_to_redis.py --redis-host localhost | |
| 300 | -``` | |
| 301 | - | |
| 302 | -### 查看日志 | |
| 303 | - | |
| 304 | -```bash | |
| 305 | -# 主日志 | |
| 306 | -tail -f logs/run_all_$(date +%Y%m%d).log | |
| 307 | - | |
| 308 | -# 内存监控日志 | |
| 309 | -tail -f logs/memory_monitor.log | |
| 310 | - | |
| 311 | -# Debug日志 | |
| 312 | -ls logs/debug/ | |
| 313 | -``` | |
| 314 | - | |
| 315 | ---- | |
| 316 | - | |
| 317 | -## 📝 迁移指南 | |
| 318 | - | |
| 319 | -如果你之前使用`python3 run_all.py`,现在改用`bash run.sh`: | |
| 320 | - | |
| 321 | -### 命令对应关系 | |
| 322 | - | |
| 323 | -| 之前 | 现在 | 说明 | | |
| 324 | -|------|------|------| | |
| 325 | -| `python3 run_all.py` | `bash run.sh` | 完整流程 | | |
| 326 | -| `python3 run_all.py --debug` | `bash run.sh` | run.sh默认开启debug | | |
| 327 | -| 无对应命令 | `bash run.sh` | 现在包含Redis加载 | | |
| 328 | - | |
| 329 | -### 定时任务更新 | |
| 330 | - | |
| 331 | -**旧的crontab**: | |
| 332 | -```cron | |
| 333 | -0 3 * * * cd /home/tw/recommendation/offline_tasks && python3 run_all.py | |
| 334 | -``` | |
| 335 | - | |
| 336 | -**新的crontab**: | |
| 337 | -```cron | |
| 338 | -0 3 * * * cd /home/tw/recommendation/offline_tasks && bash run.sh >> logs/cron_$(date +\%Y\%m\%d).log 2>&1 | |
| 339 | -``` | |
| 340 | - | |
| 341 | ---- | |
| 342 | - | |
| 343 | -## ⚠️ 注意事项 | |
| 344 | - | |
| 345 | -1. **路径依赖**: | |
| 346 | - - 确保在`offline_tasks`目录下执行`bash run.sh` | |
| 347 | - - 不要在其他目录执行 | |
| 348 | - | |
| 349 | -2. **内存监控**: | |
| 350 | - - 默认阈值:警告25GB,终止35GB | |
| 351 | - - 根据服务器配置调整`MEM_WARN_THRESHOLD`和`MEM_KILL_THRESHOLD` | |
| 352 | - | |
| 353 | -3. **并行执行**: | |
| 354 | - - 不建议同时运行多个`run.sh`实例 | |
| 355 | - - 脚本会自动清理旧进程 | |
| 356 | - | |
| 357 | -4. **失败处理**: | |
| 358 | - - 单个任务失败不会终止整体流程 | |
| 359 | - - 查看日志确认失败原因 | |
| 360 | - | |
| 361 | ---- | |
| 362 | - | |
| 363 | -## 🎯 总结 | |
| 364 | - | |
| 365 | -### 改进前后对比 | |
| 366 | - | |
| 367 | -| 方面 | 改进前 | 改进后 | | |
| 368 | -|------|--------|--------| | |
| 369 | -| **目录结构** | collaboration在外层 | 统一在offline_tasks内 | | |
| 370 | -| **主执行脚本** | run_all.py (Python) | run.sh (Shell) | | |
| 371 | -| **代码复杂度** | 270行,多层抽象 | 214行,直接调用 | | |
| 372 | -| **配置方式** | 参数分散 | 集中在顶部 | | |
| 373 | -| **内存监控** | 无 | 自动监控+自动终止 | | |
| 374 | -| **错误处理** | Python异常捕获 | Shell直接显示 | | |
| 375 | -| **包含任务** | 不含Redis加载 | 含完整流程 | | |
| 376 | - | |
| 377 | -### 核心改进 | |
| 378 | - | |
| 379 | -1. ✅ **结构简化**: collaboration目录移入,统一管理 | |
| 380 | -2. ✅ **代码简化**: 去除冗余抽象,直接调用脚本 | |
| 381 | -3. ✅ **功能增强**: 添加内存监控、统一任务管理 | |
| 382 | -4. ✅ **易用性**: 配置集中、日志清晰、错误明确 | |
| 383 | - | |
| 384 | ---- | |
| 385 | - | |
| 386 | -## 📚 相关文档 | |
| 387 | - | |
| 388 | -- [快速开始](./快速开始.md) | |
| 389 | -- [运行脚本指南](./运行脚本指南.md) | |
| 390 | -- [故障排查指南](./故障排查指南.md) | |
| 391 | -- [系统改进总结](./系统改进总结-20241017.md) | |
| 392 | - | |
| 393 | ---- | |
| 394 | - | |
| 395 | -**更新时间**: 2024-10-17 | |
| 396 | -**状态**: ✅ 已完成并测试 | |
| 397 | - |