从词库到故事:LingualSpark AI 故事生成模块的设计思路与阶段进展
从词库到故事:LingualSpark AI 故事生成模块的设计思路与阶段进展
本文重点记录设计思路、创新点、阶段成果和后续计划。更细的接口、数据结构、文件路径和实现细节。
写在前面
LingualSpark 是一个面向不同年龄段用户的智能外语学习平台。相比传统“背单词 + 查释义”的学习方式,我们希望让词汇真正进入语境,让不同年龄段的学习者可以在故事中理解单词、复习表达、完成阅读理解。
因此,AI 故事生成模块的目标不是简单地“让大模型写一篇故事”,而是把用户画像、年龄段分级、词库数据、故事结构和学习反馈连接起来,形成一个更接近语言学习产品的生成式阅读体验。
这个模块目前已经支持:
- 按年龄段生成不同难度的故事
- 根据用户兴趣生成个性化内容
- 自动融入词库中的学习词汇
- 支持中文、英文和中英文混合主题
- 使用虚构主角,避免把用户名写进故事
- 流式输出故事正文和生成过程
为什么要做故事生成
在语言学习里,单词如果只停留在“英汉对照”,很容易学得快、忘得也快。真正能帮助记忆的是语境。
例如学习apple,如果只看到:
apple: 苹果学习效果是有限的。但如果它出现在一个故事里:
Milo saw a red apple fall from the tree.学习者就能同时感知单词、动作、场景和因果关系。
故事生成模块的核心价值就在这里:
- 把孤立词汇放进上下文
- 把年龄段差异体现在语言难度里
- 把用户兴趣转化成阅读动机
- 把 AI 生成结果转化成可学习内容
生成效果的展示:
一开始遇到的问题
最初版本能生成故事,但很快暴露出几个问题。
第一个问题是生成结果重复。多次点击生成,故事结构几乎不变。这说明系统没有真正把随机性、主题变化和词库变化用起来,部分情况下还会走本地兜底模板。
第二个问题是主角用了用户名字。比如登录用户是admin,故事里就出现Admin walked...。这不仅不自然,也不适合真实产品。用户账号不应该直接进入故事正文。
第三个问题是中文主题处理不鲁棒。用户输入“牛顿的故事”时,早期标题可能变成:
A Small Brave Step Toward 牛顿的故事这样的标题既不像英文故事,也暴露出系统只是简单拼接字符串,而不是理解主题语义。
第四个问题是生成过程不透明。用户点击“生成故事”后,只能看到按钮停在“生成中”,不知道系统是在选词、写大纲、调用模型,还是已经卡住。
核心思路
这个模块没有把所有事情塞进一个 Prompt,而是拆成多个阶段。
可以把它理解成一条故事生产流水线:
用户输入主题 ↓ 分析年龄段和兴趣 ↓ 选择适合的词汇 ↓ 规划故事大纲 ↓ 生成故事正文 ↓ 生成学习摘要和问题 ↓ 整理最终学习卡片这样设计的好处是,每个阶段职责清楚,也方便后续扩展。例如以后要加入内容安全检查、语法难度评估、用户历史学习记录,都可以作为新的节点加入。
项目中使用 LangGraph 来表达这条流程。LangGraph 的价值在于,它可以把“生成故事”从一次函数调用变成一个有状态的多阶段过程。每个节点读写同一个故事状态,最终产出完整结果。
个性化实现
- UI展示:
当前个性化主要来自四个方面。
第一是年龄段。
系统根据用户的年龄段,将阅读难度分成幼儿启蒙、小学、初高中、大学/大学以上。不同年龄段对应不同的阅读等级、写作风格和词库范围。
例如幼儿启蒙阶段更适合:
- 短句
- 简单动作
- 重复词汇
- 温暖、具体、低抽象度的故事
大学/大学以上阶段则可以使用:
- 更自然的英文
- 更复杂的情绪表达
- 更高阶的词汇
- 更接近真实生活或职场语境的内容
第二是兴趣偏好。
用户可以输入“喜欢太空、音乐、温暖治愈的故事”这样的偏好。系统不会把它当作硬标签,而是作为故事风格的参考,让模型在情节和表达上更贴近用户兴趣。
第三是词库难度。
项目中已经有英语词库和释义数据。故事生成模块会根据年龄段选择对应难度的词,并尝试把这些词自然融入故事。
第四是用户指定词。
如果用户特别想练习某几个词,例如:
apple, brave, journey这些词会优先进入故事上下文。
实现亮点一:词库驱动的故事生成
很多故事生成只是“输入主题,输出故事”。LingualSpark 的不同点是,它不是完全依赖模型自由发挥,而是把已有词库作为生成约束。
这样做有三个好处。
第一,故事和学习目标绑定。故事不只是娱乐文本,而是为了帮助学习者学习复习词汇。
第二,词汇难度可控。不同年龄段不会随机拿到过难或过简单的词。
第三,后续可以接入学习记录。比如用户已经学过哪些词、哪些词经常错、哪些词需要复习,都可以反向驱动故事生成。
也就是说,故事生成模块未来可以成为一个“语境化复习引擎”。
实现亮点二:可解释的流式生成
- UI展示
如果用户点击按钮,只看到“生成中”,不知道系统在干什么。
因此模块加入了流式输出。
前端会陆续显示:
- 正在分析用户年龄段和兴趣
- 正在选择学习词汇
- 正在生成故事大纲
- 正在写作正文
- 正在整理学习摘要
正文也会一段段出现,而不是等全部生成完才显示。
强调:我们展示的是“可解释生成过程”,不是模型内部隐藏思维链。
换句话说,页面展示的是系统阶段和过程摘要,例如“为什么选择这些词”“故事大纲是什么”。这样能让用户理解 AI 在做什么。
技术路线概览
整个模块可以分成四层。
第一层是前端交互层。
用户在故事页面输入主题、兴趣偏好、故事类型、目标词数和指定单词。点击生成后,页面通过流式请求读取后端事件,并实时更新故事正文和生成过程。
第二层是接口层。
后端提供普通生成接口和流式生成接口。普通接口适合测试和一次性返回;流式接口适合真实用户体验。
第三层是编排层。
LangGraph 将故事生成拆分成多个节点,包括画像分析、词汇策展、大纲规划、故事写作、学习讲解和结果整理。
第四层是模型与数据层。
LangChain 负责调用兼容 OpenAI 协议的大模型服务,数据库词库提供可控学习词汇,用户表提供年龄段信息。
当前项目进度
目前已经完成的功能包括:
- 故事生成页面
- 普通故事生成接口
- 流式故事生成接口
- 年龄段分级策略
- 词库随机抽取
- 用户指定词优先融入
- LangChain 模型调用
- LangGraph 多阶段编排
- 生成过程展示
- 中文、英文、中英文混合主题支持
- 虚构主角生成
- 模型调用超时控制
- AI 失败后的本地兜底
现在已经可以完成一次较完整的生成过程:
输入主题 → 选择词汇 → 生成大纲 → 流式输出故事 → 展示学习摘要和问题从工程结构上看,模块已经从“单接口调用大模型”升级为“可扩展的生成式学习流程”。
目前还存在的不足
第一,本地兜底故事质量仍然有限。
兜底逻辑主要是为了保证功能可用,不能替代真实大模型生成。它适合开发、调试和异常降级,但不适合作为最终故事质量标准。
第二,学习记录还没有真正参与生成。
当前模块主要使用年龄段和词库难度。未来如果能结合用户已学词、错词、复习周期,故事会更有学习价值。
第三,安全审阅还比较轻量。
目前更多依赖 Prompt 中的适龄要求和最终结构整理。后续可以增加更独立的内容审核节点。
第四,阅读等级还没有自动评估。
现在的阅读等级来自年龄段映射。未来可以对生成文本做词汇难度、句长、语法复杂度分析,给出更准确的分级结果。
第五,流式生成还可以增加取消功能。当前页面可以等待流式输出,但用户主动取消一次生成的体验还可以继续优化。
下一步计划
第一个方向是学习闭环。
让故事生成不仅服务阅读,还服务复习。比如系统自动挑选用户薄弱词,把它们融入故事,再通过理解问题检查掌握情况。
第二个方向是多模态体验。
故事生成后可以继续生成朗读音频、插图提示词、跟读练习和口语问答,让故事变成一套完整的学习材料。
第三个方向是故事生成保存。
每次生成的故事可以保存到用户故事库,支持收藏、重读、复习、改写和续写。这样 AI 生成就不只是一次性输出,而是成为用户学习轨迹的一部分。
体会
做这个模块最大的感受是:AI 功能真正落进项目时,难点往往不在“调通模型”,而在“把模型放进产品流程里”。
一个可用的 AI 故事生成模块,至少需要考虑:
- 用户是谁
- 适合什么难度
- 要练哪些词
- 输入主题是否规范
- 输出是否适龄
- 等待过程是否可见
- 失败时能不能降级
- 结果能不能继续用于学习
LingualSpark 的故事生成模块目前还要继续优化,但它已经搭起了一个不错的基础:添加词库约束,利用年龄段控制难度,实现多阶段编排。
