Appearance
Dify工作流 - 长篇文章生成上篇
如需转载,请联系微信群主
通过上一篇Dify工作流入门,我们创建了一个客户评价处理的工作流
应用,学习了开始
、结束
、问题分类器
、HTTP请求
、变量聚合器
节点如何使用。
这一节我们再去创建一个长篇文章生成工作流
应用去学习更多的Dify
工作流节点,包括LLM
、代码执行
、迭代
节点。
需求
用户输入文章标题
和文章各个一级章节
,让长篇文章生成工作流
生成更多的子章节
,并最终输出一篇具有吸引力的长文
。😎
创建Workflow
重要节点
开始
开始节点定义了title(文章标题)
、chapter(文章一级章节)
输入变量。
LLM
LLM提示词
提示词中定义了角色
、技能
、目标
、限制
和输出示例
,让LLM
严格按照意图来输出文本。
这个LLM
节点的作用是根据用户输入的文章标题
和各章节名称
,生成各个章节下的子章节
,丰富文章章节结构,并且以json
格式输出,供下一个代码执行节点使用。
注意
这里注意使用GLM-4
模型,将提示词设置在USER
中,如果设置在SYSTEM
中,运行该LLM
节点会报错,这和Dify
调用GLM
大模型的方式有关。如果换成GPT-4o
,设置在SYSTEM
中即可。
提示词Prompt
## 角色:文章撰写专家
## 技能:
你根据用户输入的文章标题/title和各章节名称/chapter,生成各个章节下的子章节。
## 目标:
- 确保生成的每个子章节和父章节紧密相关。
- 纵观整体章节,必须保证各章节过渡连贯流畅。
- 最终输出json字符串,详细请看以下输出示例。
## 限制:
- 输出的json字符串必须是标准json字符串,不要包含任何XML标签和转义字符,如`\n`。
- 严重按照输出示例中的例子输出json字符串,不要输出其他任何文本。
## 输出示例:
[ { "chapter": "引言", "subchapter": "1. 气候变化对沿海城市影响的概述 2. 理解这些影响的重要性" }, { "chapter": "海平面上升", "subchapter": "1. 海平面上升的原因 2. 对沿海基础设施和社区的影响 3. 受影响城市的例子" }, { "chapter": "风暴频率增加", "subchapter": "1. 气候变化与风暴频率的关联 2. 更频繁和严重的风暴对沿海地区的影响 3. 最近风暴的案例研究" }, { "chapter": "结论", "subchapter": "1. 关键点总结 2. 应对气候变化的紧迫性 3. 对政策制定者和社区的行动呼吁" } ]
代码执行
代码节点支持运行 Python / NodeJS
代码以在工作流程中执行数据转换。它可以简化您的工作流程,适用于Arithmetic
、JSON transform
、文本处理
等情景。
该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的 Python
或 Javascript
脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并撰写相应的执行代码。
json
解析
本小节中使用Python3
代码,代码执行节点解析输入的json
字符串,输出Array[Object]
变量,供下一个迭代
节点使用。
json解析代码:
def main(arg1: str) -> dict:
import json
data = json.loads(arg1)
# Create an array of objects
result = [{'chapter': item["chapter"], 'subchapter': item["subchapter"]} for item in data]
return {
'result': result
}
输入json字符串:
[{"chapter": "1. 关于评价的故事","subchapter": "1. 认识自我与外界评价的差异 2. 庄子与惠子对话的启示 3. 从评价中解脱,找回内心的平和"},{"chapter": "2. 关于得失的故事","subchapter": "1. 得失之间的辩证关系 2. 庄子丧妻的从容态度 3. 从得失观照人生,学会释然"},{"chapter": "3. 关于困境的故事","subchapter": "1. 面对困境的心态调整 2. 庄子与监河侯的对话寓意 3. 突破困境,实现自我成长"},{"chapter": "4. 关于选择的故事","subchapter": "1. 选择与命运的关系 2. 庄子拒绝做官的智慧 3. 做出明智选择,活出精彩人生"},{"chapter": "5. 关于心态的故事","subchapter": "1. 心态决定人生高度 2. 庄子与蝴蝶的故事启示 3. 调整心态,战胜精神内耗"}]
输出Array[Object]变量:
{
"result": [
{
"chapter": "1. 关于评价的故事",
"subchapter": "1. 认识自我与外界评价的差异 2. 庄子与惠子对话的启示 3. 从评价中解脱,找回内心的平和"
},
{
"chapter": "2. 关于得失的故事",
"subchapter": "1. 得失之间的辩证关系 2. 庄子丧妻的从容态度 3. 从得失观照人生,学会释然"
},
{
"chapter": "3. 关于困境的故事",
"subchapter": "1. 面对困境的心态调整 2. 庄子与监河侯的对话寓意 3. 突破困境,实现自我成长"
},
{
"chapter": "4. 关于选择的故事",
"subchapter": "1. 选择与命运的关系 2. 庄子拒绝做官的智慧 3. 做出明智选择,活出精彩人生"
},
{
"chapter": "5. 关于心态的故事",
"subchapter": "1. 心态决定人生高度 2. 庄子与蝴蝶的故事启示 3. 调整心态,战胜精神内耗"
}
]
}
除了上面讲到的使用代码节点进行json
解析,支持一切代码能够实现的流程。比如数学计算
、拼接数据
等。
数学计算
当工作流中需要进行一些复杂的数学计算时,也可以使用代码节点。例如,计算一个复杂的数学公式,或者对数据进行一些统计分析。下面是一个简单的例子,它计算了一个数组的平方差:
def main(x: list) -> float:
return {
# 注意在输出变量中声明result
'result' : sum([(i - sum(x) / len(x)) ** 2 for i in x]) / len(x)
}
拼接数据
有时,也许您需要拼接多个数据源,如多个知识检索、数据搜索、API调用等,代码节点可以帮助您将这些数据源整合在一起。下面是一个简单的例子,它将两个知识库的数据合并在一起:
def main(knowledge1: list, knowledge2: list) -> list:
return {
# 注意在输出变量中声明result
'result': knowledge1 + knowledge2
}
除了Python3内置的json库之外,Dify还提供了3个高级的依赖库:
如果你需要使用的除以上高级依赖库外的其他库,你可以使用HTTP请求
节点,在自己的服务端代码中随意使用第三方库。
演示
我们将在下一篇Dify
工作流 - 长篇文章生成下篇中继续介绍迭代节点
,循环迭代每一个章节,使用LLM
形成最后完整的文章。😎
如需转载,请联系微信群主
加群:
扫描下方二维码加好友,添加申请填写“ai加群”,成功添加后,回复“ai加群”或耐心等待管理员邀请你入群