问题描述
在前端「提示词广场」对任何提示词模板进行编辑、新建版本或激活版本后,这些修改不会被实际的章节生成流程读取。生成时仍然使用代码中硬编码的提示词。
复现步骤
- 打开前端提示词广场
- 编辑
chapter-generation-main 或 workflow-chapter-generation 的 system prompt,明显修改一些特征(例如开头加一句"【测试标记】")
- 保存,确认激活版本已更新
- 启动托管模式生成一章
- 检查生成章节内容,不会包含任何提示词改动带来的效果;如有 LLM 请求日志,可以验证发出的 system message 仍为代码中硬编码版本
根因分析
双轨提示词管理未对接
项目中有两套提示词加载机制:
PromptManager(infrastructure/ai/prompt_manager.py):数据库驱动、面向 UI 编辑,前端提示词广场的所有 CRUD 都走这里
PromptLoader(infrastructure/ai/prompt_loader.py):只读 prompts_defaults.json,不读数据库
生成管线绕过了 PromptManager
核心生成路径 AutoNovelGenerationWorkflow._build_prompt()(application/workflows/auto_novel_generation_workflow.py:862-911)完全硬编码,既不读 DB 也不读 JSON。托管模式、API 单章生成都走这个方法。
经过排查,prompts_defaults.json 中注册的 34 个模板里,只有 tension-scoring 一个实际接入了 PromptManager。其他 33 个模板(包括用户在前端看到的说书人反AI版 chapter-generation-main)都只是数据展示,并未真正影响生成。
典型受影响模板与对应调用方
| 模板 ID |
调用方(应该读 DB 但没读) |
| chapter-generation-main / workflow-chapter-generation |
`AutoNovelGenerationWorkflow._build_prompt` |
| chapter-generation-basic |
`AIGenerationService._build_chapter_prompt` |
| scene-generation |
`SceneGenerationService._build_scene_prompt` |
| dialogue-generation |
`SandboxDialogueService.build_dialogue_generation_prompt` |
| review-character-consistency 等 5 个 review 模板 |
`ChapterReviewService` 各 `build*_prompt` |
| bible-all / worldbuilding / characters / locations |
`AutoBibleGenerator` 各 `generate*` |
| planning-quick-macro / planning-act / planning-main-plot-suggest |
`ContinuousPlanningService` / `SetupMainPlotSuggestionService` |
| summary-act / volume / part / checkpoint |
`VolumeSummaryService` |
| beat-sheet-decomposition |
`BeatSheetService._build_beat_sheet_prompt` |
| chapter-state-extraction / chapter-narrative-sync |
`chapter_state_llm_contract` / `chapter_narrative_sync` |
| knowledge-initial |
`AutoKnowledgeGenerator` |
| scene-director |
`SceneDirectorService` |
| chapter-summarizer |
`ClaudeChapterSummarizer` |
| refactor-proposal |
`MacroRefactorProposalService` |
| style-analysis |
`LLMVoiceAnalysisService` |
| tension-analysis-diagnosis |
`TensionAnalyzer` |
lifecycle-phase-directives 与 beat-focus-instructions 的特殊问题
这两个模板通过 PromptLoader 从 JSON 文件读取 _directives、_focus_instructions 等下划线前缀的私有字段。即使把 PromptManager 接入 PromptLoader,这些私有字段在 DB schema 中也没有对应列(prompt_versions 表只有 system_prompt 和 user_template),用户在前端根本编辑不到。
预期行为
用户在前端提示词广场编辑并激活的提示词版本,应当被所有生成路径读取并使用。
建议的修复方向
-
让 PromptManager.render(node_key, variables) 成为所有生成服务读取提示词的统一入口,DB 有激活版本则用 DB 版本,否则降级到 JSON 种子
-
在核心入口 AutoNovelGenerationWorkflow._build_prompt 优先接入,再逐步扩展到 review / bible / planning / summary 等服务
-
对于 lifecycle-phase-directives / beat-focus-instructions 的私有字段存储问题,需要扩展 prompt_versions schema(新增 extra_fields TEXT 列存 JSON),或在前端屏蔽这两个模板的"可编辑"提示,避免用户误以为修改会生效
如果方向获得认可,我可以按顺序提小 PR(每个 PR 只改一类服务 + 带测试),方便逐步 review。
版本
- 分支:main
- 最近提交:
4773398 fix(global-llm-entry-button)
问题描述
在前端「提示词广场」对任何提示词模板进行编辑、新建版本或激活版本后,这些修改不会被实际的章节生成流程读取。生成时仍然使用代码中硬编码的提示词。
复现步骤
chapter-generation-main或workflow-chapter-generation的 system prompt,明显修改一些特征(例如开头加一句"【测试标记】")根因分析
双轨提示词管理未对接
项目中有两套提示词加载机制:
PromptManager(infrastructure/ai/prompt_manager.py):数据库驱动、面向 UI 编辑,前端提示词广场的所有 CRUD 都走这里PromptLoader(infrastructure/ai/prompt_loader.py):只读prompts_defaults.json,不读数据库生成管线绕过了 PromptManager
核心生成路径
AutoNovelGenerationWorkflow._build_prompt()(application/workflows/auto_novel_generation_workflow.py:862-911)完全硬编码,既不读 DB 也不读 JSON。托管模式、API 单章生成都走这个方法。经过排查,
prompts_defaults.json中注册的 34 个模板里,只有tension-scoring一个实际接入了 PromptManager。其他 33 个模板(包括用户在前端看到的说书人反AI版chapter-generation-main)都只是数据展示,并未真正影响生成。典型受影响模板与对应调用方
lifecycle-phase-directives 与 beat-focus-instructions 的特殊问题
这两个模板通过
PromptLoader从 JSON 文件读取_directives、_focus_instructions等下划线前缀的私有字段。即使把 PromptManager 接入 PromptLoader,这些私有字段在 DB schema 中也没有对应列(prompt_versions 表只有 system_prompt 和 user_template),用户在前端根本编辑不到。预期行为
用户在前端提示词广场编辑并激活的提示词版本,应当被所有生成路径读取并使用。
建议的修复方向
让
PromptManager.render(node_key, variables)成为所有生成服务读取提示词的统一入口,DB 有激活版本则用 DB 版本,否则降级到 JSON 种子在核心入口
AutoNovelGenerationWorkflow._build_prompt优先接入,再逐步扩展到 review / bible / planning / summary 等服务对于
lifecycle-phase-directives/beat-focus-instructions的私有字段存储问题,需要扩展prompt_versionsschema(新增extra_fields TEXT列存 JSON),或在前端屏蔽这两个模板的"可编辑"提示,避免用户误以为修改会生效如果方向获得认可,我可以按顺序提小 PR(每个 PR 只改一类服务 + 带测试),方便逐步 review。
版本
4773398 fix(global-llm-entry-button)