Commit 223145fe165efeed8b4e8540cf01a709bd00aaee

Authored by tangwang
1 parent c59dd0b0

补充部分任务明文版本输出

offline_tasks/CHANGELOG_DEBUG_MODE.md deleted
... ... @@ -1,176 +0,0 @@
1   -# 离线推荐任务 - Debug模式功能更新
2   -
3   -## 更新日期
4   -2025-10-22
5   -
6   -## 更新内容
7   -
8   -为所有离线推荐任务添加了debug模式支持,使得所有任务都能够生成明文可读文件,方便查看推荐效果。
9   -
10   -## 修改的文件
11   -
12   -### 1. 脚本文件
13   -
14   -#### ✅ 新增debug支持的脚本
15   -
16   -1. **scripts/i2i_content_similar.py**
17   - - 添加 `--debug` 参数支持
18   - - 添加 `--top_n` 参数支持
19   - - 导入 `save_readable_index` 和 `fetch_name_mappings` 函数
20   - - 修改 `generate_similarity_index` 函数,支持传入 `top_n` 参数
21   - - 在debug模式下生成两个可读文件:
22   - - `output/debug/i2i_content_name_YYYYMMDD_readable.txt`
23   - - `output/debug/i2i_content_pic_YYYYMMDD_readable.txt`
24   -
25   -2. **scripts/i2i_item_behavior.py**
26   - - 导入 `save_readable_index` 函数
27   - - 在debug模式下生成可读文件:
28   - - `output/debug/i2i_item_behavior_YYYYMMDD_readable.txt`
29   -
30   -#### ✅ 已有debug支持的脚本(保持不变)
31   -
32   -以下脚本已经支持debug模式,无需修改:
33   -
34   -1. **scripts/i2i_swing.py** ✓
35   -2. **scripts/i2i_session_w2v.py** ✓
36   -3. **scripts/i2i_deepwalk.py** ✓
37   -4. **scripts/interest_aggregation.py** ✓
38   -5. **scripts/tag_category_similar.py** ✓ (有自己的实现)
39   -
40   -### 2. 调度脚本
41   -
42   -#### run.sh
43   -- 更新 Task 4 (内容相似度),添加 `--top_n $TOP_N $DEBUG_MODE` 参数
44   -- 确保所有任务都统一使用 `$DEBUG_MODE` 变量
45   -
46   -### 3. 文档文件
47   -
48   -#### 新增文档
49   -
50   -1. **DEBUG_MODE_USAGE.md**
51   - - 完整的debug模式使用说明
52   - - 包含所有支持debug模式的任务列表
53   - - 使用方法和示例
54   - - 性能影响说明
55   - - 故障排查指南
56   -
57   -2. **CHANGELOG_DEBUG_MODE.md** (本文件)
58   - - 记录此次更新的详细内容
59   -
60   -## 功能特性
61   -
62   -### Debug模式输出格式
63   -
64   -所有任务在开启debug模式后,都会在 `output/debug/` 目录生成对应的可读文件,格式统一为:
65   -
66   -```
67   -================================================================================
68   -明文索引文件
69   -生成时间: 2025-10-22 14:30:25
70   -描述: i2i:task_name
71   -总索引数: XXXXX
72   -================================================================================
73   -
74   -[1] i2i:task_name:item_id (商品名称)
75   ---------------------------------------------------------------------------------
76   - 1. ID:similar_id_1(相似商品1名称) - Score:0.8520
77   - 2. ID:similar_id_2(相似商品2名称) - Score:0.7845
78   - 3. ID:similar_id_3(相似商品3名称) - Score:0.7321
79   - ...
80   -```
81   -
82   -### 现在所有任务都支持的可读文件
83   -
84   -| 任务 | 标准输出文件 | 可读文件 |
85   -|------|-------------|---------|
86   -| Swing算法 | `i2i_swing_YYYYMMDD.txt` | `debug/i2i_swing_YYYYMMDD_readable.txt` |
87   -| Session W2V | `i2i_session_w2v_YYYYMMDD.txt` | `debug/i2i_session_w2v_YYYYMMDD_readable.txt` |
88   -| DeepWalk | `i2i_deepwalk_YYYYMMDD.txt` | `debug/i2i_deepwalk_YYYYMMDD_readable.txt` |
89   -| 内容相似度(名称) | `i2i_content_name_YYYYMMDD.txt` | `debug/i2i_content_name_YYYYMMDD_readable.txt` |
90   -| 内容相似度(图片) | `i2i_content_pic_YYYYMMDD.txt` | `debug/i2i_content_pic_YYYYMMDD_readable.txt` |
91   -| Item行为相似度 | `i2i_item_behavior_YYYYMMDD.txt` | `debug/i2i_item_behavior_YYYYMMDD_readable.txt` |
92   -| Tag分类相似度 | `tag_category_similar_YYYYMMDD.txt` | `debug/tag_category_similar_YYYYMMDD_readable.txt` |
93   -| 兴趣聚合(热门) | `interest_hot_YYYYMMDD.txt` | `debug/interest_hot_YYYYMMDD_readable.txt` |
94   -| 兴趣聚合(购物车) | `interest_cart_YYYYMMDD.txt` | `debug/interest_cart_YYYYMMDD_readable.txt` |
95   -| 兴趣聚合(新品) | `interest_new_YYYYMMDD.txt` | `debug/interest_new_YYYYMMDD_readable.txt` |
96   -| 兴趣聚合(全局) | `interest_global_YYYYMMDD.txt` | `debug/interest_global_YYYYMMDD_readable.txt` |
97   -
98   -## 使用方法
99   -
100   -### 全局开启/关闭debug模式
101   -
102   -编辑 `run.sh`,修改 `DEBUG_MODE` 变量:
103   -
104   -```bash
105   -DEBUG_MODE="--debug" # 开启debug模式
106   -# 或
107   -DEBUG_MODE="" # 关闭debug模式
108   -```
109   -
110   -### 单独运行任务
111   -
112   -```bash
113   -# i2i内容相似度
114   -python3 scripts/i2i_content_similar.py --top_n 50 --debug
115   -
116   -# i2i行为相似度
117   -python3 scripts/i2i_item_behavior.py --lookback_days 180 --top_n 50 --debug
118   -```
119   -
120   -## 验证
121   -
122   -所有修改已通过以下验证:
123   -
124   -1. ✅ Python语法检查 (`python3 -m py_compile`)
125   -2. ✅ Linter检查 (无错误)
126   -3. ✅ 代码逻辑审查
127   -4. ✅ 与现有debug模式实现保持一致
128   -
129   -## 向后兼容性
130   -
131   -- ✅ 不传 `--debug` 参数时,行为与之前完全一致
132   -- ✅ 标准输出文件格式不变
133   -- ✅ 所有现有脚本和调度任务继续正常工作
134   -
135   -## 性能影响
136   -
137   -- 不开启debug模式:无性能影响
138   -- 开启debug模式:任务时间增加约10-20%(主要用于查询商品名称)
139   -
140   -## 后续建议
141   -
142   -1. 定期清理 `output/debug/` 目录,避免占用过多磁盘空间
143   -2. 在生产环境建议关闭debug模式,仅在需要检查效果时开启
144   -3. 可以考虑添加自动清理脚本,保留最近N天的debug文件
145   -
146   -## 文件清单
147   -
148   -### 修改的文件
149   -- `scripts/i2i_content_similar.py`
150   -- `scripts/i2i_item_behavior.py`
151   -- `run.sh`
152   -
153   -### 新增的文件
154   -- `DEBUG_MODE_USAGE.md`
155   -- `CHANGELOG_DEBUG_MODE.md`
156   -
157   -## 测试建议
158   -
159   -运行以下命令测试debug模式是否正常工作:
160   -
161   -```bash
162   -# 测试i2i_content_similar
163   -cd /home/tw/recommendation/offline_tasks
164   -python3 scripts/i2i_content_similar.py --top_n 10 --debug
165   -
166   -# 测试i2i_item_behavior
167   -python3 scripts/i2i_item_behavior.py --lookback_days 30 --top_n 10 --debug
168   -
169   -# 检查是否生成了可读文件
170   -ls -lh output/debug/*_readable.txt
171   -```
172   -
173   -## 总结
174   -
175   -此次更新确保了所有离线推荐任务都具有统一的debug模式支持,使得开发和运维人员能够更方便地查看和验证推荐效果,提高了系统的可维护性和可观测性。
176   -
offline_tasks/CHANGES_SUMMARY.md deleted
... ... @@ -1,102 +0,0 @@
1   -# 更新总结 - 2025-10-22
2   -
3   -## 1. 修改 tag_category_similar.py 脚本
4   -
5   -### 主要变更
6   -- **SQL查询修改**:从只查询分类名称改为同时查询分类ID和名称
7   - - 修改前:`GROUP_CONCAT(pc_1.name) AS '商品信息'`
8   - - 修改后:`GROUP_CONCAT(DISTINCT CONCAT(pc_1.id, ':', pc_1.name)) AS '商品信息'`
9   -
10   -- **数据处理修改**:解析ID和名称对,建立ID到名称的映射
11   - ```python
12   - cat_id_to_name = {}
13   - for cat_pair in categories:
14   - if ':' in cat_pair:
15   - cat_id, cat_name = cat_pair.split(':', 1)
16   - cat_id_to_name[cat_id] = cat_name
17   - unique_cats.add(cat_id)
18   - ```
19   -
20   -- **输出格式修改**:
21   - - **主输出文件**(`output/tag_category_similar_YYYYMMDD.txt`):只包含ID
22   - - 格式:`category_id \t similar_id1:score1,similar_id2:score2,...`
23   - - **Debug文件**(`output/debug/tag_category_similar_YYYYMMDD_readable.txt`):包含ID+名称
24   - - 格式:`category_id:category_name \t similar_id1:similar_name1:score1,...`
25   -
26   -### 输出示例
27   -
28   -**主文件(用于Redis加载):**
29   -```
30   -123 456:0.8123,789:0.7654,234:0.6543
31   -```
32   -
33   -**Debug文件(便于人工查看):**
34   -```
35   -================================================================================
36   -明文索引文件
37   -生成时间: 2025-10-22 HH:MM:SS
38   -描述: tag_category_similar (分类相似度)
39   -总索引数: 708
40   -================================================================================
41   -
42   -123:BB夹/一字夹 456:横夹:0.8123,789:橡皮筋/发圈:0.7654,234:抓夹:0.6543
43   -```
44   -
45   -## 2. 更新详细设计文档
46   -
47   -### 修改位置
48   -文件:`offline_tasks/doc/详细设计文档.md`
49   -章节:📊 数据量统计
50   -
51   -### 变更内容
52   -- 基于真实输出文件统计了实际数据量
53   -- 更新了所有索引类型的准确数量和大小
54   -- 添加了 `tag_category_similar` 索引统计
55   -- 更新了Redis内存占用预估(从180MB更新为400MB)
56   -
57   -### 实际数据统计(2025-10-22)
58   -
59   -| 索引类型 | 索引数量 | 单条平均大小 | 总大小 | 更新频率 |
60   -|---------|---------|---------|--------|---------|
61   -| i2i_deepwalk | 48,376 | ~780B | 36MB | 每天 |
62   -| i2i_session_w2v | 50,990 | ~840B | 41MB | 每天 |
63   -| i2i_content_name | 127,720 | ~830B | 101MB | 每周 |
64   -| i2i_content_pic | 0 | - | 0 | 每周 |
65   -| i2i_item_behavior | 178,775 | ~750B | 128MB | 每天 |
66   -| interest_hot | 14,001 | ~520B | 6.9MB | 每天 |
67   -| interest_cart | 15,563 | ~670B | 10MB | 每天 |
68   -| interest_new | 6,463 | ~500B | 3.1MB | 每天 |
69   -| interest_global | 17,533 | ~660B | 11MB | 每天 |
70   -| tag_category_similar | 708 | ~930B | 630KB | 每周 |
71   -| **总计** | **~460,000** | - | **~338MB** | - |
72   -
73   -## 3. 需要执行的操作
74   -
75   -要应用这些更改,需要重新运行脚本:
76   -
77   -```bash
78   -cd /home/tw/recommendation/offline_tasks
79   -python scripts/tag_category_similar.py --debug
80   -```
81   -
82   -这将生成:
83   -- `output/tag_category_similar_20251022.txt` - ID格式的主文件
84   -- `output/debug/tag_category_similar_20251022_readable.txt` - 可读格式的调试文件
85   -
86   -## 4. 影响分析
87   -
88   -### 向后兼容性
89   -- ⚠️ **破坏性变更**:主输出文件格式从名称改为ID
90   -- 需要更新所有使用该文件的下游系统(特别是Redis加载脚本)
91   -
92   -### 优势
93   -1. ✅ ID格式更稳定,不受名称变更影响
94   -2. ✅ 数据更准确,避免名称重复问题
95   -3. ✅ 保留可读版本便于调试和验证
96   -4. ✅ 与其他索引文件格式保持一致
97   -
98   -### 建议
99   -- 更新Redis加载脚本,使其能够处理category ID
100   -- 在API层做ID到名称的转换(如需要)
101   -- 保持debug文件生成,便于问题排查
102   -
offline_tasks/DEBUG_MODE_USAGE.md deleted
... ... @@ -1,125 +0,0 @@
1   -# Debug模式使用说明
2   -
3   -## 概述
4   -
5   -所有推荐任务脚本都支持 `--debug` 参数,开启后会在 `output/debug/` 目录下生成可读的明文索引文件,方便查看推荐效果。
6   -
7   -## 支持Debug模式的任务
8   -
9   -| 任务名称 | 脚本文件 | 输出文件 | 可读文件位置 |
10   -|---------|---------|---------|-------------|
11   -| Swing算法 | `i2i_swing.py` | `i2i_swing_YYYYMMDD.txt` | `output/debug/i2i_swing_YYYYMMDD_readable.txt` |
12   -| Session W2V | `i2i_session_w2v.py` | `i2i_session_w2v_YYYYMMDD.txt` | `output/debug/i2i_session_w2v_YYYYMMDD_readable.txt` |
13   -| DeepWalk | `i2i_deepwalk.py` | `i2i_deepwalk_YYYYMMDD.txt` | `output/debug/i2i_deepwalk_YYYYMMDD_readable.txt` |
14   -| 内容相似度(名称) | `i2i_content_similar.py` | `i2i_content_name_YYYYMMDD.txt` | `output/debug/i2i_content_name_YYYYMMDD_readable.txt` |
15   -| 内容相似度(图片) | `i2i_content_similar.py` | `i2i_content_pic_YYYYMMDD.txt` | `output/debug/i2i_content_pic_YYYYMMDD_readable.txt` |
16   -| Item行为相似度 | `i2i_item_behavior.py` | `i2i_item_behavior_YYYYMMDD.txt` | `output/debug/i2i_item_behavior_YYYYMMDD_readable.txt` |
17   -| Tag分类相似度 | `tag_category_similar.py` | `tag_category_similar_YYYYMMDD.txt` | `output/debug/tag_category_similar_YYYYMMDD_readable.txt` |
18   -| 兴趣聚合 | `interest_aggregation.py` | `interest_*_YYYYMMDD.txt` | `output/debug/interest_*_YYYYMMDD_readable.txt` |
19   -
20   -## 使用方法
21   -
22   -### 方法1: 通过run.sh全局开启
23   -
24   -在 `run.sh` 中设置:
25   -
26   -```bash
27   -DEBUG_MODE="--debug" # 开启debug模式
28   -# 或
29   -DEBUG_MODE="" # 关闭debug模式
30   -```
31   -
32   -然后运行:
33   -
34   -```bash
35   -bash run.sh
36   -```
37   -
38   -### 方法2: 单独运行某个任务
39   -
40   -#### 示例1: 运行Session W2V (已支持debug模式)
41   -
42   -```bash
43   -python3 scripts/i2i_session_w2v.py --lookback_days 400 --top_n 50 --debug
44   -```
45   -
46   -#### 示例2: 运行DeepWalk (已支持debug模式)
47   -
48   -```bash
49   -python3 scripts/i2i_deepwalk.py --lookback_days 400 --top_n 50 --debug
50   -```
51   -
52   -#### 示例3: 运行内容相似度 (新增debug模式)
53   -
54   -```bash
55   -python3 scripts/i2i_content_similar.py --top_n 50 --debug
56   -```
57   -
58   -#### 示例4: 运行Item行为相似度 (新增debug模式)
59   -
60   -```bash
61   -python3 scripts/i2i_item_behavior.py --lookback_days 180 --top_n 50 --debug
62   -```
63   -
64   -#### 示例5: 运行兴趣聚合 (已支持debug模式)
65   -
66   -```bash
67   -python3 scripts/interest_aggregation.py --lookback_days 400 --top_n 1000 --debug
68   -```
69   -
70   -## 可读文件格式
71   -
72   -可读文件格式示例:
73   -
74   -```
75   -================================================================================
76   -明文索引文件
77   -生成时间: 2025-10-22 14:30:25
78   -描述: i2i:session_w2v
79   -总索引数: 50990
80   -================================================================================
81   -
82   -[1] i2i:session_w2v:12345 (商品名称)
83   ---------------------------------------------------------------------------------
84   - 1. ID:23456(相似商品1名称) - Score:0.8520
85   - 2. ID:34567(相似商品2名称) - Score:0.7845
86   - 3. ID:45678(相似商品3名称) - Score:0.7321
87   - ...
88   -```
89   -
90   -## 性能影响
91   -
92   -- **不开启debug模式**: 只生成标准索引文件,速度最快
93   -- **开启debug模式**: 会额外查询数据库获取商品名称,生成可读文件,任务时间会增加约10-20%
94   -
95   -## 注意事项
96   -
97   -1. **磁盘空间**: 可读文件通常比标准索引文件大2-3倍,请确保有足够的磁盘空间
98   -2. **数据库负载**: debug模式会额外查询商品名称,在高并发场景下建议关闭
99   -3. **文件位置**: 所有可读文件都保存在 `output/debug/` 目录
100   -4. **定期清理**: 建议定期清理旧的debug文件,避免占用过多磁盘空间
101   -
102   -## 快速检查命令
103   -
104   -查看最新生成的可读文件:
105   -
106   -```bash
107   -# 列出所有可读文件
108   -ls -lh output/debug/*_readable.txt
109   -
110   -# 查看某个可读文件的前50行
111   -head -50 output/debug/i2i_session_w2v_20251022_readable.txt
112   -
113   -# 统计可读文件数量
114   -ls output/debug/*_readable.txt | wc -l
115   -```
116   -
117   -## 故障排查
118   -
119   -如果没有生成可读文件,检查:
120   -
121   -1. 是否传递了 `--debug` 参数
122   -2. `output/debug/` 目录是否存在且有写权限
123   -3. 查看日志文件确认是否有错误信息
124   -4. 检查数据库连接是否正常(需要查询商品名称)
125   -
offline_tasks/FIXES_SUMMARY.md deleted
... ... @@ -1,211 +0,0 @@
1   -# 离线任务修复总结
2   -
3   -## 修复日期
4   -2025-10-21
5   -
6   -## 问题和解决方案
7   -
8   -### 1. Task 5 和 Task 6: ModuleNotFoundError: No module named 'db_service'
9   -
10   -**问题**:
11   -- `i2i_item_behavior.py` 和 `tag_category_similar.py` 无法导入 `db_service` 模块
12   -- 所有脚本都使用了丑陋的 `sys.path.append()` hack
13   -
14   -**解决方案**:
15   -- 将 `db_service.py` 移动到 `offline_tasks/` 根目录(Python 运行根目录)
16   -- 删除所有脚本中的 `sys.path.append()` 代码
17   -- 在 `run.sh` 中设置 `PYTHONPATH=/home/tw/recommendation/offline_tasks`
18   -- 现在所有脚本都使用标准导入:`from db_service import create_db_connection`
19   -
20   -**影响的文件**:
21   -- `db_service.py` (移动到 offline_tasks 根目录)
22   -- `run.sh` (添加 PYTHONPATH 设置)
23   -- 所有 scripts/ 目录下的 12 个 Python 脚本 (清理了 sys.path 代码)
24   -
25   ----
26   -
27   -### 2. Task 3: DeepWalk 内存溢出 (OOM Kill - 退出码 137)
28   -
29   -**问题**:
30   -- DeepWalk 在"构建物品图"步骤时被系统杀死
31   -- 处理 348,043 条记录时内存消耗超过 35GB 限制
32   -- 原实现使用纯 Python 构建图,效率低
33   -
34   -**解决方案**:
35   -1. **复用高效实现**: 将 `graphembedding/deepwalk/` 的实现移动到 `offline_tasks/deepwalk/`
36   - - 使用 Alias 采样算法,比纯 Python 快 5-10 倍
37   - - 使用 joblib 多进程并行,避免 GIL
38   - - 使用 networkx 的高效图结构
39   -
40   -2. **完全重构** `i2i_deepwalk.py`:
41   - - 只负责数据适配(从数据库生成边文件)
42   - - 复用 `DeepWalk` 类进行随机游走
43   - - 添加内存保护:限制每个用户最多 100 个物品(按权重排序)
44   -
45   -3. **流程优化**:
46   - ```
47   - 数据库数据 → 边文件 → DeepWalk 随机游走 → Word2Vec 训练 → 相似度生成
48   - ```
49   -
50   -**新增文件**:
51   -- `offline_tasks/deepwalk/deepwalk.py` - DeepWalk 核心实现(Alias 采样)
52   -- `offline_tasks/deepwalk/alias.py` - Alias 采样算法
53   -
54   -**性能提升**:
55   -- 内存使用降低 60-70%
56   -- 速度提升 3-5 倍
57   -- 不会再被 OOM Kill
58   -
59   ----
60   -
61   -## 最终架构
62   -
63   -### 文件结构
64   -```
65   -offline_tasks/ (Python 根目录,通过 PYTHONPATH 设置)
66   - ├── db_service.py ✓
67   - ├── config/
68   - │ └── offline_config.py ✓
69   - ├── deepwalk/ ✓
70   - │ ├── deepwalk.py (高效实现)
71   - │ └── alias.py (Alias 采样)
72   - ├── scripts/
73   - │ ├── debug_utils.py
74   - │ ├── fetch_item_attributes.py
75   - │ ├── generate_session.py
76   - │ ├── i2i_swing.py
77   - │ ├── i2i_session_w2v.py
78   - │ ├── i2i_deepwalk.py ✓ (重构)
79   - │ ├── i2i_content_similar.py
80   - │ ├── i2i_item_behavior.py ✓ (修复)
81   - │ ├── tag_category_similar.py ✓ (修复)
82   - │ └── interest_aggregation.py
83   - └── run.sh ✓ (设置 PYTHONPATH)
84   -```
85   -
86   -### 导入规范
87   -所有脚本使用标准导入,无 `sys.path` hack:
88   -
89   -```python
90   -# 标准导入
91   -from db_service import create_db_connection
92   -from config.offline_config import DB_CONFIG, OUTPUT_DIR
93   -from scripts.debug_utils import setup_debug_logger
94   -from deepwalk.deepwalk import DeepWalk
95   -```
96   -
97   -### run.sh 配置
98   -```bash
99   -#!/bin/bash
100   -
101   -# 设置 Python 路径,让脚本能找到 db_service, config, deepwalk 等模块
102   -export PYTHONPATH=/home/tw/recommendation/offline_tasks:$PYTHONPATH
103   -
104   -cd /home/tw/recommendation/offline_tasks
105   -# ... 其他代码
106   -```
107   -
108   ----
109   -
110   -## 测试
111   -
112   -### 运行测试脚本
113   -```bash
114   -cd /home/tw/recommendation/offline_tasks
115   -./test_fixes.sh
116   -```
117   -
118   -### 测试单个任务
119   -```bash
120   -cd /home/tw/recommendation/offline_tasks
121   -
122   -# 测试 Task 5
123   -python3 scripts/i2i_item_behavior.py --lookback_days 400 --top_n 50 --debug
124   -
125   -# 测试 Task 6
126   -python3 scripts/tag_category_similar.py --lookback_days 400 --top_n 50 --debug
127   -
128   -# 测试 Task 3 (建议先用较小参数测试)
129   -python3 scripts/i2i_deepwalk.py --lookback_days 200 --top_n 30 --num_walks 5 --walk_length 20 --save_model --save_graph --debug
130   -```
131   -
132   -### 运行完整流程
133   -```bash
134   -cd /home/tw/recommendation/offline_tasks
135   -bash run.sh
136   -```
137   -
138   ----
139   -
140   -## DeepWalk 参数调优建议
141   -
142   -### 内存充足 (>50GB 可用)
143   -```bash
144   ---lookback_days 400
145   ---num_walks 10
146   ---walk_length 40
147   ---top_n 50
148   -```
149   -
150   -### 内存有限 (30-50GB)
151   -```bash
152   ---lookback_days 200
153   ---num_walks 5
154   ---walk_length 30
155   ---top_n 50
156   -```
157   -
158   -### 内存紧张 (<30GB)
159   -```bash
160   ---lookback_days 100
161   ---num_walks 3
162   ---walk_length 20
163   ---top_n 30
164   -```
165   -
166   -### run.sh 推荐配置
167   -修改 `run.sh` 第 164 行(根据实际内存情况调整):
168   -```bash
169   -# 内存优化版本 (推荐)
170   -run_task "Task 3: DeepWalk" \
171   - "python3 scripts/i2i_deepwalk.py --lookback_days 200 --top_n 50 --num_walks 5 --walk_length 30 --save_model --save_graph $DEBUG_MODE"
172   -```
173   -
174   ----
175   -
176   -## 代码质量提升
177   -
178   -1. ✅ **移除所有 `sys.path` hack** - 使用标准 Python 模块导入
179   -2. ✅ **清晰的模块结构** - offline_tasks 作为 Python 根目录
180   -3. ✅ **更好的代码复用** - 复用 graphembedding/deepwalk 的高效实现
181   -4. ✅ **内存优化** - 添加保护机制,避免 OOM
182   -5. ✅ **性能提升** - 使用 Alias 采样和多进程并行
183   -
184   ----
185   -
186   -## 注意事项
187   -
188   -1. **PYTHONPATH**: 必须在 `offline_tasks/` 目录下运行脚本,或者设置 `PYTHONPATH`
189   -2. **临时文件**: DeepWalk 会在 `output/temp/` 生成临时文件,运行完会自动清理
190   -3. **日志**: 所有 debug 日志在 `logs/debug/` 目录
191   -4. **内存监控**: run.sh 会持续监控内存,超过 35GB 会自动终止进程
192   -
193   ----
194   -
195   -## 验证清单
196   -
197   -✅ 所有 `sys.path.append()` 已清理
198   -✅ `db_service.py` 在 offline_tasks 根目录
199   -✅ `deepwalk/` 已移动到 offline_tasks
200   -✅ `run.sh` 设置了 PYTHONPATH
201   -✅ 所有脚本语法检查通过
202   -✅ 所有导入语句正确
203   -✅ i2i_deepwalk.py 已重构
204   -
205   ----
206   -
207   -## 下一步
208   -
209   -1. 运行 `bash run.sh` 测试完整流程
210   -2. 根据实际运行情况调整 DeepWalk 参数
211   -3. 监控内存使用情况,必要时进一步优化
offline_tasks/IMPORT_FIXES.md deleted
... ... @@ -1,96 +0,0 @@
1   -# Import 修复报告
2   -
3   -## 修复日期
4   -2025-10-21
5   -
6   -## 修复内容
7   -
8   -### 添加缺失的 `import os`
9   -
10   -以下文件缺少 `import os` 导入,已全部修复:
11   -
12   -1. ✅ **add_names_to_swing.py** - 添加了 `import os`
13   -2. ✅ **generate_session.py** - 规范化了导入(从 `import json,os` 改为单独的 `import os`)
14   -3. ✅ **i2i_session_w2v.py** - 添加了 `import os`
15   -4. ✅ **i2i_swing.py** - 添加了 `import os`
16   -5. ✅ **interest_aggregation.py** - 添加了 `import os`
17   -6. ✅ **tag_category_similar.py** - 添加了 `import os`
18   -
19   -## 验证结果
20   -
21   -### 所有脚本状态
22   -
23   -```
24   -✓ add_names_to_swing.py
25   -✓ debug_utils_backup.py
26   -✓ debug_utils.py
27   -✓ fetch_item_attributes.py
28   -✓ generate_session.py
29   -✓ i2i_content_similar.py
30   -✓ i2i_deepwalk.py
31   -✓ i2i_item_behavior.py
32   -✓ i2i_session_w2v.py
33   -✓ i2i_swing.py
34   -✓ interest_aggregation.py
35   -✓ load_index_to_redis.py
36   -✓ tag_category_similar.py
37   -```
38   -
39   -### 编译检查
40   -
41   -所有核心任务脚本编译通过,无语法错误。
42   -
43   -**注意**: `test_es_connection.py` 有语法错误(第183行),但这是测试文件,不影响主要任务运行。
44   -
45   -## 最终结构检查
46   -
47   -```
48   -✓ db_service.py 存在于 offline_tasks/ 根目录
49   -✓ config/offline_config.py 存在
50   -✓ deepwalk 模块完整 (deepwalk.py + alias.py)
51   -✓ run.sh 已设置 PYTHONPATH
52   -✓ 共 14 个脚本文件
53   -✓ 所有使用 os 模块的文件都已正确导入
54   -```
55   -
56   -## 导入规范
57   -
58   -所有脚本现在遵循标准导入规范:
59   -
60   -```python
61   -# 标准库导入
62   -import os
63   -import json
64   -import argparse
65   -from datetime import datetime
66   -from collections import defaultdict
67   -
68   -# 第三方库导入
69   -import pandas as pd
70   -import numpy as np
71   -from gensim.models import Word2Vec
72   -
73   -# 本地模块导入
74   -from db_service import create_db_connection
75   -from config.offline_config import DB_CONFIG, OUTPUT_DIR
76   -from scripts.debug_utils import setup_debug_logger
77   -from deepwalk.deepwalk import DeepWalk
78   -```
79   -
80   -## 完成清单
81   -
82   -- [x] 所有缺少 `import os` 的文件已修复
83   -- [x] 所有核心脚本编译通过
84   -- [x] 导入语句规范化
85   -- [x] 文件结构验证完成
86   -- [x] PYTHONPATH 设置正确
87   -
88   -## 可以运行了!
89   -
90   -```bash
91   -cd /home/tw/recommendation/offline_tasks
92   -bash run.sh
93   -```
94   -
95   -所有 Task 3, Task 5, Task 6 的问题都已解决!
96   -
offline_tasks/i2i_content_pic_analysis.md deleted
... ... @@ -1,167 +0,0 @@
1   -# i2i_content_pic 零产出原因分析
2   -
3   -## 📋 问题描述
4   -
5   -`output/i2i_content_pic_20251022.txt` 文件大小为0字节,没有产生任何图片向量相似度索引数据。
6   -
7   -## 🔍 原因分析
8   -
9   -### 1. ES数据检查结果
10   -
11   -**检查命令:**
12   -```bash
13   -curl -u "essa:4hOaLaf41y2VuI8y" "http://localhost:9200/spu/_count" \
14   - -H 'Content-Type: application/json' \
15   - -d '{"query": {"exists": {"field": "embedding_pic_h14"}}}'
16   -```
17   -
18   -**结果:**
19   -```json
20   -{"count": 0}
21   -```
22   -
23   -### 2. ES Mapping 检查
24   -
25   -**字段定义存在:**
26   -```json
27   -{
28   - "embedding_pic_h14": {
29   - "type": "nested",
30   - "properties": {
31   - "url": {
32   - "type": "text"
33   - },
34   - "vector": {
35   - "type": "dense_vector",
36   - "dims": 1024,
37   - "index": true,
38   - "similarity": "dot_product"
39   - }
40   - }
41   - }
42   -}
43   -```
44   -
45   -### 3. 脚本执行情况
46   -
47   -从日志 `logs/debug/i2i_content_similar_20251022_015349.log` 可以看到:
48   -
49   -- **活跃商品数:** 172,049 个
50   -- **名称向量索引产出:** 127,511 个商品
51   -- **图片向量索引产出:** 0 个商品
52   -
53   -脚本正常运行,但因为ES中没有图片向量数据,所以在代码的以下位置被跳过:
54   -
55   -```python
56   -# i2i_content_similar.py 第183-192行
57   -elif vector_field == 'embedding_pic_h14':
58   - pic_data = item_data.get('embedding_pic_h14')
59   - if pic_data and isinstance(pic_data, list) and len(pic_data) > 0:
60   - query_vector = pic_data[0].get('vector') if isinstance(pic_data[0], dict) else None
61   - else:
62   - query_vector = None
63   -
64   -if not query_vector:
65   - continue # 跳过没有向量的商品
66   -```
67   -
68   -## 🎯 结论
69   -
70   -**核心原因:** Elasticsearch索引中没有任何商品的图片向量(`embedding_pic_h14`)数据。
71   -
72   -这不是代码问题,而是**数据缺失问题**。图片向量数据尚未生成或导入到ES中。
73   -
74   -## 💡 解决方案
75   -
76   -### 方案1:生成图片向量数据(推荐)
77   -
78   -需要开发或运行图片向量生成流程:
79   -
80   -1. **采集商品图片**
81   - - 从商品数据库获取图片URL
82   - - 下载或访问图片资源
83   -
84   -2. **生成图片向量**
85   - - 使用图像embedding模型(如CLIP H/14)
86   - - 将图片转换为1024维向量
87   -
88   -3. **导入ES**
89   - - 更新商品文档,添加 `embedding_pic_h14` 字段
90   - - 格式:`[{"url": "图片URL", "vector": [1024维向量]}]`
91   -
92   -### 方案2:暂时禁用图片向量索引
93   -
94   -如果短期内无法生成图片向量,可以:
95   -
96   -**修改 `i2i_content_similar.py`:**
97   -
98   -```python
99   -# 第280-286行,注释掉图片向量索引生成
100   -# log_processing_step(logger, "生成基于图片向量的相似索引")
101   -# pic_result = generate_similarity_index(
102   -# es, active_items, 'embedding_pic_h14', 'pic', logger
103   -# )
104   -# pic_output = os.path.join(OUTPUT_DIR, f'i2i_content_pic_{date_str}.txt')
105   -# save_index_file(pic_result, es, pic_output, logger)
106   -
107   -logger.info("⚠️ 跳过图片向量索引生成(ES中无图片向量数据)")
108   -```
109   -
110   -**修改 `load_index_to_redis.py`:**
111   -
112   -```python
113   -# 第87行,从加载列表中移除 content_pic
114   -i2i_types = ['swing', 'session_w2v', 'deepwalk', 'content_name'] # 移除 'content_pic'
115   -```
116   -
117   -### 方案3:检查是否有其他图片向量字段
118   -
119   -如果图片向量使用了其他字段名,需要:
120   -
121   -1. 检查ES mapping中是否有其他图片相关的向量字段
122   -2. 更新脚本中的字段名配置
123   -
124   -## 📊 当前数据统计
125   -
126   -| 向量类型 | ES中有数据的商品数 | 索引产出数 | 状态 |
127   -|---------|------------------|-----------|------|
128   -| 名称向量 (embedding_name_zh) | ~172,000 | 127,511 | ✅ 正常 |
129   -| 图片向量 (embedding_pic_h14) | 0 | 0 | ❌ 无数据 |
130   -
131   -## 🔄 后续建议
132   -
133   -1. **确认业务需求:** 是否真的需要基于图片的相似推荐?
134   -2. **评估优先级:** 图片向量生成的成本和收益
135   -3. **制定计划:** 如果需要,制定图片向量生成的技术方案和时间表
136   -4. **更新文档:** 在相关文档中说明 `i2i_content_pic` 的状态
137   -
138   -## ⚙️ 检查脚本
139   -
140   -可以使用以下脚本快速检查ES中的向量数据情况:
141   -
142   -```bash
143   -#!/bin/bash
144   -echo "=== ES向量数据检查 ==="
145   -echo ""
146   -echo "1. 名称向量 (embedding_name_zh):"
147   -curl -s -u "essa:4hOaLaf41y2VuI8y" "http://localhost:9200/spu/_count" \
148   - -H 'Content-Type: application/json' \
149   - -d '{"query": {"exists": {"field": "embedding_name_zh"}}}' | python3 -m json.tool
150   -
151   -echo ""
152   -echo "2. 图片向量 (embedding_pic_h14):"
153   -curl -s -u "essa:4hOaLaf41y2VuI8y" "http://localhost:9200/spu/_count" \
154   - -H 'Content-Type: application/json' \
155   - -d '{"query": {"exists": {"field": "embedding_pic_h14"}}}' | python3 -m json.tool
156   -
157   -echo ""
158   -echo "3. 总商品数:"
159   -curl -s -u "essa:4hOaLaf41y2VuI8y" "http://localhost:9200/spu/_count" | python3 -m json.tool
160   -```
161   -
162   -保存为 `check_es_vectors.sh` 并执行:
163   -```bash
164   -chmod +x check_es_vectors.sh
165   -./check_es_vectors.sh
166   -```
167   -