Skip to content

Dify工作流 - 长篇文章生成操作手册

需求:用户输入文章标题和文章各个一级章节,让长篇文章生成工作流生成更多的子章节,并最终输出一篇具有吸引力的长文。该原理可应用于撰写标书大纲。

长篇文章生成

  1. 创建Workflow

从工作室开始,新建应用,选择工作流类型:

  1. 开始节点

开始节点定义输入变量:title(文章标题)、chapter(文章一级章节)。

  1. 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字符串,不要输出其他任何文本。

输出示例:

js
[ { "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. 对政策制定者和社区的行动呼吁" } ]
  1. 代码执行节点

在LLM节点后添加代码执行节点,代码节点支持运行 Python / NodeJS 代码,用来在工作流程中执行数据转换。它可以简化工作流程,适用于Arithmetic、JSON transform、文本处理等情景。

该节点极大地增强了开发人员的灵活性,使他们能够在工作流程中嵌入自定义的 Python 或 Javascript 脚本,并以预设节点无法达到的方式操作变量。通过配置选项,你可以指明所需的输入和输出变量,并撰写相应的执行代码。

本小节中使用Python3代码,代码执行节点解析输入的json字符串,输出Array[Object]变量,供下一个迭代节点使用。

代码示例如下:

py
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类型。

  1. 迭代节点

在代码节点后添加迭代节点,上一个代码执行节点输出Array[Object]变量。在迭代节点循环上一个节点输出的Array[Object]变量,取出其中每一个Object,Object示例如下:

json
{
      "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。

代码示例:

py
def main(articleSections: list): 
Data = articleSections6
Return {
  "result ":  "\n".join(data)
}
def main(articleSections: list): 
Data = articleSections6
Return {
  "result ":  "\n".join(data)
}

技术标书生成

已有条件:

  1. 招标文件
  2. 投标标书目录大纲
  3. 公司已有的技术或方案(从以往的技术标书中使用Workflow单独分批章节提取)

整体思路

  1. 拆解目录:将投标标书的目录大纲拆分为多个章节,每个章节的内容目标明确。
  2. 分步生成:对每个章节单独生成内容,利用招标文件和公司技术架构的内容,结合指定的生成规则。
  3. 内容拼接和优化:将生成的内容合并为最终的完整标书,并进行整体排版和优化。

详细步骤

  1. 拆解标书目录大纲

将现成的标书的目录大纲分解为多个章节,用来分批生成技术标书内容。

  1. 创建章节生成Prompt模板

为每个章节创建一个Prompt模板,确保生成内容符合标书的规范要求。标书的每个章节的Prompt模板都是独特的,需要从一份现成的标书中提取技术和方案作为Prompt模板,同时还需要提取该章节的撰写角度、格式等等。

  1. 构建 Dify 工作流思路

针对每个章节,调用 ChatGPT 的生成接口,输入相应的Prompt模板、招标文件上传、章节标题这三个输入变量。

每次生成内容限制在合理的字数范围(2000-3000字),按章节和该章节的要求(Prompt模板)逐步生成。

将所有章节内容整合成完整的投标标书。

增加统一的开头、目录页、格式化结尾等内容。

优化内容逻辑,确保一致性和连贯性。

  1. 自动化实现

在 Dify 中,设置一个多步骤工作流:

  1. 第一步:输入和预处理
  • 用户上传招标文件、技术架构文档、目录大纲。
  • 自动提取招标文件需求和技术架构的关键内容。
  1. 第二步:分章节生成
  • 按章节顺序,调用生成模型,并保存每个章节的结果。
  1. 第三步:合并优化
  • 合并章节内容,生成完整标书文档。
  • 输出最终的标书(如 Word 或 PDF)。

示例工具链

  • 招标文件关键点提取:可以用一个Prompt专门提取招标文件中的需求点。
  • 技术架构提炼:从技术文档中抽取与每个章节相关的内容。 技术和方案提炼AI提示词:

角色:

技术标书提炼专家

技能:

你根据用户输入的技术标书的部分段落{变量},对这个段落的内容进行分析、提取、洞察、并提炼关键信息, 从撰写标书的角度考虑,精炼这个章节的技术或者方案,有技术就生成技术名词,有方案就生成简短的方案,技术名词要简短,方案要简短。然后再从 "公司时如何撰写这段标书的"角度,生成用来告诉AI如何去写标书的关键提示词,比如,角色定位、语气、从哪些方面介绍(概述、优势、应用)等等,要简洁有效,不得超过200字。 ## 目标: - 确保生成的每个子章节和父章节紧密相关。 - 纵观整体章节,必须保证各章节过渡连贯流畅。

  • 章节内容生成:依赖 GPT 的长文本生成能力,分块生成。

章节内容生成AI提示词:

角色:技术标书撰写专家

技能:

  • 你是一个技术标书撰写专家,现在有一份招标文件{/输入变量},你需要按照招标文件中的要求,根据用户输入的技术标书的大纲的部分大标题和小标题{/输入变量},根据用户输入的公司提供的技术或者方案和标书撰写提示词{/输入变量},严格按照标书撰写提示词,生成技术标书的某个段落的小标题的具体内容,内容要严格参考用户输入的公司提供的技术或

目标:

  • 确保生成的每个子章节和父章节紧密相关。
  • 纵观整体章节,必须保证各章节过渡连贯流畅。
  • 字数:约3000字
  • 风格:专业且简洁,参考标书撰写提示词的角色定位、语气、方面
  • 格式:按照如下结构:
js
`[大标题]
  [小标题]
  [小标题具体内容]
  [小标题]
  [小标题具体内容]
  [小标题]
  [小标题具体内容]'`
`[大标题]
  [小标题]
  [小标题具体内容]
  [小标题]
  [小标题具体内容]
  [小标题]
  [小标题具体内容]'`

...

  • 最终标书排版工具:使用 Python(如 docx 模块)或第三方工具自动生成 Word 或 PDF 文件。