UNPKG

article-writer-cn

Version:

AI 驱动的智能写作系统 - 专注公众号/自媒体文章创作

1,439 lines (1,139 loc) 43.9 kB
# ⚠️ PRD-06: 品味驱动的创作工作流 [已废弃] > **废弃原因**: 核心思路存在致命缺陷 - "从AI生成的内容中挑选"无法解决AI的5个致命伤(缺温度、缺个性、缺地域性、缺真实细节、缺思想) > > **替代方案**: [PRD-07: 真实驱动的创作工作流](./prd-07-authentic-writing-workflow.md) > > **关键洞察**: 无论AI生成多少字,本质都是冰冷、套话、假细节。真实的内容只能来自人的亲身经历。 --- ## ⚠️ 请勿参考本文档 本文档已被废弃,请参考 [PRD-07](./prd-07-authentic-writing-workflow.md) **核心问题**: - ❌ 多版本生成 → 无论生成多少版本,都是AI味 - ❌ 片段选择 → 从塑料苹果里挑"最好的",挑出来的还是塑料 - ❌ AI作为素材生成器 → AI生成的"素材"本质就不应该直接使用 **正确方向** (PRD-07): - ✅ AI作为教练/参考书 → 提问、引导、检查 - ✅ 素材来自个人素材库 → 真实经历、即刻动态、个人笔记 - ✅ 人必须自己写 → AI不生成可用内容,只提供思路 --- ## 元信息 (历史记录) - **优先级**: ~~P0~~ → 已废弃 - **预计工作量**: 7 天 - **依赖**: 现有 /write, /review 命令 - **状态**: ❌ 已废弃 (2025-10-27) - **创建日期**: 2025-10-27 - **废弃日期**: 2025-10-27 (创建当天即发现问题) - **灵感来源**: 用户分享的创作工作流文章 --- ## 一、需求背景 ### 1.1 问题识别 通过用户分享的真实创作工作流,我们发现当前系统存在核心定位偏差: **现状问题**1. ❌ AI定位过于激进 - 系统试图让AI"直接生成好文章" 2. ❌ 缺少品味体现 - 用户没有机会展现"选择能力" 3. ❌ 单一版本生成 - 无法对比、无法训练判断力 4. ❌ 缺少品味培养 - 只有技术规则,没有品味训练 5. ❌ 观点不够突出 - 观点应该是第一步,而非隐含在需求中 **核心洞察**> AI可以拉高创作的下限,但也正在摧毁没有品味的人的上限。 > > **品味 = 知道什么是好,它为什么好** > > 品味的建立:看(大量优秀作品)→ 做(笨拙练习)→ 想(分析原因)→ 循环 ### 1.2 用户真实工作流(Gemini 2.5 Pro辅助) ``` 步骤1: 深读原材料,形成核心观点 ↓ (观点是灵魂,AI生成不了) 步骤2: 观点 + 原文 → AI生成 → 5个独立对话框 → 每个生成3-5个版本 → 每个版本5000字 → 总计:15000-25000字 ↓ 步骤3: 通读所有版本(不是扫读) ↓ (这一步体现品味) 步骤4: 从几万字中挑选几百字 → 标准:无事实错误 + 符合气质 + 节奏好 ↓ (选择能力 = 品味) 步骤5: 塞进自己的2000-3500字框架 ↓ 最终:AI辅助占15%-40%,核心是人的观点和选择 ``` **关键比例**- 生成量:15000-25000字 - 使用量:几百字 - 比例:约 2%-5% - **结论**:AI是"素材库",不是"文章生成器" ### 1.3 对系统的启示 **重新定义系统目标**- ❌ 不是"让AI写出好文章" - ✅ 而是"帮用户建立和强化品味,用AI放大品味" **核心价值链**``` 品味(人)→ 观点(人)→ 素材(AI)→ 选择(人+品味)→ 整合(人) ↑_______________品味培养反馈_______________↑ ``` --- ## 二、用户故事 ### 2.1 核心用户画像 **小李 - 公众号作者(有一定基础)** - 写了100篇文章,有一定品味基础 - 知道什么样的开头能抓人 - 能判断哪些句子"油腻"、哪些"真实" - **需求**:用AI提高效率,但保持内容质量 **小王 - 新手创作者(品味薄弱)** - 刚开始写作,不知道什么是"好" - 容易被AI生成的"看起来挺好"的内容迷惑 - **需求**:在用AI的过程中,逐步建立品味 ### 2.2 用户故事 #### 故事1:生成多版本素材 **场景**:小李准备写一篇关于Claude Code的文章 ``` 小李: /specify "写Claude Code评测,3000字" 系统: ✅ Brief已保存 小李: /extract-viewpoint 系统: 请提供你的核心观点,这将是文章的灵魂: 小李: "Claude Code的核心优势是上下文理解,比Cursor准确30%" 系统: ✅ 观点已记录 小李: /generate-materials --versions 5 --words 5000 系统: 🎲 正在生成5个不同风格的版本... 版本1(严谨风格): 5000字 ✅ 版本2(故事风格): 5000字 ✅ 版本3(数据风格): 5000字 ✅ 版本4(案例风格): 5000字 ✅ 版本5(对比风格): 5000字 ✅ 总计生成: 25000字素材 保存路径: materials/generated/001-claude-code/ 💡 下一步: /select-fragments 从素材中挑选优质片段 ``` #### 故事2:选择优质片段(品味体现) ``` 小李: /select-fragments 系统: 📖 正在展示5个版本的内容... [版本1 - 第3段] "Claude Code通过深度学习算法,实现了对代码上下文的 精准理解,相比传统工具,其准确率提升了显著的幅度..." 🤔 你的判断: 1. 标记为优质 (g) 2. 标记为可用 (o) 3. 标记为不用 (b) 4. 跳过 (s) 5. 退出选择 (q) 小李: b (判断:太书面、"显著的幅度"很AI) 系统: ✅ 已标记为不用 [版本2 - 第1段] "用了两周Claude Code,说实话,比Cursor好用不少。 最明显的是代码补全,Cursor经常补错,Claude Code准确率高很多。" 小李: g (判断:真实、具体、有对比) 系统: ✅ 已标记为优质,添加到收藏夹 ...(继续筛选)... 系统: 📊 选择统计: - 总片段: 247个 - 优质: 12个(约500字) - 可用: 23个(约800字) - 不用: 212个 💾 已保存到: materials/selected/001-claude-code.md 💡 下一步: /assemble 组装成文章 ``` #### 故事3:品味培养反馈 ``` 小李: /taste-report 系统: 📈 您的品味分析报告 选择统计(最近10篇): - 优质片段命中率: 85% ✅(AI检测<30%的比例) - 拒绝AI套话: 92% ✅ - 真实细节识别: 78% ⚠️(可以提升) 品味特征: ✅ 擅长识别: 书面词汇、AI套话 ⚠️ 需提升: 真实细节识别、节奏感把控 对比优秀作者: - 大师兄朱炫: 风格锤炼 ⭐⭐⭐⭐⭐ - 您的水平: 风格锤炼 ⭐⭐⭐☆☆(进步中) 💡 训练建议: 1. 多读优秀案例(推荐5篇) 2. 对比你的选择和优秀作者的选择 3. 完成3个"品味挑战" ``` --- ## 三、功能需求 ### 3.1 观点提炼命令(新增) #### `/extract-viewpoint` - 提炼核心观点 **功能描述**: 在生成内容前,强制用户提炼核心观点 **执行逻辑**1. 读取 brief 2. 询问用户核心观点 3. 保存到 `articles/*/viewpoint.md` 4. 后续 AI 生成围绕观点展开 **验收标准**- [ ] 必须有观点才能进行 `/generate-materials` - [ ] 观点保存在独立文件 - [ ] 生成时 AI 会多次引用观点 --- ### 3.2 多版本生成(核心改进) #### `/generate-materials` - 生成多版本素材 **取代**: 原 `/write` 命令 **参数**```bash /generate-materials [选项] 选项: --versions <数量> 生成版本数(默认:3,推荐:5) --words <字数> 每版本字数(默认:5000) --styles <风格列表> 指定风格(逗号分隔) --parallel 并行生成(更快,但消耗更多token) ``` **风格类型**- `rigorous` - 严谨风格(学术、数据导向) - `story` - 故事风格(案例、经历) - `data` - 数据风格(图表、对比) - `casual` - 轻松风格(口语化、幽默) - `debate` - 辩论风格(正反对比) **输出结构**``` materials/generated/001-claude-code/ ├── version-1-rigorous.md (5000字) ├── version-2-story.md (5000字) ├── version-3-data.md (5000字) ├── version-4-casual.md (5000字) ├── version-5-debate.md (5000字) ├── metadata.json (元信息) └── index.md (索引) ``` **metadata.json 示例**```json { "article_id": "001-claude-code", "viewpoint": "Claude Code的核心优势是上下文理解,比Cursor准确30%", "brief": "_briefs/001-claude-code-brief.md", "total_words": 25000, "versions": [ { "id": "version-1", "style": "rigorous", "words": 5000, "generated_at": "2025-10-27T10:00:00Z", "model": "gemini-2.0-flash-exp" }, ... ] } ``` **验收标准**- [ ] 可生成 3-5 个版本 - [ ] 每个版本风格明显不同 - [ ] 总字数可控(推荐 15000-25000 字) - [ ] 生成时间 < 5 分钟(并行模式) --- ### 3.3 片段选择系统(品味核心) #### `/select-fragments` - 交互式片段选择 **功能描述**: 逐段展示生成的内容,用户标记 优质/可用/不用 **交互流程**``` 1. 读取所有生成版本 2. 按段落拆分(以空行为分隔) 3. 逐个展示: [版本2 - 第3段] (共247段,当前第15段) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ "用了两周Claude Code,说实话,比Cursor好用不少。 最明显的是代码补全,Cursor经常补错,Claude Code 准确率高很多。我测了30个场景,Claude Code能正确 理解上下文的占26个,准确率87%。Cursor只有18个,60%。" ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📊 片段分析: - 字数: 87字 - 真实细节: ✅ 有具体数字 - AI特征: ✅ 无套话 - 句式: ✅ 口语化 - AI检测预估: 25% ✅ 你的判断: [g] 优质 - 必须用 [o] 可用 - 可考虑 [b] 不用 - 跳过 [s] 暂时跳过 [q] 退出选择 [?] 查看帮助 > _ ``` **标记系统**: | 标记 | 含义 | 快捷键 | 颜色 | |------|------|--------|------| | **优质** | AI味低、有细节、符合气质 | `g` | 🟢 绿色 | | **可用** | 基本可用,需要修改 | `o` | 🟡 黄色 | | **不用** | AI味重、套话多、不符合 | `b` | 🔴 红色 | | **跳过** | 暂时不确定 | `s` | ⚪ 灰色 | **辅助功能**- `Ctrl+Z` - 撤销上一次标记 - `Ctrl+F` - 搜索关键词(跳到相关片段) - `Ctrl+S` - 保存当前进度 - `Ctrl+R` - 查看统计报告 - `?` - 查看帮助 **输出文件** `materials/selected/001-claude-code.md````markdown # 选择的片段 - Claude Code评测 ## 元信息 - 文章ID: 001-claude-code - 选择时间: 2025-10-27 10:30:00 - 总片段数: 247 - 优质片段: 12 - 可用片段: 23 --- ## 优质片段 (12个) ### 片段 #1.3 (版本1-第3段) **来源**: version-1-rigorous.md **字数**: 87字 **评分**: AI检测 25% > 用了两周Claude Code,说实话,比Cursor好用不少。 > 最明显的是代码补全,Cursor经常补错,Claude Code > 准确率高很多。我测了30个场景,Claude Code能正确 > 理解上下文的占26个,准确率87%。Cursor只有18个,60%。 **适用场景**: 开头引入、数据支撑 **标签**: #真实数据 #对比 #口语化 --- ### 片段 #2.7 (版本2-第7段) ... --- ## 可用片段 (23个) ... ``` **验收标准**- [ ] 可逐段浏览所有生成内容 - [ ] 标记操作流畅(< 2秒响应) - [ ] 支持撤销、搜索、保存 - [ ] 提供片段分析(AI检测预估) - [ ] 保存结构化的选择结果 --- ### 3.4 文章组装(人的整合) #### `/assemble` - 组装文章 **功能描述**: 基于选择的片段,组装成完整文章 **执行逻辑**``` 1. 读取选择的片段 2. 读取观点和 brief 3. 提供两种模式: 模式A: 手动组装 - 用户拖拽片段排序 - 添加过渡段落 - 调整结构 模式B: AI辅助组装 - AI根据观点+片段生成框架 - 用户审核、调整 - 最终人工确认 ``` **手动组装界面**(TUI): ``` ┌─ 文章组装 - Claude Code评测 ────────────────────────┐ │ │ │ 观点: Claude Code的核心优势是上下文理解 │ │ 目标字数: 3000-3500 │ │ │ ├─ 可用片段(35个) ────────┬─ 文章框架 ───────────────┤ │ │ │ │ 🟢 #1.3 (87字) 真实数据 │ 1. 开头 (300字) │ │ 用了两周Claude Code... │ [拖拽片段到这里] │ │ │ │ │ 🟢 #2.7 (120字) 案例 │ 2. 核心观点 (500字) │ │ 某次重构项目中... │ 🟢 #1.3 │ │ │ [添加过渡] │ │ 🟡 #3.2 (95字) 数据 │ │ │ 根据测试结果... │ 3. 深度对比 (1200字) │ │ │ 🟢 #2.7 │ │ ... (更多片段) │ 🟡 #3.2 │ │ │ [添加分析] │ │ │ │ │ │ 4. 结尾 (300字) │ │ │ [待添加] │ ├────────────────────────────┴──────────────────────────┤ │ 当前字数: 1500 / 3000-3500 进度: ████░░░░░░ 50% │ │ │ │ [Space] 选择/取消 [Enter] 添加 [Del] 删除 │ │ [↑↓] 移动光标 [Ctrl+S] 保存 [Ctrl+Q] 退出 │ └────────────────────────────────────────────────────────┘ ``` **AI辅助组装**``` 系统: 📝 基于你的观点和选择的35个片段,我建议以下框架: 1. 开头 - 真实使用场景引入 (300字) 建议使用: 片段 #1.3, #2.1 过渡语: "两周前,我开始了这次对比测试" 2. 核心观点阐述 (500字) 建议使用: 片段 #1.3, #3.5, #4.2 重点: 围绕"上下文理解准确30%"展开 3. 深度对比测试 (1200字) 建议使用: 片段 #2.7, #3.2, #5.1, #6.3 结构: 3个场景 × 400字 4. 数据总结 (600字) 建议使用: 片段 #7.1, #8.3 包含: 对比图表 5. 结尾 - 推荐建议 (300字) 建议使用: 片段 #9.2 明确立场 预计字数: 2900字(略低于目标,可补充) 接受此框架? (yes/no/edit) ``` **输出文件** `articles/001-claude-code/draft.md````markdown # Claude Code评测 - 初稿 > 本文由 35 个精选片段组装而成 > 生成素材: 25000字 → 选择: 1300字 → 最终: 3200字 > AI辅助比例: 约 40% --- ## 开头 用了两周Claude Code,说实话,比Cursor好用不少。(片段 #1.3) 两周前,我开始了这次对比测试。(人工过渡) ... ``` **验收标准**- [ ] 支持手动组装(拖拽式TUI界面) - [ ] 支持AI辅助组装(提供框架建议) - [ ] 标注片段来源 - [ ] 实时字数统计 - [ ] 保存草稿版本 --- ### 3.5 品味培养系统 #### `/taste-report` - 品味分析报告 **功能描述**: 分析用户的选择模式,生成品味报告 **数据收集**: 每次 `/select-fragments` 时记录: - 选择了哪些片段(优质/可用/不用) - 片段的AI检测分数 - 片段的特征(套话、真实细节、句式等) **分析维度**1. **选择准确率** - 优质片段命中率(AI检测<30%的比例) - 拒绝AI套话的准确率 - 真实细节识别能力 2. **品味特征** - 擅长识别:哪些AI痕迹识别最准 - 需提升:哪些方面容易误判 3. **进步曲线** - 最近10篇的品味评分趋势 - 对比初期和现在 4. **对比优秀作者** - 你的选择 vs 优秀作者的选择(相同素材) - 差距分析 **报告示例**``` ┌─ 品味分析报告 ───────────────────────────────────────┐ │ │ │ 用户: 小李 写作时长: 6个月 │ │ 完成文章: 32篇 品味等级: ⭐⭐⭐⭐☆ │ │ │ ├─ 选择准确率 ──────────────────────────────────────────┤ │ │ │ 优质片段命中率: 85% ████████░░ (目标: >80%) ✅ │ │ 拒绝AI套话: 92% █████████░ (目标: >85%) ✅ │ │ 真实细节识别: 78% ███████░░░ (目标: >80%) ⚠️ │ │ │ ├─ 品味特征 ────────────────────────────────────────────┤ │ │ │ ✅ 擅长识别: │ │ • AI套话 ("在当今..."、"值得注意的是") 准确率95% │ │ • 书面词汇 ("显著提升"、"充分利用") 准确率90% │ │ • AI句式 ("不仅...而且...") 准确率88% │ │ │ │ ⚠️ 需提升: │ │ • 真实细节识别 (容易被"看似真实"迷惑) 准确率78% │ │ • 节奏感把控 (长短句搭配) 准确率72% │ │ • 情感真实度 (区分真情实感vs假大空) 准确率70% │ │ │ ├─ 进步曲线 ────────────────────────────────────────────┤ │ │ │ 品味评分 │ │ 100┤ ● │ │ 90┤ ● ● ● │ │ 80┤ ● ● │ │ 70┤ ● ● │ │ 60┤ ● │ │ 50┤ ● │ │ 40┤ │ │ └────┬────┬────┬────┬────┬────┬────┬───── │ │ 1月 2月 3月 4月 5月 6月 7月 现在 │ │ │ │ 📈 趋势: 稳步提升,过去2个月进步明显 │ │ │ ├─ 对比优秀作者 ────────────────────────────────────────┤ │ │ │ 对比对象: 大师兄朱炫 (AI领域资深作者) │ │ │ │ 相同素材测试(10组): │ │ - 你的选择与大师兄重合度: 68% ⚠️ (优秀: >75%) │ │ - 大师兄选择但你忽略的优质片段: 12个 │ │ - 你选择但大师兄拒绝的片段: 5个 │ │ │ │ 差距分析: │ │ 1. 大师兄更善于发现"反常识"的表达 │ │ 2. 你倾向选择"安全"的片段,冒险不足 │ │ 3. 节奏感把控差距明显 │ │ │ ├─ 训练建议 ────────────────────────────────────────────┤ │ │ │ 🎯 本周训练目标: 提升真实细节识别能力 │ │ │ │ 📚 推荐阅读 (5篇): │ │ 1. 大师兄朱炫《AI降临之夜》- 真实细节运用典范 │ │ 2. 宝玉老师《编程1000小时》- 观点提炼典范 │ │ 3. ... │ │ │ │ 💪 品味挑战 (3个): │ │ 1. 对比练习: 你的选择 vs 大师兄的选择(10组) │ │ 2. 盲选测试: 从100个片段中选出10个优质的 │ │ 3. 改写练习: 把5个AI味重的片段改成真实的 │ │ │ │ ⏱️ 预计完成时间: 本周内(3-4小时) │ │ │ └────────────────────────────────────────────────────────┘ 继续? [Enter] 查看详情 [q] 退出 ``` **验收标准**- [ ] 准确计算选择准确率 - [ ] 识别品味特征(擅长+需提升) - [ ] 展示进步曲线 - [ ] 提供对比分析 - [ ] 给出个性化训练建议 --- #### `/taste-challenge` - 品味挑战 **功能描述**: 通过对比练习、盲选测试等方式训练品味 **挑战类型****1. 对比练习** ``` 题目: 以下两个片段,哪个更好? 片段A: "Claude Code通过深度学习算法,实现了对代码上下文的精准 理解,相比传统工具,其准确率提升了显著的幅度。" 片段B: "用了两周Claude Code,代码补全准确率高很多。我测了30个 场景,Claude Code正确26个(87%),Cursor只有18个(60%)。" 你的选择: [A / B / 都不好] > B ✅ 正确!大师兄朱炫也选择了B 理由: - B有真实数据(30个场景、具体比例) - B口语化("用了两周"、"高很多") - A太书面("精准理解"、"显著的幅度") - A没有具体数据 得分: +10分 ``` **2. 盲选测试** ``` 从以下10个片段中,选出3个最优质的: 1. "在当今AI技术飞速发展的时代..." [选择] 2. "说实话,用Claude Code两周后..." [选择] 3. "通过充分利用工具的能力..." [选择] ... 提交答案 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📊 测试结果: 你的选择: 2, 5, 8 标准答案: 2, 5, 7 准确率: 66% (2/3) 排名: 前30% 分析: ✅ #2 - 正确,真实细节丰富 ✅ #5 - 正确,口语化自然 ❌ #8 - 错误,有轻微AI句式 标准答案是 #7,因为... 得分: +15分 ``` **3. 改写练习** ``` 任务: 把以下AI味重的片段改写成真实的 原文: "在使用过程中,我们发现Claude Code在代码补全方面表现出色, 不仅响应速度快,而且准确率高,显著提升了开发效率。" 你的改写: > 用Claude Code写代码,最明显的是补全快。以前Cursor要等2-3秒, > Claude Code基本秒出。而且准确,10次补全能对8-9次,Cursor只能对6次。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ AI评分: 去AI化: 9/10 ✅ (删除了"显著提升"、"不仅...而且...") 真实性: 8/10 ✅ (加入了具体数字) 口语化: 9/10 ✅ ("最明显的是"、"基本秒出") 总评: 优秀改写!已接近专业水平。 建议: 可以再加一句个人感受,如"现在再也不想换回Cursor了" 得分: +20分 ``` **积分系统**- 对比练习: +10分/题 - 盲选测试: +15分/题 - 改写练习: +20分/题 - 连续正确: 额外奖励 **等级系统**``` Lv1 新手作者 0-100分 Lv2 入门作者 100-300分 Lv3 熟练作者 300-600分 Lv4 资深作者 600-1000分 Lv5 专家作者 1000-2000分 Lv6 大师作者 2000+分 ``` **验收标准**- [ ] 3种挑战类型可用 - [ ] 题库至少100道 - [ ] 积分系统运行正常 - [ ] 提供详细的错误分析 - [ ] 支持进度保存 --- ## 四、技术方案 ### 4.1 多版本生成实现 **方案A: 串行生成(稳定)** ```typescript // src/commands/generate-materials.ts interface GenerationOptions { versions: number; // 版本数量 words: number; // 每版本字数 styles?: string[]; // 风格列表 parallel?: boolean; // 是否并行 } async function generateMaterials(options: GenerationOptions) { const { versions, words, styles, parallel } = options; // 读取观点和 brief const viewpoint = await readViewpoint(); const brief = await readBrief(); const results = []; if (parallel) { // 并行生成(更快,消耗更多token) const promises = []; for (let i = 0; i < versions; i++) { const style = styles?.[i] || getRandomStyle(); promises.push(generateVersion(viewpoint, brief, style, words)); } results = await Promise.all(promises); } else { // 串行生成(稳定) for (let i = 0; i < versions; i++) { const style = styles?.[i] || getRandomStyle(); const version = await generateVersion(viewpoint, brief, style, words); results.push(version); // 显示进度 showProgress(i + 1, versions); } } // 保存所有版本 await saveMaterials(results); return results; } async function generateVersion( viewpoint: string, brief: Brief, style: string, words: number ) { const prompt = ` 你是一个${style}风格的内容生成器。 核心观点(灵魂,必须围绕展开): ${viewpoint} Brief: ${brief.content} 要求: 1. 严格围绕核心观点展开 2. 字数: ${words}字 3. 风格: ${style} 4. 生成完整内容,包含: - 开头、中间论证、结尾 - 尽可能详细和丰富 - 提供多种表达方式和案例 注意: 这是素材生成,不是最终文章。请大胆尝试不同表达。 `; const response = await callAI(prompt); return { id: generateId(), style, content: response, words: countWords(response), generated_at: new Date(), }; } ``` **方案B: 使用不同AI模型生成(多样性更高)** ```typescript const models = [ 'gemini-2.0-flash-exp', 'claude-3-5-sonnet', 'gpt-4-turbo', 'claude-3-5-haiku', 'gpt-4o-mini', ]; for (let i = 0; i < versions; i++) { const model = models[i % models.length]; const version = await generateVersionWithModel(model, ...); results.push(version); } ``` --- ### 4.2 片段选择实现 **TUI 库选择**: `blessed``ink`(React-based TUI) **选择 ink 的原因**: - React 组件式开发,易维护 - 丰富的组件生态 - 支持复杂交互 **核心组件**: ```tsx // src/commands/select-fragments/SelectionUI.tsx import React, { useState } from 'react'; import { Box, Text, useInput } from 'ink'; interface Fragment { id: string; version: string; paragraph: number; content: string; words: number; aiScore: number; features: string[]; } export function SelectionUI({ fragments }: { fragments: Fragment[] }) { const [currentIndex, setCurrentIndex] = useState(0); const [selections, setSelections] = useState<Map<string, 'good' | 'ok' | 'bad'>>(new Map()); const current = fragments[currentIndex]; useInput((input, key) => { if (input === 'g') { selections.set(current.id, 'good'); setCurrentIndex(i => Math.min(i + 1, fragments.length - 1)); } else if (input === 'o') { selections.set(current.id, 'ok'); setCurrentIndex(i => Math.min(i + 1, fragments.length - 1)); } else if (input === 'b') { selections.set(current.id, 'bad'); setCurrentIndex(i => Math.min(i + 1, fragments.length - 1)); } else if (input === 's') { setCurrentIndex(i => Math.min(i + 1, fragments.length - 1)); } else if (key.upArrow) { setCurrentIndex(i => Math.max(i - 1, 0)); } else if (key.downArrow) { setCurrentIndex(i => Math.min(i + 1, fragments.length - 1)); } }); return ( <Box flexDirection="column"> <Box borderStyle="single" paddingX={2}> <Text bold> 片段选择 - 第 {currentIndex + 1} / {fragments.length} </Text> </Box> <Box marginTop={1} borderStyle="single" paddingX={2} paddingY={1}> <Text>{current.content}</Text> </Box> <Box marginTop={1}> <Text> 📊 分析: {current.words}字 | AI检测: {current.aiScore}% | 特征: {current.features.join(', ')} </Text> </Box> <Box marginTop={1}> <Text color="green">[g] 优质</Text> <Text> </Text> <Text color="yellow">[o] 可用</Text> <Text> </Text> <Text color="red">[b] 不用</Text> <Text> </Text> <Text color="gray">[s] 跳过</Text> </Box> <Box marginTop={1} borderStyle="single" paddingX={2}> <Text> 优质: {countSelections('good')} | 可用: {countSelections('ok')} | 不用: {countSelections('bad')} </Text> </Box> </Box> ); } ``` --- ### 4.3 品味分析实现 **数据收集**: ```typescript // src/services/taste-tracker.ts interface SelectionRecord { articleId: string; fragmentId: string; userChoice: 'good' | 'ok' | 'bad' | 'skip'; fragmentFeatures: { aiScore: number; hasRealDetails: boolean; hasClichés: boolean; isOralStyle: boolean; sentenceLength: number; }; timestamp: Date; } class TasteTracker { private db: Database; // SQLite async recordSelection(record: SelectionRecord) { await this.db.insert('selection_records', record); } async analyzeUserTaste(userId: string): Promise<TasteReport> { // 查询最近 50 次选择 const records = await this.db.query(` SELECT * FROM selection_records WHERE user_id = ? ORDER BY timestamp DESC LIMIT 50 `, [userId]); // 计算准确率 const goodChoices = records.filter(r => r.userChoice === 'good'); const hitRate = goodChoices.filter(r => r.fragmentFeatures.aiScore < 30).length / goodChoices.length; // 识别特征 const rejectClichés = records.filter(r => r.userChoice === 'bad' && r.fragmentFeatures.hasClichés ).length / records.filter(r => r.fragmentFeatures.hasClichés).length; // ...更多分析 return { hitRate, rejectClichés, // ... }; } } ``` --- ### 4.4 数据库设计 **使用 SQLite**(轻量级,无需额外服务) ```sql -- 用户表 CREATE TABLE users ( id TEXT PRIMARY KEY, name TEXT, created_at DATETIME ); -- 文章表 CREATE TABLE articles ( id TEXT PRIMARY KEY, title TEXT, viewpoint TEXT, user_id TEXT, created_at DATETIME, FOREIGN KEY (user_id) REFERENCES users(id) ); -- 生成版本表 CREATE TABLE generated_versions ( id TEXT PRIMARY KEY, article_id TEXT, version_number INTEGER, style TEXT, content TEXT, words INTEGER, model TEXT, generated_at DATETIME, FOREIGN KEY (article_id) REFERENCES articles(id) ); -- 片段表 CREATE TABLE fragments ( id TEXT PRIMARY KEY, version_id TEXT, paragraph_number INTEGER, content TEXT, words INTEGER, ai_score REAL, -- AI检测分数 has_clichés BOOLEAN, -- 是否有套话 has_real_details BOOLEAN, -- 是否有真实细节 is_oral_style BOOLEAN, -- 是否口语化 sentence_length_avg REAL, -- 平均句长 FOREIGN KEY (version_id) REFERENCES generated_versions(id) ); -- 选择记录表 CREATE TABLE selection_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, article_id TEXT, fragment_id TEXT, user_choice TEXT, -- 'good' | 'ok' | 'bad' | 'skip' timestamp DATETIME, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (article_id) REFERENCES articles(id), FOREIGN KEY (fragment_id) REFERENCES fragments(id) ); -- 品味分数表 CREATE TABLE taste_scores ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, date DATE, hit_rate REAL, -- 优质片段命中率 reject_clichés_rate REAL, -- 拒绝套话准确率 real_details_rate REAL, -- 真实细节识别率 overall_score REAL, -- 综合评分 FOREIGN KEY (user_id) REFERENCES users(id) ); -- 挑战记录表 CREATE TABLE challenge_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, challenge_type TEXT, -- 'comparison' | 'blind' | 'rewrite' question_id TEXT, user_answer TEXT, correct_answer TEXT, is_correct BOOLEAN, points INTEGER, timestamp DATETIME, FOREIGN KEY (user_id) REFERENCES users(id) ); -- 索引 CREATE INDEX idx_selection_records_user ON selection_records(user_id); CREATE INDEX idx_selection_records_article ON selection_records(article_id); CREATE INDEX idx_taste_scores_user ON taste_scores(user_id); CREATE INDEX idx_challenge_records_user ON challenge_records(user_id); ``` --- ## 五、用户界面设计 ### 5.1 命令行参数 ```bash # 提炼观点 /extract-viewpoint [brief路径] # 生成素材 /generate-materials [选项] --versions <数量> 版本数(默认:3) --words <字数> 每版本字数(默认:5000) --styles <风格列表> 指定风格(逗号分隔) --parallel 并行生成 --model <模型> 指定AI模型 # 选择片段 /select-fragments [选项] --article <ID> 文章ID(默认:最新) --filter <过滤器> 过滤条件(如:--filter ai_score<30) --resume 继续上次选择 # 组装文章 /assemble [选项] --mode <模式> 'manual' | 'ai-assist'(默认:manual) --article <ID> 文章ID # 品味报告 /taste-report [选项] --period <时期> 分析时期(如:--period 30days) --compare <用户> 对比其他用户 # 品味挑战 /taste-challenge [选项] --type <类型> 挑战类型(comparison/blind/rewrite) --level <难度> 难度等级(1-5) ``` --- ### 5.2 交互流程图 ``` ┌─────────────────┐ │ /specify │ │ 定义需求 │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /extract- │ ⭐ 新增 │ viewpoint │ │ 提炼观点 │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /research │ │ 信息搜索 │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /collect │ │ 搜索素材 │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /generate- │ ⭐ 取代 /write │ materials │ │ 生成3-5个版本 │ │ (15000-25000字)│ └────────┬────────┘ ↓ ┌─────────────────┐ │ /select- │ ⭐ 新增(品味核心) │ fragments │ │ 逐个标记片段 │ │ (几百字优质) │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /assemble │ ⭐ 新增 │ 组装文章 │ │ (2000-3500字) │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /review │ │ 三遍审校 │ └────────┬────────┘ ↓ ┌─────────────────┐ │ /images │ │ 配图 │ └────────┬────────┘ ↓ ┌─────────────────┐ │ 发布 │ └─────────────────┘ 同时: ┌─────────────────┐ │ /taste-report │ ⭐ 品味培养 │ 查看品味分析 │ └─────────────────┘ ┌─────────────────┐ │ /taste- │ ⭐ 品味训练 │ challenge │ │ 完成挑战训练 │ └─────────────────┘ ``` --- ## 六、验收标准 ### 6.1 功能验收 #### P0 - 必须完成 - [ ] `/extract-viewpoint` 可用,强制用户提炼观点 - [ ] `/generate-materials` 可生成 3-5 个版本 - [ ] 总生成量可达 15000-25000 字 - [ ] `/select-fragments` TUI 界面可用 - [ ] 支持标记 优质/可用/不用 - [ ] 选择结果保存为结构化文件 - [ ] `/assemble` 手动组装模式可用 - [ ] 组装时可插入片段和过渡段 - [ ] 最终文章标注 AI 辅助比例 #### P1 - 应该完成 - [ ] `/generate-materials` 支持指定风格 - [ ] 支持并行生成(加速) - [ ] `/select-fragments` 提供片段分析 - [ ] 支持撤销、搜索、保存进度 - [ ] `/assemble` AI 辅助模式可用 - [ ] `/taste-report` 基础报告可用 - [ ] 显示选择准确率、品味特征 #### P2 - 可选 - [ ] `/taste-challenge` 全部 3 种挑战类型 - [ ] 对比优秀作者功能 - [ ] 积分和等级系统 - [ ] 多模型生成支持 --- ### 6.2 体验验收 #### 核心体验指标 **1. 品味体现度** - [ ] 用户能明显感受到"选择权在我" - [ ] 用户完成选择后有"这是我的判断"的感觉 - [ ] 对比前后,用户认同"品味提升" **2. 工作流自然度** - [ ] 从观点提炼到成文,流程连贯 - [ ] 每一步都知道为什么这么做 - [ ] 没有"AI越俎代庖"的感觉 **3. 效率提升** - [ ] 相比纯人工,节省 30%-50% 时间 - [ ] 相比纯 AI 生成,质量提升明显(AI 检测率降低 20%+) --- ### 6.3 真实用户验证 **验证方法**1. **对比测试** - 用户 A:用新工作流写 3 篇文章 - 用户 B:用旧工作流写 3 篇文章 - 对比:AI 检测率、真实感、用户满意度 2. **品味提升测试** - 用户完成 10 篇文章 - 对比第 1 篇和第 10 篇的选择准确率 - 预期:准确率提升 10%-20% 3. **定性访谈** - 询问用户:感觉 AI 是助手还是主导? - 询问用户:是否感觉品味有提升? - 询问用户:会推荐给朋友吗? **成功标准**- [ ] 70% 用户认为"AI 是助手,我是主导" - [ ] 60% 用户感觉品味有提升 - [ ] 80% 用户愿意推荐给朋友 - [ ] AI 检测率平均 < 35%(对比旧方法 50%+) --- ## 七、开发排期 ### Phase 1: 核心功能(5天) **Day 1-2: 多版本生成** - [ ] 实现 `/generate-materials` 命令 - [ ] 支持串行生成 3-5 个版本 - [ ] 保存到结构化目录 - [ ] 编写测试 **Day 3-4: 片段选择** - [ ] 实现 `/select-fragments` TUI - [ ] 支持标记 优质/可用/不用 - [ ] 保存选择结果 - [ ] 编写测试 **Day 5: 文章组装** - [ ] 实现 `/assemble` 手动模式 - [ ] 支持插入片段 - [ ] 生成最终文章 - [ ] 编写测试 ### Phase 2: 品味培养(2天) **Day 6: 品味报告** - [ ] 数据库设计和初始化 - [ ] 实现选择记录收集 - [ ] 实现 `/taste-report` 基础报告 **Day 7: 品味挑战** - [ ] 实现对比练习 - [ ] 实现盲选测试 - [ ] 题库准备(50 道) ### Phase 3: 测试和优化(1-2天) **Day 8: 完整流程测试** - [ ] 真实文章测试(5 篇) - [ ] 用户体验测试 - [ ] Bug 修复 --- ## 八、风险和依赖 ### 8.1 技术风险 **风险1: 多版本生成成本高** - **描述**: 生成 5 个版本×5000 字,token 消耗大 - **影响**: P0(成本问题) - **缓解措施**: - 支持选择版本数(3-5 可调) - 支持选择模型(便宜模型:Gemini Flash) - 提供成本预估 - **替代方案**: 生成更短的版本(3000 字),总量 15000 字 **风险2: TUI 开发复杂度** - **描述**: `ink` 学习曲线,调试困难 - **影响**: P1(体验问题) - **缓解措施**: - 先实现简单版本(纯文本交互) - 逐步升级到 TUI - **替代方案**: 使用 Web 界面(Electron) **风险3: 片段分析准确性** - **描述**: AI 检测分数、特征识别可能不准 - **影响**: P1(辅助功能) - **缓解措施**: - 基于规则+AI 评分结合 - 允许用户标注"分析错误" - 持续优化算法 ### 8.2 产品风险 **风险1: 用户不愿意做选择** - **描述**: 用户可能觉得"选择太费时间",宁愿让 AI 直接生成 - **影响**: P0(核心价值) - **缓解措施**: - 强调品味的重要性(教育) - 提供快速模式(AI 自动筛选 + 人工审核) - 显示品味提升效果 - **验证方法**: 早期用户测试,观察是否愿意完成选择 **风险2: 学习曲线过陡** - **描述**: 新增命令多,用户可能不理解 - **影响**: P1(用户体验) - **缓解措施**: - 详细文档和教程 - 交互式引导 - 提供模板流程 ### 8.3 依赖 **外部依赖**: - [ ] AI API(Gemini、Claude、GPT) - [ ] `ink` 库(TUI) - [ ] SQLite(数据库) **内部依赖**: - [ ] 现有 `/write` 命令逻辑可复用 - [ ] 现有 `/review` 审校规则 - [ ] 现有 brief 和 materials 系统 --- ## 九、后续迭代方向 ### V2.0 功能 1. **AI 自动预筛选** - AI 先筛选出优质片段候选 - 用户只需审核,减少工作量 2. **协作品味库** - 多用户共享优秀片段 - 学习其他人的选择 3. **品味风格定制** - 用户定义自己的品味标准 - 系统自动应用 4. **Web 界面** - 更丰富的交互 - 可视化品味曲线 --- ## 十、总结 本 PRD 基于用户真实工作流,重新定义了 Article Writer 的核心价值: **从"让 AI 写文章"转向"帮用户建立品味,用 AI 放大品味"** 核心改进: 1.**多版本生成** - 生成几万字素材供选择 2.**片段选择系统** - 体现品味的关键环节 3.**品味培养机制** - 让用户在使用中提升品味 4.**观点驱动** - 强调观点是灵魂 **这些改进将让系统真正成为"AI 辅助创作"的标杆产品,而不仅仅是一个"AI 生成工具"。** --- **下一步**:进入开发阶段,按照 Phase 1 → Phase 2 → Phase 3 的顺序实施。