Commit 0d5f0a82b42b677f980edc6169ea9072e09ab502

Authored by tangwang
1 parent 2915a5b4

docs

offline_tasks/doc/COMPLETE_INDEX_LIST.md deleted
@@ -1,350 +0,0 @@ @@ -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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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 -  
offline_tasks/doc/详细设计文档.md 0 → 100644
@@ -0,0 +1,711 @@ @@ -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,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,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,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 -