大家好,我是北平牧哥。
过去我们想学习一门技术时,需要在网上找教程来看。有许多教程网站会提供各种教程供人学习。在 AI 时代,我们可以借助大语言模型来帮我们生成任何你想学习的教程。
在这篇文章里,我将手把手教你用 Dify 来打造一个自动化教程生成工具。
我们的目标是只要输入一个你想学习的技术(例如:Python, MongoDB ),AI 工作流就能帮你产出一套完整的教学课程。
那么我们开始吧!
**设计思路**
我们总体的设计思路是:
1. 用户提供教程的名称后,首先生成课程大纲。
2. 把课程大纲进行结构化转换后,拆分成更细章节。
3. 迭代每一个章节,生成章节对应的课程内容。
4. 整合内容,输出完整教程。
*关于工作流*
工作流( Workflow )是一系列有序的任务、活动或者步骤,被设计用来完成特定的业务流程或者工作流程。通过将复杂任务拆分成较小的子任务(节点) ,降低了系统的复杂度。它可以把上述的设计思路具象化为一系列节点,从而实现我们的目标。
![image.png]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/47d9edcf88d44f42acd159b69923052f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=aeV3JAlvOqJ0I0P8R2gJwFydo%2FM%3D)
**操作步骤**
**开始**
工作流都是由从“开始”节点开始执行,在这里可以配置用户输入的变量。我们的例子中,需要配置的是用户需要的教程名称。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/93ee6455d8924988a8b63395b44cb406~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=lJb6scEkirzJHVS2VMekxUV2wWA%3D)
**生成课程大纲**
这一步需要使用 LLM 大模型进行生成,所以需要添加一个 LLM 模块。Dify 提供了一些免费的配额使用,这里我使用的是 o1-mini-2024-09-12 。
大模型生成内容质量的关键是提示词的设计,下图中的提示词可以作为一个参考。它要求大模型生成一个课程提纲,并且以 JSON 格式输出。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/3c637cc493aa41f2b211a55e7afe001c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=cLVitm0zh4grlsE1WdUxkc21zQ4%3D)
下面是其他可以使用的大模型列表
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/c817be37e8464e76a6490a44c16a812d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=TmDeFuSB11Wkf%2BoIioPnLijcbsQ%3D)
下图是一个生成结果示例
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/6d1fbfb31757402590908962041d21c8~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=qM4ArAuQU79GaNqVzY7dfSNsCVk%3D)
**数据结构化转换**
尽管是以 JSON 输出,大模型输出的并不是 JSON 对象而是 markdown 格式文本,并且前后带有`json ... `这样的 md 标识符。所以需要进行结构化处理。可以选择 Dify 的模板转换,我这里是用 [代码执行] 节点去处理,原因是模板转换需要用 Jina 编写解析模板,增加了学习曲线。而用代码则只要正则表达式处理一下就可以拿到 json 文本,再简单处理一下就可以了。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/d3126d78d98c46b4bbff70864382a8d3~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=KKuMnHJfkbMIo35E9XzJpzE3ZKI%3D)
经过这一步就把 LLM 返回的结构转换成按照小节为单位的数组,下一步就可以对每个小节进行迭代生成教程文章了。
**迭代生成教程文章**
这一步我们要加一个 [迭代] 节点,它可以把上一步输入的数组逐项代入进行操作。先看下整体迭代。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/4c142f84e9214d1a8f5b75b5cfe45bc0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=oSp1h6QPr0y7JdJXaoEzG6YlN7I%3D)
迭代器需要指定一个输入和一个输出变量,均为数组格式。
在 [转 OBJECT ] 节点里,我们需要把迭代传入的 item 对象做一下拆解转换,这样后续的工作流节点里才能更清晰地使用每一个变量,而不是只能拿到 item Object 。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/0ff6899ce4f44750babcdbfe71dd2558~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=NVAaiKTZsJDZckOFZWjh2uDP3fg%3D)
转换后输出 chapter, subtitle, title 三个变量。
**生成文章**
又要用到 LLM 了,同样也是配置提示词。这里就用到前面转换的变量了,通过把章节标题(title)和子标题(subtitle)带入进提示词,就可以迭代执行 LLM 生成文章内容。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/a056914d001b4587a7885e0130879730~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=0JMnFxsiJpsl%2FdWt5NM%2BeOAVW8s%3D)
**输出**
迭代完成后,添加 [结束] 节点,添加要输出的变量即可。
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/9d70ac3c07bd4f1eb7b2e3f3ce33278d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=cKt4oKO2PSkLTB%2BZs1GZGIvarSQ%3D)
***
以上就是整个工作流的核心流程,但输出的只是一个结构化数据,如果想使用还需要后续一些简单处理,这里不再赘述。整体流程执行过程如下:
![图片]( https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/fb68d410ce55454e9077925ffec45033~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5YyX5bmz54mn5ZOl:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMzc5MDc3MTgyMzA2MjM1OSJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1730704214&x-orig-sign=U%2Blo3eFvWKPqm%2BtSwBU4GjQxBbs%3D)
当然你也可以用这个思路建一个 Chat 流程,以对话的方式直接输出。
**总结**
你已经学会了如何使用 Dify 创建一个自动化教程生成工具。借助大语言模型的强大能力,我们可以高效地生成完整的教学内容,从大纲到每一章的具体细节,整个过程完全自动化。希望这个工具能够帮助你更轻松地创建高质量的教学资源,提升学习与分享的效率。
----- |
|