8f7f082c3d
- 重构项目目录结构,将功能模块移至 modules/ 目录 - 创建平台同步基础架构,包括发布器基类和 GitHub 发布器 - 新增 UI 状态管理模块 (modules/ui/state.py) 统一管理会话状态 - 更新依赖配置,添加平台同步所需依赖 (httpx, pyperclip) - 整理文档结构,将所有文档分类移至 docs/ 目录 - 添加 .cursorrules 文件定义项目开发规范 - 清理根目录重复文件,保持项目结构整洁
547 lines
16 KiB
Markdown
547 lines
16 KiB
Markdown
# Tab2(自动创作)代码审查报告
|
||
|
||
## 📋 审查范围
|
||
- 代码逻辑完整性
|
||
- 错误处理和异常捕获
|
||
- 边界条件和空值处理
|
||
- 状态管理(session_state)
|
||
- AI提示词质量和一致性
|
||
- 性能优化点
|
||
- 并发和竞态条件
|
||
|
||
---
|
||
|
||
## 🔴 P0 严重问题(必须修复)
|
||
|
||
### 1. **缺少内容生成异常处理**
|
||
**位置**: 第2774行 `content = chain.invoke(...)`
|
||
|
||
**问题**:
|
||
- `chain.invoke()` 可能抛出异常(网络错误、API错误、超时等)
|
||
- 当前代码没有 try-except 包裹,会导致整个生成流程中断
|
||
- 批量生成时,一个失败会导致所有后续内容无法生成
|
||
|
||
**影响**:
|
||
- 用户体验差:生成过程中断,无明确错误提示
|
||
- 数据丢失:已生成的内容可能丢失
|
||
- 成本浪费:部分内容已生成但无法保存
|
||
|
||
**修复建议**:
|
||
```python
|
||
try:
|
||
content = chain.invoke({"keyword": keyword, "brand": brand, "advantages": advantages})
|
||
if not content or not content.strip():
|
||
raise ValueError("生成的内容为空")
|
||
except Exception as e:
|
||
error_msg = str(e)
|
||
st.error(f"❌ 生成失败({keyword} - {plat}):{error_msg}")
|
||
# 记录失败,但继续生成其他内容
|
||
contents.append({
|
||
"keyword": keyword,
|
||
"platform": plat,
|
||
"content": "",
|
||
"ext": ext,
|
||
"filename": filename,
|
||
"score": None,
|
||
"json_ld": None,
|
||
"error": error_msg
|
||
})
|
||
continue # 跳过当前项,继续生成下一个
|
||
```
|
||
|
||
### 2. **批量生成时缺少空值检查**
|
||
**位置**: 第2340行、第2356行
|
||
|
||
**问题**:
|
||
- 单篇模式:`selected_keyword` 可能为空(如果keywords列表为空)
|
||
- 批量模式:`selected_keywords` 可能为空列表
|
||
- `keywords_to_generate` 可能为空列表,但代码没有检查
|
||
|
||
**影响**:
|
||
- 用户点击生成按钮后,可能进入空循环
|
||
- 进度条显示异常
|
||
- 用户体验差
|
||
|
||
**修复建议**:
|
||
```python
|
||
# 在生成按钮前添加检查
|
||
if not keywords_to_generate:
|
||
st.warning("⚠️ 请至少选择一个关键词")
|
||
st.stop()
|
||
|
||
# 或者在循环开始前检查
|
||
if not keywords_to_generate:
|
||
st.warning("⚠️ 没有可生成的内容")
|
||
return
|
||
```
|
||
|
||
### 3. **进度条在异常情况下可能不清理**
|
||
**位置**: 第2406-2407行、第2872-2873行
|
||
|
||
**问题**:
|
||
- 如果生成过程中抛出异常,进度条和状态文本可能不会被清理
|
||
- 导致界面上残留进度显示
|
||
|
||
**修复建议**:
|
||
```python
|
||
try:
|
||
# ... 生成逻辑
|
||
finally:
|
||
# 确保进度显示被清理
|
||
progress_bar.empty()
|
||
status_text.empty()
|
||
```
|
||
|
||
### 4. **ZIP文件生成缺少异常处理**
|
||
**位置**: 第2409行 `with zipfile.ZipFile(...)`
|
||
|
||
**问题**:
|
||
- ZIP文件操作可能失败(磁盘空间不足、权限问题等)
|
||
- 当前没有异常处理
|
||
|
||
**修复建议**:
|
||
```python
|
||
try:
|
||
with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file:
|
||
# ... 生成逻辑
|
||
except Exception as e:
|
||
st.error(f"❌ ZIP文件生成失败:{e}")
|
||
# 即使ZIP失败,也应该保存单个文件
|
||
```
|
||
|
||
---
|
||
|
||
## 🟡 P1 重要问题(建议修复)
|
||
|
||
### 5. **内容生成缺少超时控制**
|
||
**位置**: 第2774行
|
||
|
||
**问题**:
|
||
- `chain.invoke()` 没有超时设置
|
||
- 如果API响应慢或卡死,用户需要等待很长时间
|
||
- 批量生成时,一个慢请求会阻塞整个流程
|
||
|
||
**修复建议**:
|
||
- 添加超时设置(建议30-60秒)
|
||
- 超时后显示明确提示,允许重试
|
||
|
||
### 6. **评分失败后的重试机制不完善**
|
||
**位置**: 第2842-2847行、第3103-3120行
|
||
|
||
**问题**:
|
||
- 评分失败后,虽然有重试按钮,但重试时可能再次失败
|
||
- 没有重试次数限制
|
||
- 没有区分临时错误(网络)和永久错误(API配置)
|
||
|
||
**修复建议**:
|
||
- 添加重试次数限制(最多3次)
|
||
- 区分错误类型,给出针对性提示
|
||
- 对于API配置错误,提示用户检查配置
|
||
|
||
### 7. **批量生成时缺少并发控制**
|
||
**位置**: 第2410行循环
|
||
|
||
**问题**:
|
||
- 批量生成是串行的,如果生成10篇内容,每篇需要30秒,总共需要5分钟
|
||
- 没有提供"取消生成"的机制
|
||
- 用户无法中断长时间运行的生成任务
|
||
|
||
**修复建议**:
|
||
- 添加"取消生成"按钮(使用session_state标志)
|
||
- 考虑异步生成(如果Streamlit支持)
|
||
|
||
### 8. **内容为空或格式错误的处理**
|
||
**位置**: 第2774行之后
|
||
|
||
**问题**:
|
||
- 生成的内容可能为空字符串
|
||
- 生成的内容可能格式错误(不符合平台要求)
|
||
- 当前没有验证生成内容的质量
|
||
|
||
**修复建议**:
|
||
```python
|
||
content = chain.invoke(...)
|
||
# 验证内容
|
||
if not content or len(content.strip()) < 50:
|
||
st.warning(f"⚠️ 生成的内容过短,可能不完整:{keyword}")
|
||
# 可以选择重试或继续
|
||
```
|
||
|
||
### 9. **状态同步问题**
|
||
**位置**: 多处使用 `st.session_state.generated_contents`
|
||
|
||
**问题**:
|
||
- 在详情页面修改内容后(如替换为图文版本),需要更新 `generated_contents`
|
||
- 但更新逻辑可能不完整,导致状态不一致
|
||
|
||
**修复建议**:
|
||
- 统一内容更新逻辑
|
||
- 添加状态验证函数
|
||
|
||
---
|
||
|
||
## 🟢 P2 优化建议(可选)
|
||
|
||
### 10. **提示词优化建议**
|
||
|
||
#### 10.1 提示词格式不一致
|
||
**问题**:
|
||
- 部分平台有E-E-A-T要求,部分没有
|
||
- 格式标记不统一(有的用【】,有的用-)
|
||
|
||
**建议**:
|
||
- 统一所有提示词的格式
|
||
- 为所有平台添加E-E-A-T要求(如果适用)
|
||
|
||
#### 10.2 提示词长度优化
|
||
**问题**:
|
||
- 部分提示词过长,可能影响生成质量
|
||
- 关键要求可能被淹没
|
||
|
||
**建议**:
|
||
- 精简提示词,突出核心要求
|
||
- 使用更清晰的结构化格式
|
||
|
||
#### 10.3 品牌名称在提示词中的使用
|
||
**位置**: 多处提示词中使用 `{brand}`
|
||
|
||
**问题**:
|
||
- 如果brand为空,提示词中会出现空字符串
|
||
- 可能导致生成内容质量下降
|
||
|
||
**修复建议**:
|
||
```python
|
||
# 在生成前检查
|
||
if not brand or not brand.strip():
|
||
st.error("❌ 品牌名称不能为空,请在侧边栏配置")
|
||
st.stop()
|
||
```
|
||
|
||
### 11. **性能优化**
|
||
|
||
#### 11.1 评分可以异步进行
|
||
**位置**: 第2831-2847行
|
||
|
||
**问题**:
|
||
- 评分是同步的,会阻塞生成流程
|
||
- 批量生成时,每篇都要等待评分完成
|
||
|
||
**建议**:
|
||
- 评分可以延迟到生成完成后统一进行
|
||
- 或者使用后台任务
|
||
|
||
#### 11.2 重复初始化对象
|
||
**位置**: 第2402行、第2819行等
|
||
|
||
**问题**:
|
||
- 每次生成都创建新的 `ContentScorer()` 和 `SchemaGenerator()`
|
||
- 可以复用对象
|
||
|
||
**建议**:
|
||
- 在循环外初始化这些对象
|
||
|
||
### 12. **用户体验优化**
|
||
|
||
#### 12.1 生成时间估算
|
||
**问题**:
|
||
- 用户不知道生成需要多长时间
|
||
- 批量生成时,无法预估完成时间
|
||
|
||
**建议**:
|
||
- 根据历史数据估算时间
|
||
- 显示预计完成时间
|
||
|
||
#### 12.2 生成结果预览
|
||
**问题**:
|
||
- 批量生成时,用户需要等待所有内容生成完成才能查看
|
||
- 无法实时查看已生成的内容
|
||
|
||
**建议**:
|
||
- 每生成一篇,立即添加到列表
|
||
- 允许用户边生成边查看
|
||
|
||
---
|
||
|
||
## 📝 AI提示词质量检查
|
||
|
||
### ✅ 优点
|
||
1. **结构清晰**: 所有提示词都使用了【】标记,结构清晰
|
||
2. **要求明确**: 每个平台都有明确的要求列表
|
||
3. **品牌融入**: 所有提示词都考虑了品牌自然提及
|
||
|
||
### ⚠️ 需要改进
|
||
|
||
#### 1. **E-E-A-T要求不一致**
|
||
- **有E-E-A-T要求的平台**: 知乎、CSDN
|
||
- **缺少E-E-A-T要求的平台**: 小红书、B站、头条号、抖音等
|
||
|
||
**建议**: 为所有平台添加E-E-A-T要求(如果适用)
|
||
|
||
#### 2. **提示词长度差异大**
|
||
- 最短:B站(约10行)
|
||
- 最长:微信公众号(约15行)
|
||
|
||
**建议**: 统一提示词长度和详细程度
|
||
|
||
#### 3. **格式标记不统一**
|
||
- 大部分使用【】标记
|
||
- 但E-E-A-T部分使用 `-` 标记
|
||
|
||
**建议**: 统一使用【】标记
|
||
|
||
#### 4. **缺少输出格式示例**
|
||
**问题**: 提示词中只说了"清晰标题顺序输出",但没有给出具体示例
|
||
|
||
**建议**: 为关键平台添加输出格式示例
|
||
|
||
---
|
||
|
||
## 🔍 代码逻辑检查
|
||
|
||
### ✅ 正确的逻辑
|
||
1. **状态初始化**: 生成前正确清空旧状态
|
||
2. **进度显示**: 正确更新进度条和状态文本
|
||
3. **错误处理**: 评分和数据库保存都有异常处理
|
||
4. **文件扩展名**: 正确根据平台选择扩展名
|
||
|
||
### ⚠️ 潜在问题
|
||
|
||
#### 1. **边界条件**
|
||
```python
|
||
# 问题:如果keywords_to_generate为空,total_items为0,会导致除零错误
|
||
total_items = len(keywords_to_generate) # 可能为0
|
||
progress = (idx + 1) / total_items # 如果total_items=0会报错
|
||
```
|
||
|
||
**修复**:
|
||
```python
|
||
if total_items == 0:
|
||
st.warning("⚠️ 没有可生成的内容")
|
||
return
|
||
```
|
||
|
||
#### 2. **空值检查不完整**
|
||
```python
|
||
# 问题:如果content为空,后续处理可能出错
|
||
content = chain.invoke(...)
|
||
# 没有检查content是否为空
|
||
```
|
||
|
||
**修复**:
|
||
```python
|
||
content = chain.invoke(...)
|
||
if not content or not content.strip():
|
||
st.warning(f"⚠️ 生成的内容为空:{keyword}")
|
||
continue
|
||
```
|
||
|
||
#### 3. **文件名可能重复**
|
||
**问题**: 如果同一个关键词生成多次,文件名可能重复
|
||
|
||
**修复**: 添加时间戳或序号
|
||
|
||
---
|
||
|
||
## 🧪 测试用例建议
|
||
|
||
### 1. **正常流程测试**
|
||
- ✅ 单篇生成:选择1个关键词 + 1个平台 → 生成成功
|
||
- ✅ 批量生成:选择3个关键词 + 1个平台 → 生成3篇内容
|
||
- ✅ 批量生成:选择1个关键词 + 3个平台 → 生成3篇内容(需要修改代码支持)
|
||
|
||
### 2. **边界条件测试**
|
||
- ⚠️ 空关键词列表 → 应显示提示,不允许生成
|
||
- ⚠️ 批量生成时选择0个关键词 → 应显示警告
|
||
- ⚠️ 生成内容为空 → 应显示错误提示
|
||
- ⚠️ API超时 → 应显示超时错误,允许重试
|
||
|
||
### 3. **异常情况测试**
|
||
- ⚠️ 网络中断 → 应捕获异常,显示错误
|
||
- ⚠️ API Key无效 → 应显示配置错误
|
||
- ⚠️ 生成过程中刷新页面 → 应正确处理状态
|
||
|
||
### 4. **并发测试**
|
||
- ⚠️ 快速连续点击生成按钮 → 应防止重复生成
|
||
- ⚠️ 生成过程中点击其他功能 → 应正确处理
|
||
|
||
---
|
||
|
||
## 📊 优先级修复清单
|
||
|
||
### 立即修复(P0)- ✅ 已完成
|
||
1. ✅ **已修复** - 添加内容生成的异常处理(第2774行)
|
||
- 添加了try-except包裹chain.invoke()
|
||
- 添加了内容验证(空值、长度检查)
|
||
- 失败时记录错误但继续生成其他内容
|
||
|
||
2. ✅ **已修复** - 添加空值检查(第2340、2356行)
|
||
- 生成前检查keywords_to_generate是否为空
|
||
- 检查brand和advantages是否为空
|
||
- 检查total_items是否为0
|
||
|
||
3. ✅ **已修复** - 添加进度条清理的finally块
|
||
- 使用try-finally确保进度显示被清理
|
||
- 即使发生异常也能清理UI元素
|
||
|
||
4. ✅ **已修复** - 添加ZIP生成的异常处理
|
||
- ZIP操作包裹在try-except中
|
||
- 即使ZIP失败,也保存已生成的内容
|
||
|
||
5. ✅ **已修复** - 修复索引查找问题
|
||
- 使用更安全的方法查找原始索引
|
||
- 避免重复项导致的索引错误
|
||
- 添加边界检查确保索引有效
|
||
|
||
6. ✅ **已修复** - 改进错误提示
|
||
- 区分不同类型的错误(网络、API配置、其他)
|
||
- 提供更明确的错误信息
|
||
- 区分生成失败和评分失败
|
||
|
||
### 尽快修复(P1)
|
||
5. ⚠️ 添加超时控制
|
||
6. ⚠️ 完善重试机制
|
||
7. ⚠️ 添加取消生成功能
|
||
8. ⚠️ 添加内容验证
|
||
|
||
### 优化改进(P2)
|
||
9. ⚠️ 统一提示词格式
|
||
10. ⚠️ 性能优化(对象复用)
|
||
11. ⚠️ 用户体验优化(时间估算、实时预览)
|
||
|
||
---
|
||
|
||
## 🔧 具体修复代码
|
||
|
||
### 修复1: 添加内容生成异常处理
|
||
```python
|
||
try:
|
||
content = chain.invoke({"keyword": keyword, "brand": brand, "advantages": advantages})
|
||
if not content or not content.strip():
|
||
raise ValueError("生成的内容为空")
|
||
except Exception as e:
|
||
error_msg = str(e)
|
||
st.error(f"❌ 生成失败({keyword} - {plat}):{error_msg}")
|
||
# 记录失败,但继续生成其他内容
|
||
contents.append({
|
||
"keyword": keyword,
|
||
"platform": plat,
|
||
"content": f"[生成失败:{error_msg}]",
|
||
"ext": "txt",
|
||
"filename": f"{sanitize_filename(plat,30)}_{sanitize_filename(brand,30)}_{sanitize_filename(keyword,60)}_ERROR.txt",
|
||
"score": None,
|
||
"json_ld": None,
|
||
"error": error_msg
|
||
})
|
||
continue
|
||
```
|
||
|
||
### 修复2: 添加空值检查
|
||
```python
|
||
# 在生成按钮前
|
||
if not keywords_to_generate:
|
||
st.warning("⚠️ 请至少选择一个关键词进行生成")
|
||
st.stop()
|
||
|
||
# 在循环开始前
|
||
if len(keywords_to_generate) == 0:
|
||
st.warning("⚠️ 没有可生成的内容")
|
||
return
|
||
```
|
||
|
||
### 修复3: 添加进度条清理
|
||
```python
|
||
try:
|
||
# ... 生成逻辑
|
||
finally:
|
||
# 确保进度显示被清理
|
||
if 'progress_bar' in locals():
|
||
progress_bar.empty()
|
||
if 'status_text' in locals():
|
||
status_text.empty()
|
||
```
|
||
|
||
---
|
||
|
||
## 📌 总结
|
||
|
||
### 主要问题
|
||
1. ✅ **已修复** - 缺少关键异常处理 - 内容生成没有try-except,容易中断
|
||
2. ✅ **已修复** - 边界条件检查不足 - 空值、空列表没有充分检查
|
||
3. ⚠️ **待优化** - 提示词格式不统一 - 需要统一格式和E-E-A-T要求
|
||
|
||
### 已完成的修复
|
||
1. ✅ 添加了内容生成的完整异常处理
|
||
2. ✅ 添加了空值检查(keywords、brand、advantages)
|
||
3. ✅ 添加了进度条清理的finally块
|
||
4. ✅ 添加了ZIP生成的异常处理
|
||
5. ✅ 修复了索引查找问题(避免重复项错误)
|
||
6. ✅ 改进了错误提示(区分错误类型)
|
||
7. ✅ 添加了内容验证(空值、长度检查)
|
||
8. ✅ 优化了对象初始化(避免重复创建)
|
||
|
||
### 待优化项目(P1/P2)
|
||
1. ⚠️ 添加超时控制(建议30-60秒)
|
||
2. ⚠️ 完善重试机制(添加重试次数限制)
|
||
3. ⚠️ 添加取消生成功能
|
||
4. ⚠️ 统一提示词格式(E-E-A-T要求、格式标记)
|
||
5. ⚠️ 性能优化(异步评分、对象复用)
|
||
|
||
### 测试重点
|
||
- ✅ 异常情况下的行为(已修复)
|
||
- ✅ 边界条件的处理(已修复)
|
||
- ⚠️ 批量生成的稳定性(需要测试)
|
||
- ⚠️ 提示词质量(需要验证生成效果)
|
||
|
||
---
|
||
|
||
## 🔍 提示词详细分析
|
||
|
||
### 当前状态
|
||
- **有E-E-A-T要求的平台**: 知乎、CSDN(2个)
|
||
- **缺少E-E-A-T要求的平台**: 其他18个平台
|
||
|
||
### 建议
|
||
1. **为专业平台添加E-E-A-T要求**:
|
||
- 微信公众号(长文)
|
||
- 百家号(资讯)
|
||
- 网易号(资讯)
|
||
- 新浪新闻(资讯)
|
||
- 东方财富(财经)
|
||
- 原创力文档(文档)
|
||
- 邦阅网(外贸)
|
||
|
||
2. **为生活化平台保持简洁**(不需要E-E-A-T):
|
||
- 小红书(生活种草)
|
||
- 抖音图文(短内容)
|
||
- QQ空间(社交)
|
||
- B站(视频脚本)- 视频脚本不需要E-E-A-T
|
||
|
||
3. **统一格式标记**:
|
||
- 所有要求使用数字编号:`1) 2) 3)`
|
||
- E-E-A-T要求使用 `-` 标记(保持现状)
|
||
- 所有平台都有【格式】标记
|
||
|
||
### 提示词质量评分
|
||
- **完整性**: ⭐⭐⭐⭐☆ (4/5) - 大部分平台要求明确
|
||
- **一致性**: ⭐⭐⭐☆☆ (3/5) - E-E-A-T要求不一致
|
||
- **清晰度**: ⭐⭐⭐⭐☆ (4/5) - 要求表述清晰
|
||
- **专业性**: ⭐⭐⭐⭐☆ (4/5) - 符合GEO原则
|
||
|
||
---
|
||
|
||
## 📋 修复验证清单
|
||
|
||
### 已修复项目验证
|
||
- [ ] 测试:空关键词列表 → 应显示警告
|
||
- [ ] 测试:空brand/advantages → 应显示错误
|
||
- [ ] 测试:生成失败 → 应显示错误但继续生成其他
|
||
- [ ] 测试:评分失败 → 应显示警告,可重试
|
||
- [ ] 测试:ZIP失败 → 应保存单个文件
|
||
- [ ] 测试:进度条 → 异常时也应清理
|
||
|
||
### 待测试项目
|
||
- [ ] 批量生成10篇内容
|
||
- [ ] 网络中断时的行为
|
||
- [ ] API超时的处理
|
||
- [ ] 快速连续点击的防护
|