Dify工作流 - 长篇文章生成操作手册
需求:用户输入文章标题和文章各个一级章节,让长篇文章生成工作流生成更多的子章节,并最终输出一篇具有吸引力的长文。该原理可应用于撰写标书大纲。
长篇文章生成
- 创建Workflow
从工作室开始,新建应用,选择工作流类型:
- 开始节点
开始节点定义输入变量:title(文章标题)、chapter(文章一级章节)。
- LLM节点与提示词
新建LLM节点,选择大模型之后,在提示词输入框(USER或者System)中填入提示词:
提示词中定义了角色、技能、目标、限制和输出示例,让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. 对政策制定者和社区的行动呼吁" } ][ { "chapter": "引言", "subchapter": "1. 气候变化对沿海城市影响的概述 2. 理解这些影响的重要性" }, { "chapter": "海平面上升", "subchapter": "1. 海平面上升的原因 2. 对沿海基础设施和社区的影响 3. 受影响城市的例子" }, { "chapter": "风暴频率增加", "subchapter": "1. 气候变化与风暴频率的关联 2. 更频繁和严重的风暴对沿海地区的影响 3. 最近风暴的案例研究" }, { "chapter": "结论", "subchapter": "1. 关键点总结 2. 应对气候变化的紧迫性 3. 对政策制定者和社区的行动呼吁" } ]- 代码执行节点
在LLM节点后添加代码执行节点,代码节点支持运行 Python / NodeJS 代码,用来在工作流程中执行数据转换。它可以简化工作流程,适用于Arithmetic、JSON transform、文本处理等情景。
该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的 Python 或 Javascript 脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并撰写相应的执行代码。
本小节中使用Python3代码,代码执行节点解析输入的json字符串,输出Array[Object]变量,供下一个迭代节点使用。
代码示例如下:
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
}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
}注意输入变量是一个String类型,输出变量为Array类型。
- 迭代节点
在代码节点后添加迭代节点,上一个代码执行节点输出Array[Object]变量。在迭代节点循环上一个节点输出的Array[Object]变量,取出其中每一个Object,Object示例如下:
{
"chapter": "1. 关于评价的故事",
"subchapter": "1. 认识自我与外界评价的差异 2. 庄子与惠子对话的启示 3. 从评价中解脱,找回内心的平和"
}{
"chapter": "1. 关于评价的故事",
"subchapter": "1. 认识自我与外界评价的差异 2. 庄子与惠子对话的启示 3. 从评价中解脱,找回内心的平和"
}一个Object代表了一个章节(包含父章节和各个子章节)。因为包含5个章节,所以迭代节点循环迭代5次,根据每一个Object生成章节的详细内容,如何生成?在迭代节点中嵌套LLM节点,使用LLM节点编写每一个章节的具体内容。
嵌套的LLM节点中,在SYSTEM和USER中都分别编写了提示词Prompt。
每一个LLM节点输出的都是String类型的Text文本。所以最终迭代节点输出的就是Array[String]数组,这是一个包含每个章节详细内容的数组。
根据迭代节点的输出结果,新建一个代码节点,仅仅需要将Array[String]中每一个String取出并用换行符\n拼接就能形成最终的长篇文章Text String。
代码示例:
def main(articleSections: list):
Data = articleSections6
Return {
"result ": "\n".join(data)
}def main(articleSections: list):
Data = articleSections6
Return {
"result ": "\n".join(data)
}技术标书生成
已有条件:
- 招标文件
- 投标标书目录大纲
- 公司已有的技术或方案(从以往的技术标书中使用Workflow单独分批章节提取)
整体思路
- 拆解目录:将投标标书的目录大纲拆分为多个章节,每个章节的内容目标明确。
- 分步生成:对每个章节单独生成内容,利用招标文件和公司技术架构的内容,结合指定的生成规则。
- 内容拼接和优化:将生成的内容合并为最终的完整标书,并进行整体排版和优化。
详细步骤
- 拆解标书目录大纲
将现成的标书的目录大纲分解为多个章节,用来分批生成技术标书内容。
- 创建章节生成Prompt模板
为每个章节创建一个Prompt模板,确保生成内容符合标书的规范要求。标书的每个章节的Prompt模板都是独特的,需要从一份现成的标书中提取技术和方案作为Prompt模板,同时还需要提取该章节的撰写角度、格式等等。
- 构建 Dify 工作流思路
针对每个章节,调用 ChatGPT 的生成接口,输入相应的Prompt模板、招标文件上传、章节标题这三个输入变量。
每次生成内容限制在合理的字数范围(2000-3000字),按章节和该章节的要求(Prompt模板)逐步生成。
将所有章节内容整合成完整的投标标书。
增加统一的开头、目录页、格式化结尾等内容。
优化内容逻辑,确保一致性和连贯性。
- 自动化实现
在 Dify 中,设置一个多步骤工作流:
- 第一步:输入和预处理
- 用户上传招标文件、技术架构文档、目录大纲。
- 自动提取招标文件需求和技术架构的关键内容。
- 第二步:分章节生成
- 按章节顺序,调用生成模型,并保存每个章节的结果。
- 第三步:合并优化
- 合并章节内容,生成完整标书文档。
- 输出最终的标书(如 Word 或 PDF)。
示例工具链
- 招标文件关键点提取:可以用一个Prompt专门提取招标文件中的需求点。
- 技术架构提炼:从技术文档中抽取与每个章节相关的内容。 技术和方案提炼AI提示词:
角色:
技术标书提炼专家
技能:
你根据用户输入的技术标书的部分段落{变量},对这个段落的内容进行分析、提取、洞察、并提炼关键信息, 从撰写标书的角度考虑,精炼这个章节的技术或者方案,有技术就生成技术名词,有方案就生成简短的方案,技术名词要简短,方案要简短。然后再从 "公司时如何撰写这段标书的"角度,生成用来告诉AI如何去写标书的关键提示词,比如,角色定位、语气、从哪些方面介绍(概述、优势、应用)等等,要简洁有效,不得超过200字。 ## 目标: - 确保生成的每个子章节和父章节紧密相关。 - 纵观整体章节,必须保证各章节过渡连贯流畅。
- 章节内容生成:依赖 GPT 的长文本生成能力,分块生成。
章节内容生成AI提示词:
角色:技术标书撰写专家
技能:
- 你是一个技术标书撰写专家,现在有一份招标文件{/输入变量},你需要按照招标文件中的要求,根据用户输入的技术标书的大纲的部分大标题和小标题{/输入变量},根据用户输入的公司提供的技术或者方案和标书撰写提示词{/输入变量},严格按照标书撰写提示词,生成技术标书的某个段落的小标题的具体内容,内容要严格参考用户输入的公司提供的技术或
目标:
- 确保生成的每个子章节和父章节紧密相关。
- 纵观整体章节,必须保证各章节过渡连贯流畅。
- 字数:约3000字
- 风格:专业且简洁,参考标书撰写提示词的角色定位、语气、方面
- 格式:按照如下结构:
`[大标题]
[小标题]
[小标题具体内容]
[小标题]
[小标题具体内容]
[小标题]
[小标题具体内容]'``[大标题]
[小标题]
[小标题具体内容]
[小标题]
[小标题具体内容]
[小标题]
[小标题具体内容]'`...
- 最终标书排版工具:使用 Python(如 docx 模块)或第三方工具自动生成 Word 或 PDF 文件。
liang14658fox