001project_wildgrowth/docs/tech-plan-persona-cleanup-a...

127 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 技术方案:删除「直接生成测试版」+ 新增「豆包lite-大纲 / 豆包lite-总结」
## 一、目标
1. **删除**「直接生成测试版」相关前后端代码。
2. **新增**两个选项:「直接测试-豆包lite-大纲」「直接测试-豆包lite-总结」,前后端全支持。
3. **收尾**:推 Git阿里云部署。
---
## 二、现状梳理
| 层级 | 直接生成测试版 (direct_test) | 直接测试-豆包lite (direct_test_lite) |
|------|------------------------------|--------------------------------------|
| **后端** | `direct_generation_test` Prompt 类型;`validPersonas` 含 `direct_test`;生成时 `persona === 'direct_test'` 用该 Prompt、默认模型 | 同用 `direct_generation_test` Prompt`persona === 'direct_test_lite'` 用 `DOUBAO_MODEL_LITE` |
| **前端 iOS** | `PersonaType.directTest`PersonaSelectionView 里一张卡片 | `PersonaType.directTestLite`PersonaSelectionView 里一张卡片 |
| **管理后台** | course-admin 里「直接生成测试版 Prompt」配置项 | 无单独配置(与 direct_test 共用 Prompt |
- 数据库:`course_generation_tasks.persona` 为 String无枚举约束**加删 persona 值不需要 DB 迁移**。
- 当前直接生成流程:一次调用得到 `chaptered_content`(大纲+节解释),再 `contentService.generateAllContent` 填内容;没有单独的「只生成大纲」或「只生成总结」接口,新选项在现有流程上通过 **persona + 可选不同 Prompt** 区分即可。
---
## 三、方案一:删除「直接生成测试版」+ 新增两个 lite 选项(推荐)
### 3.1 删除「直接生成测试版」
**后端**
- **promptConfigService.ts**
- `PromptType` 去掉 `'direct_generation_test'`
- 删除 `DIRECT_GENERATION_TEST`、默认 `direct_generation_test` 的 default prompt、`getPromptKey`/`getDefaultPrompt`/`getPromptTemplate` 中对该类型的处理。
- **courseGenerationService.ts**
- 删除对 `persona === 'direct_test'` 的分支;只保留对 `direct_test_lite*` 的判断(见下)。
- 原「直接生成测试版」与「直接测试-豆包lite」共用的逻辑改为仅当 persona 为 `direct_test_lite` / `direct_test_lite_outline` / `direct_test_lite_summary` 时使用「测试用 Prompt」+ 豆包 Lite 模型(见下)。
- **validation.ts**
- `validPersonas` 去掉 `'direct_test'`,加入 `'direct_test_lite_outline'`、`'direct_test_lite_summary'`(若保留原有 `direct_test_lite` 则也保留)。
- **promptController.ts**
- 类型与 PROMPT_TYPE_MAP 等中去掉 `direct_generation_test`若保留一个「lite 用」的 Prompt可重命名为例如 `direct_generation_lite` 或保留一名给 lite 共用(见下)。
- **course-admin.html**
- Prompt 配置列表去掉「直接生成测试版 Prompt」若新增「豆包lite-大纲/总结」专用 Prompt则在列表中增加对应项并改说明文案。
**iOS**
- **AICourseModels.swift**
- 删除 `case directTest = "direct_test"`
- **PersonaSelectionView.swift**
- 删除「直接生成测试版」那张 `CleanPersonaCard`,只保留/新增「直接测试-豆包lite」「直接测试-豆包lite-大纲」「直接测试-豆包lite-总结」等(见下)。
### 3.2 新增「直接测试-豆包lite-大纲」「直接测试-豆包lite-总结」
**选项 A最小实现推荐先做**
- 两个新选项仅作「人格/入口」区分,**共用同一套 Prompt 和同一豆包 Lite 模型**,便于先上线、后补差异化 Prompt。
- 后端:
- `validPersonas` 增加:`direct_test_lite_outline`、`direct_test_lite_summary`。
- `courseGenerationService`
- 模型:`persona === 'direct_test_lite' || persona === 'direct_test_lite_outline' || persona === 'direct_test_lite_summary'` → 使用 `DOUBAO_MODEL_LITE`
- Prompt上述 persona 均使用同一个「lite 用」Prompt例如保留并重命名原 `direct_generation_test``direct_generation_lite`,或新键 `direct_generation_lite`,仅一份模板)。
- 管理后台:保留/改为一个「直接生成 Lite Prompt」或「豆包 Lite 测试用 Prompt」供三个 lite 选项共用。
- iOS
- `PersonaType` 增加:`directTestLiteOutline`、`directTestLiteSummary`(保留或删除 `directTestLite` 按产品决定)。
- PersonaSelectionView 在「直接生成」流程下展示两张新卡片:「直接测试-豆包lite-大纲」「直接测试-豆包lite-总结」(若保留「直接测试-豆包lite」则三张
- 后续若需要「大纲」和「总结」在生成效果上真正区分,再为这两个 persona 各配不同 Prompt见选项 B
**选项 B大纲/总结用不同 Prompt可选、后续迭代**
- 后端新增两个 Prompt 类型,例如:`direct_generation_lite_outline`、`direct_generation_lite_summary`。
- `promptConfigService`、`promptController`、course-admin 中增加这两种类型的配置与编辑。
- `courseGenerationService` 中按 persona 选择 Prompt
- `direct_test_lite_outline``direct_generation_lite_outline`
- `direct_test_lite_summary``direct_generation_lite_summary`
- (若仍保留 `direct_test_lite`)→ 共用 `direct_generation_lite` 或其一。
- 模型仍为豆包 Lite仅 Prompt 不同。iOS 无需改接口,只传不同 persona。
### 3.3 建议实施顺序
1. **后端**:删除 `direct_test``direct_generation_test` 全部引用;`validPersonas` 改为只含 `direct_test_lite`、`direct_test_lite_outline`、`direct_test_lite_summary`(或按产品二选一:只保留后两个)。
2. **后端**:为 lite 统一使用一个 Prompt 类型(如 `direct_generation_lite`courseGenerationService 与 promptController 只认这一种;管理后台只保留一个 Lite 用 Prompt 配置。
3. **iOS**:删除 `directTest`,新增 `directTestLiteOutline` / `directTestLiteSummary`PersonaSelectionView 只展示两个新卡片(或加「直接测试-豆包lite」共三个
4. **联调**创建课程选「豆包lite-大纲」「豆包lite-总结」各跑通一次,确认进度与结果正常。
5. **管理后台**:文案与列表项与上述一致(删除直接生成测试版、保留/新增 Lite 用 Prompt
---
## 四、Git 与阿里云部署
- **Git**
- 在功能分支完成上述改动,自测通过后合并到主分支(如 `main`)。
- 提交信息建议包含:`feat: 移除直接生成测试版新增豆包lite-大纲/总结选项`。
- **阿里云部署**
- 当前脚本:`backend/deploy/deploy-from-github.sh`(从 GitHub 拉取后 build + pm2 restart
- 步骤:
`ssh root@<阿里云主机>``cd /var/www/wildgrowth-backend/backend``bash deploy/deploy-from-github.sh [分支名]`
- 若 pull 超时,可使用 `deploy-rsync-from-local.sh` 从本机 rsync 代码再在服务器上 build 并重启。
- 部署后验证管理后台能打开、Prompt 配置正常iOS 选「豆包lite-大纲」或「豆包lite-总结」创建课程,任务能正常跑完并在列表中可见。
---
## 五、风险与注意点
- **历史任务**:已有 `persona = 'direct_test'``'direct_generation_test'` 的旧任务仅作历史数据,新逻辑不再处理;若管理后台有按 persona 展示,需把「直接生成测试版」改为已废弃或隐藏。
- **AppConfig 表**:若曾把 `direct_generation_test_prompt` 存进配置,删除类型后对应 key 可保留不删,避免误删其它配置;或单独清理脚本只删该 key。
- **iOS 与后端 persona 枚举**:两边需完全一致(`direct_test_lite_outline` / `direct_test_lite_summary` 等),否则接口会报 persona 校验失败。
---
## 六、小结
| 步骤 | 内容 |
|------|------|
| 1 | 后端删除 `direct_test`、`direct_generation_test`validPersonas 与生成逻辑只保留 lite 系 persona |
| 2 | 后端为 lite 统一一个 Prompt 类型(如 `direct_generation_lite`),并支持 `direct_test_lite_outline`、`direct_test_lite_summary` |
| 3 | iOS 删除 directTest新增 directTestLiteOutline、directTestLiteSummary选择页只展示新选项 |
| 4 | 管理后台 Prompt 列表与说明文案同步 |
| 5 | 推 Git阿里云执行 deploy-from-github.sh或 rsync 后 build + 重启) |
---
## 七、已实施(本期)
- 已删除「直接生成测试版」(direct_test) 及 `direct_generation_test` Prompt 类型。
- 已保留「直接测试-豆包lite」(direct_test_lite),并新增「直接测试-豆包lite-大纲」(direct_test_lite_outline)、「直接测试-豆包lite-总结」(direct_test_lite_summary)。
- 后端:三个 lite 选项分别使用 `direct_generation_lite`、`direct_generation_lite_outline`、`direct_generation_lite_summary` 三个 Prompt 类型,管理后台可分别配置;均使用豆包 Lite 模型,调用流程与原先直接测试-豆包lite 一致。
- iOSPersonaSelectionView 在直接生成流程下展示三张卡片AICourseModels 已移除 directTest保留 directTestLite新增 directTestLiteOutline、directTestLiteSummary。
- 部署:代码推 Git 后,在阿里云执行 `deploy-from-github.sh`(或 rsync 后 build + pm2 restart即可。