【1902】预先生成完整的树状PPT结构

摘要: 该系统采用树状结构设计个性化学习路径,包含预生成和用户使用两个阶段。预生成阶段利用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 → 答题 → 评分跳转 → 循环 → 生成报告
相关推荐
Sylvia-girl2 小时前
Lambda表达式
java·开发语言
Pluchon2 小时前
硅基计划4.0 算法 动态规划入门
java·数据结构·算法·动态规划
Java程序员威哥2 小时前
Java应用容器化最佳实践:Docker镜像构建+K8s滚动更新(生产级完整模板+避坑指南)
java·开发语言·后端·python·docker·kubernetes·c#
shjita2 小时前
mr-----topn的用法
java
深耕AI2 小时前
【wordpress系列教程】05 文章分类与标签
前端
小范馆2 小时前
C++ 编译方法对比:分步编译 vs 一步到位
java·开发语言·c++
ascarl20102 小时前
记录一下Nacos和XXLJOB修复漏洞
java
福娃筱欢2 小时前
通用机KESV8R2-3节点集群缩容为2节点
java·开发语言
LXMXHJ2 小时前
项目之html+javaScript
java·vue