8f7f082c3d
- 重构项目目录结构,将功能模块移至 modules/ 目录 - 创建平台同步基础架构,包括发布器基类和 GitHub 发布器 - 新增 UI 状态管理模块 (modules/ui/state.py) 统一管理会话状态 - 更新依赖配置,添加平台同步所需依赖 (httpx, pyperclip) - 整理文档结构,将所有文档分类移至 docs/ 目录 - 添加 .cursorrules 文件定义项目开发规范 - 清理根目录重复文件,保持项目结构整洁
16 KiB
16 KiB
Tab2(自动创作)代码审查报告
📋 审查范围
- 代码逻辑完整性
- 错误处理和异常捕获
- 边界条件和空值处理
- 状态管理(session_state)
- AI提示词质量和一致性
- 性能优化点
- 并发和竞态条件
🔴 P0 严重问题(必须修复)
1. 缺少内容生成异常处理
位置: 第2774行 content = chain.invoke(...)
问题:
chain.invoke()可能抛出异常(网络错误、API错误、超时等)- 当前代码没有 try-except 包裹,会导致整个生成流程中断
- 批量生成时,一个失败会导致所有后续内容无法生成
影响:
- 用户体验差:生成过程中断,无明确错误提示
- 数据丢失:已生成的内容可能丢失
- 成本浪费:部分内容已生成但无法保存
修复建议:
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可能为空列表,但代码没有检查
影响:
- 用户点击生成按钮后,可能进入空循环
- 进度条显示异常
- 用户体验差
修复建议:
# 在生成按钮前添加检查
if not keywords_to_generate:
st.warning("⚠️ 请至少选择一个关键词")
st.stop()
# 或者在循环开始前检查
if not keywords_to_generate:
st.warning("⚠️ 没有可生成的内容")
return
3. 进度条在异常情况下可能不清理
位置: 第2406-2407行、第2872-2873行
问题:
- 如果生成过程中抛出异常,进度条和状态文本可能不会被清理
- 导致界面上残留进度显示
修复建议:
try:
# ... 生成逻辑
finally:
# 确保进度显示被清理
progress_bar.empty()
status_text.empty()
4. ZIP文件生成缺少异常处理
位置: 第2409行 with zipfile.ZipFile(...)
问题:
- ZIP文件操作可能失败(磁盘空间不足、权限问题等)
- 当前没有异常处理
修复建议:
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行之后
问题:
- 生成的内容可能为空字符串
- 生成的内容可能格式错误(不符合平台要求)
- 当前没有验证生成内容的质量
修复建议:
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为空,提示词中会出现空字符串
- 可能导致生成内容质量下降
修复建议:
# 在生成前检查
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. 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. 边界条件
# 问题:如果keywords_to_generate为空,total_items为0,会导致除零错误
total_items = len(keywords_to_generate) # 可能为0
progress = (idx + 1) / total_items # 如果total_items=0会报错
修复:
if total_items == 0:
st.warning("⚠️ 没有可生成的内容")
return
2. 空值检查不完整
# 问题:如果content为空,后续处理可能出错
content = chain.invoke(...)
# 没有检查content是否为空
修复:
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)- ✅ 已完成
-
✅ 已修复 - 添加内容生成的异常处理(第2774行)
- 添加了try-except包裹chain.invoke()
- 添加了内容验证(空值、长度检查)
- 失败时记录错误但继续生成其他内容
-
✅ 已修复 - 添加空值检查(第2340、2356行)
- 生成前检查keywords_to_generate是否为空
- 检查brand和advantages是否为空
- 检查total_items是否为0
-
✅ 已修复 - 添加进度条清理的finally块
- 使用try-finally确保进度显示被清理
- 即使发生异常也能清理UI元素
-
✅ 已修复 - 添加ZIP生成的异常处理
- ZIP操作包裹在try-except中
- 即使ZIP失败,也保存已生成的内容
-
✅ 已修复 - 修复索引查找问题
- 使用更安全的方法查找原始索引
- 避免重复项导致的索引错误
- 添加边界检查确保索引有效
-
✅ 已修复 - 改进错误提示
- 区分不同类型的错误(网络、API配置、其他)
- 提供更明确的错误信息
- 区分生成失败和评分失败
尽快修复(P1)
- ⚠️ 添加超时控制
- ⚠️ 完善重试机制
- ⚠️ 添加取消生成功能
- ⚠️ 添加内容验证
优化改进(P2)
- ⚠️ 统一提示词格式
- ⚠️ 性能优化(对象复用)
- ⚠️ 用户体验优化(时间估算、实时预览)
🔧 具体修复代码
修复1: 添加内容生成异常处理
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: 添加空值检查
# 在生成按钮前
if not keywords_to_generate:
st.warning("⚠️ 请至少选择一个关键词进行生成")
st.stop()
# 在循环开始前
if len(keywords_to_generate) == 0:
st.warning("⚠️ 没有可生成的内容")
return
修复3: 添加进度条清理
try:
# ... 生成逻辑
finally:
# 确保进度显示被清理
if 'progress_bar' in locals():
progress_bar.empty()
if 'status_text' in locals():
status_text.empty()
📌 总结
主要问题
- ✅ 已修复 - 缺少关键异常处理 - 内容生成没有try-except,容易中断
- ✅ 已修复 - 边界条件检查不足 - 空值、空列表没有充分检查
- ⚠️ 待优化 - 提示词格式不统一 - 需要统一格式和E-E-A-T要求
已完成的修复
- ✅ 添加了内容生成的完整异常处理
- ✅ 添加了空值检查(keywords、brand、advantages)
- ✅ 添加了进度条清理的finally块
- ✅ 添加了ZIP生成的异常处理
- ✅ 修复了索引查找问题(避免重复项错误)
- ✅ 改进了错误提示(区分错误类型)
- ✅ 添加了内容验证(空值、长度检查)
- ✅ 优化了对象初始化(避免重复创建)
待优化项目(P1/P2)
- ⚠️ 添加超时控制(建议30-60秒)
- ⚠️ 完善重试机制(添加重试次数限制)
- ⚠️ 添加取消生成功能
- ⚠️ 统一提示词格式(E-E-A-T要求、格式标记)
- ⚠️ 性能优化(异步评分、对象复用)
测试重点
- ✅ 异常情况下的行为(已修复)
- ✅ 边界条件的处理(已修复)
- ⚠️ 批量生成的稳定性(需要测试)
- ⚠️ 提示词质量(需要验证生成效果)
🔍 提示词详细分析
当前状态
- 有E-E-A-T要求的平台: 知乎、CSDN(2个)
- 缺少E-E-A-T要求的平台: 其他18个平台
建议
-
为专业平台添加E-E-A-T要求:
- 微信公众号(长文)
- 百家号(资讯)
- 网易号(资讯)
- 新浪新闻(资讯)
- 东方财富(财经)
- 原创力文档(文档)
- 邦阅网(外贸)
-
为生活化平台保持简洁(不需要E-E-A-T):
- 小红书(生活种草)
- 抖音图文(短内容)
- QQ空间(社交)
- B站(视频脚本)- 视频脚本不需要E-E-A-T
-
统一格式标记:
- 所有要求使用数字编号:
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超时的处理
- 快速连续点击的防护