摘要: 该系统采用树状结构设计个性化学习路径,包含预生成和用户使用两个阶段。预生成阶段利用LLM自动生成3层树状PPT内容(共40个节点),每个节点包含Slide和3道测试题(难度分A/B/C三级)。用户使用时根据答题正确率(0-1题→C分支,2题→B分支,3题→A分支)动态跳转对应难度节点,形成个性化学习路径直至叶子节点,最终生成学习报告。系统通过代码构建完整树状结构,实现内容难度梯度与用户表现的智能匹配。
用户使用阶段
预生成阶段
3题全对
答对2题
答对0-1题
未结束
已到叶子节点
开始
用户输入学习主题和深度
LLM: 生成根节点Slide0
LLM: 生成3道测试题
LLM: 生成Level1-A
高级内容
LLM: 生成Level1-B
标准内容
LLM: 生成Level1-C
巩固内容
生成L1-A的3道题
生成L1-B的3道题
生成L1-C的3道题
生成Level2所有节点
9个分支
为每个L2节点生成测试题
生成Level3所有节点
27个分支
构建完整树状结构
导出为PPT文件
显示当前Slide
显示3道测试题
用户答题
计算得分
答对3题→A分支
答对2题→B分支
答对0-1题→C分支
跳转到对应子节点
是否到达叶子节点
显示学习路径报告
结束
阶段一:预生成完整树状结构
1. 开始节点
yaml
输入变量:
- topic (文本): 学习主题,如"Python函数式编程"
- max_depth (数字): 树的深度,默认3
2. 计算节点数量
节点类型:代码执行
python
def main(max_depth):
# 计算需要生成的总节点数
# Level 0: 1个节点
# Level 1: 3个节点 (A, B, C)
# Level 2: 9个节点 (每个L1节点派生3个)
# Level 3: 27个节点
total_nodes = sum(3**i for i in range(max_depth + 1))
return {
"total_nodes": total_nodes,
"structure": {
0: 1,
1: 3,
2: 9,
3: 27
}
}
3. 循环节点:生成所有Slide
节点类型:迭代器(Iteration)
迭代配置:
yaml
迭代次数: {{total_nodes}}
并行执行: True (加速生成)
子节点:LLM生成Slide内容
你是教学内容设计专家。生成一页PPT内容。
学习主题:{{topic}}
当前节点ID:{{node_id}}
节点层级:{{level}}
节点类型:{{branch_type}}
父节点内容:{{parent_content}}
节点类型说明:
- A类型:高级拓展(假设用户全对3题,理解优秀)
- B类型:标准深化(假设用户答对2题,理解良好)
- C类型:基础巩固(假设用户答对0-1题,需要加强)
要求:
1. 内容与父节点衔接
2. 难度匹配节点类型
3. 包含3-5个要点
输出格式(严格JSON):
{
"node_id": "L{{level}}_{{branch_type}}",
"title": "Slide标题",
"content": [
"要点1",
"要点2",
"要点3"
],
"key_concept": "核心概念"
}
4. 循环节点:为每个Slide生成测试题
节点类型:迭代器
LLM Prompt:
基于以下Slide内容,生成恰好3道单选题:
Slide内容:
{{slide_content}}
要求:
1. 恰好3道题
2. 难度递进:简单→中等→困难
3. 每题4个选项
4. 明确标注正确答案
输出格式(严格JSON):
{
"node_id": "{{node_id}}",
"questions": [
{
"id": 1,
"question": "题目1(简单)",
"options": {
"A": "选项A",
"B": "选项B",
"C": "选项C",
"D": "选项D"
},
"correct": "B"
},
{
"id": 2,
"question": "题目2(中等)",
"options": {...},
"correct": "C"
},
{
"id": 3,
"question": "题目3(困难)",
"options": {...},
"correct": "A"
}
]
}
5. 代码节点:构建树状结构
节点类型:代码执行
python
def main(all_slides, all_quizzes):
"""
构建完整的树状PPT结构
"""
tree = {
"root": {
"id": "L0_root",
"slide": all_slides[0],
"quiz": all_quizzes[0],
"children": {
"A": None, # 3题全对
"B": None, # 答对2题
"C": None # 答对0-1题
}
}
}
# 递归构建树
def build_branch(node_id, level, max_depth):
if level >= max_depth:
return None
# 找到对应的slide和quiz
slide = find_slide_by_id(node_id, all_slides)
quiz = find_quiz_by_id(node_id, all_quizzes)
return {
"id": node_id,
"level": level,
"slide": slide,
"quiz": quiz,
"children": {
"A": build_branch(f"{node_id}_A", level+1, max_depth),
"B": build_branch(f"{node_id}_B", level+1, max_depth),
"C": build_branch(f"{node_id}_C", level+1, max_depth)
}
}
# 构建三个主分支
tree["root"]["children"]["A"] = build_branch("L1_A", 1, max_depth)
tree["root"]["children"]["B"] = build_branch("L1_B", 1, max_depth)
tree["root"]["children"]["C"] = build_branch("L1_C", 1, max_depth)
return {
"tree_structure": tree,
"total_nodes": len(all_slides),
"max_paths": 3 ** max_depth
}
6. LLM节点:生成PPT文件
Prompt:
将以下树状结构转换为PowerPoint可用的格式:
树状结构:
{{tree_structure}}
要求:
1. 每个节点生成一页PPT
2. 使用Marp Markdown格式
3. 在每页底部注明节点路径
4. 添加导航说明
输出格式:Marp Markdown
7. HTTP节点:调用PPT生成服务(可选)
节点类型:HTTP Request
yaml
Method: POST
URL: https://your-ppt-service.com/generate
Body:
markdown: {{ppt_markdown}}
theme: default
Response: PPT文件下载链接
8. 存储节点:保存树状结构
节点类型:变量赋值
yaml
保存变量:
- ppt_tree: {{tree_structure}}
- current_node: "root"
- user_path: []
- download_url: {{ppt_download_url}}
阶段二:用户交互流程(另一个Workflow)
1. 开始节点
yaml
输入:
- session_id: 会话ID
- ppt_tree: 从预生成阶段加载的树状结构
2. 显示当前Slide
节点类型:模板
当前节点:{{current_node.id}}
路径:{{user_path}}
# {{current_node.slide.title}}
{{current_node.slide.content}}
核心概念:{{current_node.slide.key_concept}}
3. 显示测试题
节点类型:问题节点
yaml
展示内容:
题目1: {{current_node.quiz.questions[0]}}
题目2: {{current_node.quiz.questions[1]}}
题目3: {{current_node.quiz.questions[2]}}
输入格式: "A,B,C" 或 "A B C"
变量名: user_answers
4. 代码节点:计算得分
节点类型:代码执行
python
def main(user_answers, quiz):
"""
简化评分:
- 3题全对 → A分支
- 答对2题 → B分支
- 答对0-1题 → C分支
"""
# 解析用户答案
answers = [a.strip().upper() for a in user_answers.replace(',', ' ').split()]
if len(answers) != 3:
return {"error": "请提供3个答案"}
# 计算正确数量
correct_count = 0
correct_answers = [q["correct"] for q in quiz["questions"]]
for i in range(3):
if answers[i] == correct_answers[i]:
correct_count += 1
# 确定分支
if correct_count == 3:
branch = "A"
message = "全部正确!进入高级内容"
elif correct_count == 2:
branch = "B"
message = "答对2题,进入标准内容"
else:
branch = "C"
message = f"答对{correct_count}题,需要巩固基础"
return {
"correct_count": correct_count,
"next_branch": branch,
"message": message,
"details": [
{"question": i+1, "your_answer": answers[i],
"correct_answer": correct_answers[i],
"is_correct": answers[i] == correct_answers[i]}
for i in range(3)
]
}
5. 代码节点:更新当前节点
python
def main(current_node, next_branch, user_path, ppt_tree):
"""
根据分支跳转到子节点
"""
# 获取下一个节点
next_node = current_node["children"][next_branch]
# 更新路径
user_path.append(next_branch)
# 检查是否到达叶子节点
is_end = (next_node is None or
next_node["children"]["A"] is None)
return {
"current_node": next_node,
"user_path": user_path,
"is_end": is_end,
"path_string": " → ".join(user_path)
}
6. 条件分支:是否继续
节点类型:IF/ELSE
yaml
条件: {{is_end}} == False
True → 返回到"显示当前Slide"节点
False → 进入"生成学习报告"节点
7. LLM节点:生成学习报告
用户完成了学习!
学习路径:{{path_string}}
总共学习:{{user_path.length + 1}} 页内容
请生成一份学习总结:
1. 路径可视化(树状图)
2. 知识点掌握分析
3. 学习建议
树状结构参考:
{{ppt_tree}}
树状结构示例(3层深度)
Level 0 (根节点)
│
├─ 3题全对 → Level 1-A (高级)
│ ├─ 3题全对 → Level 2-AA
│ ├─ 答对2题 → Level 2-AB
│ └─ 答对0-1题 → Level 2-AC
│
├─ 答对2题 → Level 1-B (标准)
│ ├─ 3题全对 → Level 2-BA
│ ├─ 答对2题 → Level 2-BB
│ └─ 答对0-1题 → Level 2-BC
│
└─ 答对0-1题 → Level 1-C (巩固)
├─ 3题全对 → Level 2-CA
├─ 答对2题 → Level 2-CB
└─ 答对0-1题 → Level 2-CC
总节点数:
- Level 0: 1个
- Level 1: 3个
- Level 2: 9个
- 总计:13个节点(深度为2时)
Dify中的实际操作
创建两个工作流:
Workflow 1: "PPT预生成器"
- 输入主题 → 生成所有节点 → 导出PPT → 保存树状结构
Workflow 2: "交互式学习"
- 加载PPT树 → 显示Slide → 答题 → 评分跳转 → 循环 → 生成报告