基于 AI agent 的童话编剧与绘本生成器(六)故事 RAG 注入、出图多角色与语料自增长、CosyVoice 朗读与提示词/RAG 验收化
项目名称: AI 童话编剧与绘本生成器
本阶段时间: 2026 年 6 月 1 日 — 2026 年 6 月 7 日(第 14 周)
一、引言
继第五篇团队博客完成「出图 Prompt 双 LLM 编排、英文语料离线流水线、前端体验焕新与答辩交付闭环」之后,团队进入 知识库真正接入生成链路、出图侧多角色与 RAG 自增长、听书能力从占位到可用 与 提示词版本化 / RAG 可验收 并行的阶段。本期团队博客汇总四位成员本周个人博客成果,内容覆盖:
- 蒋宇宸:扩展故事 Schema 为 配角表 + 每页出镜名单,以
reconcile_story_cast()修补 LLM 漏登记;落地 出图 RAG(image_corpus.jsonl、每页正负例检索、向量+关键词混合、auto_harvest 自增长)与 纯文字冷启动灌库; - 黄子祺:将第五篇
corpus.jsonl接入 真实 LLM 生成链路——KnowledgeCorpusLoader加载、retrieve_for_story关键词打分与哈希兜底、reference_material注入 v5 模板,并与 rag_context 安全校验、运维开关形成闭环; - 黄荣涵:接入 DashScope CosyVoice TTS,补齐 Job narrating 阶段、按音色目录落盘与 按需合成;阅读页支持 音色切换、听故事模式与翻页自动联播,删书时同步清理音频资产;
- 李冰川:建立 提示词 v1→v5 版本管理体系(文件化模板 +
prompt_loader+STORY_PROMPT_VERSION),并推进 RAG 验收化——/rag/status与/rag/preview、中文主题 hint 映射、离线rag_benchmark.py与答辩对比文档。
四位成员分别从 出图精度与语料飞轮、故事侧 RAG 最后一公里、多模态听读体验、工程可配置与可测 四条轴线同时推进,推动项目从「语料文件就绪、出图能跑」向「故事有参考、画面有多角色与参考书、朗读可听、开关与版本可验可对比」演进,为后续 中文语料扩展、向量检索升级与答辩 A/B 实验 提供稳定挂载点。
二、蒋宇宸:多角色分镜、出图 RAG 与语料自增长
2.1 工作背景
第五篇双流架构解决了「分镜与出图 prompt 各说各话」与出图 LLM 编排,但仍存在三类缺口:Qwen 虽支持多角色,应用层只有主角一条 characters[];旁白写了配角却未进 supporting_cast,出图自然漏人;出图编剧仍是「裸调 LLM」,缺少与故事侧类似的 参考书与失败反例,语料也无法随成功出图自动积累。
2.2 方案设计
在第五篇链路上横向扩展两层结构:
用户创作参数
↓
【LLM 1】generation.py
→ supporting_cast + appearing_characters(每页最多 2 人)
→ reconcile_story_cast() 兜底
↓
【出图 RAG】每页检索 image_corpus.jsonl(正例 / 反例分离)
↓
【LLM 2】image_prompt_generation.py
→ rag_positive / rag_avoid → 出图 JSON
↓
【Qwen】generator.py → PNG + VL 重试
↓
【RAG 回流】auto_harvest → 语料自增长
2.3 关键实现
- 多角色 Schema:
StoryResultLLM.supporting_cast登记全书配角(含visual_design);StoryPageLLM.appearing_characters约束本页出镜名,最多 2 人。story_characters.py解析为 Qwen 所需的characters[](独立 id / prompt /face_enabled),参考图落data/character_refs/{story_id}/。 - 登记兜底:
reconcile_story_cast()扫描旁白/对白,发现 出现 ≥2 页的具名配角 补进 cast,并按页文案修复appearing_characters,避免「旁白有小蓝鸟、payload 只有主角」类断点。 - 出图 RAG:语料文件
image_corpus.jsonl;每页独立调用retrieve_for_image_prompt(positive / negative 模式);Prompt 硬约束参考成功范例、避开反例坑;按画风、角色数、年龄段、VL 分加权;指纹去重保留高分条目。 - 自动化运维:启动语料为空则 seed 模板;出图成功且 VL ≥ 阈值 →
auto_harvest写入;重试「先失败后成功」成对入库 bad/good。seed_image_corpus.py支持bulk/curated纯文字灌库(不调用 Qwen),冷启动规模可达 400+ 条。
2.4 问题与取舍
| 问题 | 处理思路 |
|---|---|
| LLM 漏登记配角 | Prompt 规则 + reconcile_story_cast 后处理双保险 |
| 全书共用第一页 RAG | 改为 每页单独检索,贴合当页 scene/action |
| 冷启动语料过少 | seed_image_corpus.py + 外部绘本风 curated 条目 |
| Agent 失败路径 | 出图 Agent 优先,失败才 fallback 规则层(非每页先跑规则) |
2.5 成果与总结
第六篇把第五篇「能出图」推进到 「能出多角色、有参考书、语料会自己长」:双角色页日志可见 👥 本页角色数量: 2,RAG 正负分离使出图 LLM 有结构可学。新增 story_characters.py、image_rag/、curated_prompts.py 等模块,与 generation.py、image_prompt_generation.py 形成完整飞轮。
三、黄子祺:故事 RAG 加载、检索注入与生成链路闭环
3.1 工作背景
第五篇已把 fairy_tales 打成 corpus.jsonl,但 仅有文件不会让模型自动变聪明——必须在 Chat 调用前完成:可靠加载、可控检索(Top-K / 字数上限)、契约稳定的 prompt 注入,且 mock 与 LLM 路径边界清晰,未配语料时不应拖垮演示。
3.2 方案设计
刻意 不把向量库绑在演示路径上:第一版用 英文 token 关键词打分 + SHA256 确定性兜底,保证纯中文请求也能拿到英文参考节选(结构启发为主);对外 API 与前端契约不变,后续仅替换 retrieve_for_story 内部实现即可。
3.3 关键实现
- 加载层:
KnowledgeCorpusLoader解析data_root()/knowledge/{corpus_filename};按行KnowledgeRecord校验,坏行 skip;进程内按 mtime 缓存,变更后load(force=True)自动刷新。 - 运维开关:
rag_enabled(默认 false)、rag_top_k、rag_max_context_chars、rag_max_excerpt_chars_per_record、rag_fallback_when_no_match等经settings/.env配置,避免未准备语料同学误以为生成异常。 - 检索策略:从 scene、protagonist、extra_prompt、interest_tags 等抽取 ≥3 字母英文 token;title/theme_tags 加权高于 body;不足 Top-K 时用请求内容哈希在语料数组上确定性跳跃取样;打
rag_retrievalINFO 日志(ids、scores、truncated_total)。 - 生成接入:
_reference_material_for_generation在 RAG 关闭或语料空时返回占位句;v5 模板显式写入 禁止抄袭/大段直译,输出语言仍服从{language};仅在 LangChain 就绪分支 执行检索与assert_text_safe(..., phase="rag_context"),避免 mock 路径反复读大文件。
3.4 问题与取舍
| 问题 | 解决方案 |
|---|---|
| 中文查询 vs 英文语料 | 关键词弱命中 + 哈希兜底;中文 hint 见李冰川篇 |
| 语料行损坏 | 单行 skip,不拖垮全库 |
| 参考文本触审核 | rag_context 与输入/输出同一套关键词审核 |
| 未来向量检索 | generation 只消费字符串块,retriever 可插拔替换 |
3.5 成果与总结
语料、开关、提示词、审核与日志形成 可部署、可观测 的闭环。价值不在于「检索有多准」,而在于 最后一公里边界清楚——mock 与 LLM 各走各的,RAG 开启后 reference_material 稳定进入编剧 Agent,为答辩开/关对比实验提供同一注入点。
四、黄荣涵:CosyVoice TTS、按需合成与阅读页听书体验
4.1 工作背景
此前 StoryPage.audio_url 虽指向 /api/v1/assets/audio/{story_id}/{页码}.mp3,磁盘无 MP3、assets.py 返回 404 占位;阅读页点击插图 audio.play() 静默失败——用户看得到「AI 朗读中」文案,却 听不到声音,听书能力处于「有 UI 无能力」状态。
4.2 方案设计
以 DashScope CosyVoice 为合成后端,统一 story_tts.py 入口;音频按 data/audio/{story_id}/{voice_id}/{页码}.mp3 落盘,支持 多音色目录缓存 + 按需合成——切换偏好不必重跑全书 Job;阅读页补齐 音色下拉、听故事模式、翻页自动联播。
4.3 关键实现
- 合成服务:
SpeechSynthesizer非流式call(),MP3 22050Hz mono;Key 回退链TTS_API_KEY → DASHSCOPE_API_KEY → IMAGE_API_KEY;默认音色longxiaochun_v2,占位值default-child-friendly自动映射。 - 音色目录:
tts_voices.py白名单(龙小春活泼童声、龙婉温柔女声、龙安阳沉稳男声等),每 ID 绑定对应 CosyVoice 模型版本,避免 voice/model 不匹配。 - API:
GET /api/v1/tts/voices返回列表与tts_configured;GET .../assets/audio/{story_id}/{page}.mp3?voice={id}读缓存,不存在则读 DB 取page.text现场合成再返回;voice 参数白名单校验,目录名防路径注入。 - 阅读页:音色偏好存
localStorage(storybook.ttsVoice);听故事模式开关(storybook.listenMode);renderPage结束自动playCurrentPage;当前页播完自动翻页续播;切换音色时若正在朗读则立即用新音色重播当前页。 - 资产清理:删书时
purge_story_image_assets扩展为同时删除data/audio/{story_id}/,保留 page_attempts 审计与 RAG 语料。
4.4 问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 占位 URL 无文件 | 按需合成 + 按音色分目录缓存 |
| 全书重跑换音色成本高 | 阅读时按页 lazy 合成 |
| 翻页听书断裂 | 听书模式 + onended 自动下一页 |
| 非法 voice 参数 | VOICE_CATALOG 白名单 + 目录名正则 |
4.5 成果与总结
TTS 从占位 URL 变为 可听、可选音色、可续播 的完整体验,与第五篇视觉焕新后的 reader.html 形成「看 + 听」闭环。CosyVoice 与出图共用 DashScope 账号,降低答辩环境配置成本。
五、李冰川:提示词版本管理与 RAG 验收化
5.1 工作背景
计划书要求 提示词可版本化、可对比,以及 RAG 可开关、可预览、可测命中率。此前 generation.py 内嵌长模板,RAG 虽已有语料与 retriever,但默认 RAG_ENABLED=false,且缺少 不调用 LLM 也能验 的工具,答辩难以填开/关对比表。
5.2 方案设计
- 提示词:v1(最小闭环)→ v5(RAG 参考块 + 防长文循环),每版独立 md 文件 + CHANGELOG;代码经
prompt_loader.load_story_prompt_template(version)加载,STORY_PROMPT_VERSION可配置。 - RAG 验收:新增 status/preview API;capabilities 自检增强;retriever 增加 中文主题 hint;离线 benchmark 脚本输出 Top-K 与命中数,写入
docs/rag-eval/。
5.3 关键实现
- 五版模板(
prompts/story/v1.md~v5.md):含相对上版变更说明与PROMPT_TEMPLATE_START/END间 LangChain 正文;v5 为当前默认,承载{reference_material}与防「第 9–12 页重复第 1–4 页」约束。 - 文档体系:
prompts/CHANGELOG.md、prompts/README.md、docs/prompt-eval/COMPARISON.md(答辩填表 + 截图模板)。 - RAG API:
GET /api/v1/rag/status返回语料路径、条数、开关、Top-K;POST /api/v1/rag/preview给定创作参数预览检索(无需 LLM),支持force_retrieve: true在 RAG 关闭时仍做对比实验。 - 检索改进:中文场景/兴趣映射英文 hint(如 森林→forest/fairy),提高 demo payload 对英文语料命中率;
rag_benchmark.py对固定样例输出 benchmark-results.json(如神秘森林 Top-3:ft_en_0060 等)。
5.4 问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 提示词改一处牵全身 | 文件化版本 + loader,generation 不再内嵌 |
| RAG 效果难证 | preview API + 离线 benchmark + REPORT/COMPARISON 文档 |
| 中文输入英文语料 | retriever hint 映射 + 黄子祺篇哈希兜底 |
| 答辩不知当前版本 | capabilities 返回 story_prompt_version 与可用列表 |
5.5 成果与总结
团队拥有 可 diff 的提示词演进史 与 零 LLM 成本的 RAG 预览/基准工具链,使「开 RAG 是否更好」从主观感受变为 可填表、可截图、可复跑 的验收项,与黄子祺篇注入点、蒋宇宸篇出图 RAG 形成故事侧 / 出图侧双轨可测结构。
六、团队共识与总结
本阶段(第 14 周),AI 童话绘本生成器团队在 知识注入、出图飞轮、听读体验、工程可验收 上取得同步进展:
- 故事 RAG 真正进 prompt:加载—检索—注入—审核—日志闭环,mock 与 LLM 路径分离,默认关、按需开,不破坏未配语料同学的演示。
- 出图从单角色到多角色 + 参考书:配角表、每页出镜、reconcile 兜底与 image_corpus 正负检索、auto_harvest 自增长,使画面人物与叙事一致、语料越用越厚。
- 多模态体验补齐:CosyVoice 按需合成 + 阅读页听书联播,产品从「能看绘本」延伸到「能听故事」。
- 版本与验收有据:提示词 v1→v5 文件化,RAG status/preview/benchmark 可独立验证,答辩对比实验有工具、有文档、有基准数字。
下一阶段计划: 推进 中文语料与 jieba 检索、向量检索 / rerank 替换关键词实现、创作进度 UI 与 narrating 阶段前端对齐、RAG 开/关与提示词 v4/v5 的 LLM 对比实验固化;并继续细化 imaging / narrating 在 Job 编排中的可观测性与超时策略。
团队成员个人博客
| 成员 | 主题 | 链接 |
|---|---|---|
| 黄子祺 | 故事 RAG:corpus 加载、检索与 reference_material 注入 | https://blog.csdn.net/2301_80232378/article/details/161167897 |
| 蒋宇宸 | 多角色分镜、出图 RAG 与语料自增长 | https://blog.csdn.net/yu_chen_xiang/article/details/161936276 |
| 黄荣涵 | CosyVoice TTS 与阅读页听书体验 | https://blog.csdn.net/2503_94171936/article/details/162142788 |
| 李冰川 | 提示词版本管理与 RAG 验收化 | https://blog.csdn.net/2403_82681167/article/details/162015465 |
更多推荐

所有评论(0)