questGenerator源码解析:Ontology Playground动态任务是如何生成的
【免费下载链接】Ontology-PlaygroundFree, open-source web app for learning about ontologies and Microsoft Fabric IQ. Explore a catalogue of pre-built ontologies, design your own visually, export as RDF/XML, and share interactive diagrams. Zero backend, fully static.项目地址: https://gitcode.com/GitHub_Trending/on/Ontology-Playground
Ontology Playground 是一个免费开源的本体(Ontology)学习工具,其 questGenerator 模块能够根据你加载的本体,自动"现场生成"一套个性化学习任务,让你无需阅读文档,跟着任务走就能学会一个新领域模型。本文带你读懂这套动态任务系统的生成机制、调用链路与质量保障。
为什么需要动态任务系统
打开 Ontology Playground,左侧就是Quests(任务)面板:点击 "Meet the Entities" 这样的任务,按步骤点击图中的实体和关系,完成后获得徽章与积分。
对于内置的 "Fourth Coffee" 咖啡本体,这些任务是手写好的(见 quests.ts)。但项目目录 catalogue/ 中收录了几十个不同领域的本体:电商、医疗、金融、大学、供应链……如果每个本体都手写任务,工作量无法接受。
这就是 questGenerator 要解决的问题:换一个本体,任务列表就自动变成一套新的、贴合该本体的教学任务。
任务与步骤的数据契约
动态任务能成立的前提,是任务被设计成"纯数据"。两个核心类型定义在 quests.ts 中:
| 类型 | 关键字段 | 作用 |
|---|---|---|
Quest | title、difficulty、category、steps、reward | 一个任务 = 标题 + 难度 + 步骤列表 + 奖励(徽章与积分) |
QuestStep | instruction、targetType、targetId、hint | 一个步骤 = 一句指令 + 指向某个实体/关系/属性/查询 |
正因为targetId精确指向本体中的具体元素,任务面板才能在你点击正确对象时判定"步骤完成"。而面板组件 QuestPanel.tsx 只负责渲染数据,完全不关心任务来自手写还是生成——这是数据驱动设计的典型收益。
生成引擎:6 种任务模板 × 触发条件
核心逻辑集中在 questGenerator.ts 的generateQuestsForOntology函数中:输入本体的entityTypes与relationships,输出一个Quest[]。
它不是"一次性生成固定任务",而是内置了6 种任务模板,每种模板都有各自的触发条件——本体结构越丰富,生成的任务越多:
| 任务 | 触发条件 | 难度 | 奖励 |
|---|---|---|---|
| Meet the Entities | ≥ 2 个实体 | beginner | 🎖️ Entity Explorer +100 |
| Relationship Navigator | ≥ 2 个关系 | intermediate | 🔗 Connection Master +200 |
| Find the Hub | 最连接的实体拥有 ≥ 2 条关系 | intermediate | 🔍 Hub Detective +200 |
| Property Detective | 存在属性数 ≥ 3 的实体 | intermediate | 📊 Data Scholar +250 |
| Query Explorer | 无条件(总是生成) | advanced | 🧙 Query Wizard +300 |
| The Full Journey | ≥ 3 个关系,且能找到 A→B→C 两段链 | advanced | 🗺️ Path Pioneer +350 |
几个有代表性的生成技巧:
- Find the Hub:先给每个实体统计"连接度"(有多少条关系以它为起点或终点),排序后找出"枢纽实体",再生成"找到它→探索它的关系"这样的侦探式任务(见 questGenerator.ts)。
- The Full Journey:遍历关系列表寻找"两段连续关系"组成的链路,把 A → B → C 的遍历路径编排成 5 个连贯步骤,教用户理解图遍历(见 questGenerator.ts)。
- Query Explorer:取前两个实体和第一条关系,动态拼出自然语言查询指令,例如 "How does Service connect to ConfigurationItem?",让查询任务的提示词也随本体变化。
文件末尾的getOntologyThemeIcon(questGenerator.ts)则根据本体名称返回主题图标(医疗→🏥、零售→🛒、金融→🏦 等),让界面风格也"随本体而变"。
调用链路:加载本体时即时生成
动态任务并非启动时算好,而是在每次加载本体时触发。状态管理 appStore.ts 中的loadOntology是关键触发点:
loadOntology(ontology) → generateQuestsForOntology(ontology) // 现算一套新任务 → set({ availableQuests: newQuests, completedQuests: [] })生成的任务写入availableQuests,由 QuestPanel 渲染;切换本体时完成记录同步清空,积分进度从头开始。默认启动时则使用手写的 Fourth Coffee 任务集作为初始值。
质量保障:测试保证"每个任务步骤都有效"
动态生成的最大风险是产生"幽灵步骤"——指令让你点击一个本体里根本不存在的实体。项目用两层测试把风险关进笼子:
- 完整性测试questIntegrity.test.ts:读取编译后的目录数据,对每一个目录本体都跑一遍
generateQuestsForOntology,再校验每个步骤的targetId确实指向存在的实体或关系,属性步骤还要求前面有对应的实体步骤。 - 查询引擎联动测试questGenerator.test.ts:借助 questQueryValidator.ts 把任务中引号内的自然语言查询真实喂给查询引擎
processQuery,确保生成的查询不是"问得出但答不出"的废话。
相关文件速查
| 文件 | 职责 |
|---|---|
| src/data/questGenerator.ts | 动态任务生成引擎(6 种模板) |
| src/data/quests.ts | 任务类型定义 + 默认 Fourth Coffee 任务 |
| src/store/appStore.ts | 加载本体时触发任务生成 |
| src/components/QuestPanel.tsx | 任务面板 UI 渲染 |
| src/data/questQueryValidator.ts | 查询类步骤的校验器 |
| src/data/questIntegrity.test.ts | 全目录本体的任务完整性回归测试 |
总结
questGenerator 的设计可以概括为三点:数据驱动(任务是纯数据结构,与渲染解耦)、模板 + 条件(6 种任务模板按本体结构动态裁剪,繁简自适应)、测试闭环(用真实查询引擎和全量目录数据回归验证)。这套"根据当前内容现生成学习内容"的思路,对学习工具类产品做个性化引导非常有参考价值。
【免费下载链接】Ontology-PlaygroundFree, open-source web app for learning about ontologies and Microsoft Fabric IQ. Explore a catalogue of pre-built ontologies, design your own visually, export as RDF/XML, and share interactive diagrams. Zero backend, fully static.项目地址: https://gitcode.com/GitHub_Trending/on/Ontology-Playground
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考