Dify自带的长故事生成器工作流

本文主要简要的介绍了Dify自带的长故事生成器工作流的实践过程,尤其是迭代节点和代码节点的灵活组合,可以让Dify工作流如虎添翼。当工作流执行结束后,可以通过查看日志->追踪,对于工作流中每个节点执行情况进行详细的查看和调试。

一.开始(开始节点)

开始节点比较简单,主要是输入故事文章的标题和大纲。详细输入和输出如下:

1.输入
{
  "article_title": "庄子五个启迪心灵的故事治愈了我的精神疲惫",
  "article_outline": "文章大纲:关于评价、得失、困境、选择和心态的五个故事",
  "sys.query": "故事生成",
  "sys.files": [],
  "sys.conversation_id": "5e874989-ea79-4de0-b6bb-2cca6a8ef6fc",
  "sys.user_id": "4bc1624f-773d-4a39-a0c6-52008a13320e"
}
2.输出
{
  "article_title": "庄子五个启迪心灵的故事治愈了我的精神疲惫",
  "article_outline": "文章大纲:关于评价、得失、困境、选择和心态的五个故事",
  "sys.query": "故事生成",
  "sys.files": [],
  "sys.conversation_id": "5e874989-ea79-4de0-b6bb-2cca6a8ef6fc",
  "sys.user_id": "4bc1624f-773d-4a39-a0c6-52008a13320e"
}

二.生成副标题和大纲(LLM节点)

该节点功能为根据article_title(文章标题)和article_outline(文章大纲),对section(可理解为一级标题)扩展为bullets(可理解为二级标题)。重点是把提示词写好,并且给出一个样例(One-Shot Learning)。涉及提示词部分通常都需要精调。该节点部分设置信息如下所示:

1.数据处理
{
  "model_mode": "chat",
  "prompts": [
    {
      "role": "system",
      "text": "<instruction>\n1. 根据提供的文章标题和大纲撰写一篇长文章。按照以下步骤完成任务:\n2. 使用article_title作为文章的标题。\n3. 根据提供的article_outline组织文章。大纲中的每一部分应在文章中对应一个部分。\n4. 确保文章内容丰富,每一部分包含详细信息、解释、示例和任何其他相关内容,以全面覆盖主题。\n5. 确保各部分之间过渡自然,以保持连贯性。\n6. 输出应不包含任何XML标签。仅提供以下键和值的JSON数组:\"section\"(文章各部分的标题),\"bullets\"(文章每部分的概要)。\n<example>\n<input>\n<article_title>气候变化对沿海城市的影响</article_title>\n<article_outline>\n    1. 引言\n    2. 海平面上升\n    3. 风暴频率增加\n    4. 结论\n</article_outline>\n</input>\n<output>\n    [\n        {\n            \"section\": \"引言\",\n            \"bullets\": \"1. 气候变化对沿海城市影响的概述 2. 理解这些影响的重要性\"\n        },\n        {\n            \"section\": \"海平面上升\",\n            \"bullets\": \"1. 海平面上升的原因 2. 对沿海基础设施和社区的影响 3. 受影响城市的例子\"\n        },\n        {\n            \"section\": \"风暴频率增加\",\n            \"bullets\": \"1. 气候变化与风暴频率之间的联系 2. 更频繁和更严重风暴对沿海地区的影响 3. 最近风暴的案例研究\"\n        },\n        {\n            \"section\": \"结论\",\n            \"bullets\": \"1. 总结关键点 2. 应对气候变化的紧迫性 3. 对政策制定者和社区的行动呼吁\"\n        }\n    ]\n</output>\n</example>\n</instruction>\n<input>\n    <article_title> 庄子五个启迪心灵的故事治愈了我的精神疲惫 </article_title>\n    <article_outline> 文章大纲:关于评价、得失、困境、选择和心态的五个故事 </article_outline>\n</input>\n<output>",
      "files": []
    }
  ]
}
2.输出

输出基本上是通过大模型生成副标题(section|可理解为一级标题)和大纲(bullets|可理解为二级标题),即text字段内容。

{
  "text": "[\n    {\n        \"section\": \"关于评价\",\n        \"bullets\": \"1. 故事背景:庄子与他的弟子 2. 评价的相对性:不同视角下的价值判断 3. 启示:如何看待他人的评价,保持内心平和\"\n    },\n    {\n        \"section\": \"得失\",\n        \"bullets\": \"1. 故事内容:庄子与一位渔夫的对话 2. 得失观念的转变:从物质到精神的追求 3. 启示:学会珍惜当下,放下执念\"\n    },\n    {\n        \"section\": \"困境\",\n        \"bullets\": \"1. 故事情节:庄子在困境中的思考 2. 困境带来的成长与反思 3. 启示:面对困难时,如何调整心态,寻找解决之道\"\n    },\n    {\n        \"section\": \"选择\",\n        \"bullets\": \"1. 故事描述:庄子的两难选择 2. 决策过程中的智慧与勇气 3. 启示:在生活中做出选择时,要听从内心,勇敢前行\"\n    },\n    {\n        \"section\": \"心态\",\n        \"bullets\": \"1. 故事总结:庄子的心态哲学 2. 积极心态的重要性及其影响力 3. 启示:培养积极心态应对生活挑战,提升幸福感\"\n    }\n]",
  "usage": {
    "prompt_tokens": 515,
    "prompt_unit_price": "0.15",
    "prompt_price_unit": "0.000001",
    "prompt_price": "0.0000773",
    "completion_tokens": 348,
    "completion_unit_price": "0.60",
    "completion_price_unit": "0.000001",
    "completion_price": "0.0002088",
    "total_tokens": 863,
    "total_price": "0.0002861",
    "currency": "USD",
    "latency": 4.521080200036522
  }
}

三.提取副标题和大纲(代码节点)

该节点为代码节点,即通过Python代码方式提取副标题和大纲为Array[Object]类型。

def main(arg1: str) -> dict:
    import json
    data = json.loads(arg1)
    
    # Create an array of objects
    result = [{'section': item["section"], 'bullets': item["bullets"]} for item in data]
    
    return {
        'result': result
    }
1.输入
{
  "arg1": "[\n    {\n        \"section\": \"关于评价\",\n        \"bullets\": \"1. 故事背景:庄子与他的弟子 2. 评价的相对性:不同视角下的价值判断 3. 启示:如何看待他人的评价,保持内心平和\"\n    },\n    {\n        \"section\": \"得失\",\n        \"bullets\": \"1. 故事内容:庄子与一位渔夫的对话 2. 得失观念的转变:从物质到精神的追求 3. 启示:学会珍惜当下,放下执念\"\n    },\n    {\n        \"section\": \"困境\",\n        \"bullets\": \"1. 故事情节:庄子在困境中的思考 2. 困境带来的成长与反思 3. 启示:面对困难时,如何调整心态,寻找解决之道\"\n    },\n    {\n        \"section\": \"选择\",\n        \"bullets\": \"1. 故事描述:庄子的两难选择 2. 决策过程中的智慧与勇气 3. 启示:在生活中做出选择时,要听从内心,勇敢前行\"\n    },\n    {\n        \"section\": \"心态\",\n        \"bullets\": \"1. 故事总结:庄子的心态哲学 2. 积极心态的重要性及其影响力 3. 启示:培养积极心态应对生活挑战,提升幸福感\"\n    }\n]"
}
2.输出
{
  "result": [
    {
      "section": "关于评价",
      "bullets": "1. 故事背景:庄子与他的弟子 2. 评价的相对性:不同视角下的价值判断 3. 启示:如何看待他人的评价,保持内心平和"
    },
    {
      "section": "得失",
      "bullets": "1. 故事内容:庄子与一位渔夫的对话 2. 得失观念的转变:从物质到精神的追求 3. 启示:学会珍惜当下,放下执念"
    },
    {
      "section": "困境",
      "bullets": "1. 故事情节:庄子在困境中的思考 2. 困境带来的成长与反思 3. 启示:面对困难时,如何调整心态,寻找解决之道"
    },
    {
      "section": "选择",
      "bullets": "1. 故事描述:庄子的两难选择 2. 决策过程中的智慧与勇气 3. 启示:在生活中做出选择时,要听从内心,勇敢前行"
    },
    {
      "section": "心态",
      "bullets": "1. 故事总结:庄子的心态哲学 2. 积极心态的重要性及其影响力 3. 启示:培养积极心态应对生活挑战,提升幸福感"
    }
  ]
}

四.迭代(迭代节点+LLM节点)

迭代节点可以理解为一个循环,循环的内容就是迭代节点中的操作。

重点还是写好提示词,告诉文章标题和完整大纲,让LLM写一个部分内容。

因为有5个一级标题,所以需要5次迭代,从而生成相应章节内容。

1.输入

下面是整个迭代节点的输入,即副标题和大纲:

{
  "iterator_selector": [
    {
      "section": "关于评价",
      "bullets": "1. 故事背景:庄子与他的弟子 2. 评价的相对性:不同视角下的价值判断 3. 启示:如何看待他人的评价,保持内心平和"
    },
    {
      "section": "得失",
      "bullets": "1. 故事内容:庄子与一位渔夫的对话 2. 得失观念的转变:从物质到精神的追求 3. 启示:学会珍惜当下,放下执念"
    },
    {
      "section": "困境",
      "bullets": "1. 故事情节:庄子在困境中的思考 2. 困境带来的成长与反思 3. 启示:面对困难时,如何调整心态,寻找解决之道"
    },
    {
      "section": "选择",
      "bullets": "1. 故事描述:庄子的两难选择 2. 决策过程中的智慧与勇气 3. 启示:在生活中做出选择时,要听从内心,勇敢前行"
    },
    {
      "section": "心态",
      "bullets": "1. 故事总结:庄子的心态哲学 2. 积极心态的重要性及其影响力 3. 启示:培养积极心态应对生活挑战,提升幸福感"
    }
  ]
}
2.输出

下面是整个迭代节点的输出,根据副标题和大纲生成相应章节内容。

{
  "output": [
    "### 关于评价\n\n在庄子的哲学世界中,评价不仅是对事物的判断,更是一种相对的存在。庄子与他的弟子之间的故事常常揭示了这一点。在一次闲聊中,弟子向庄子请教:“老师,您认为一个人的价值如何评判?”庄子微微一笑,回答道:“就像一只蝴蝶,有人觉得它美丽,有人却认为它平凡。每个人的眼光不同,自然会得出不同的结论。”\n\n这个故事背景为我们提供了一个重要的视角:评价是相对的。无论是对他人的看法还是自我的认知,都受到个人经历、文化背景和情感状态等多重因素的影响。因此,在面对外界评价时,我们应当意识到,这些声音并不一定反映真实的自我,而只是他人视角下的一种解读。\n\n进一步地,这种相对性引发了我们对于如何看待他人评价的思考。庄子曾说:“道之所存,心之所安。”这句话提醒我们,在纷繁复杂的社会中,保持内心的平和尤为重要。当我们遭遇批评或赞扬时,不妨停下来思考:这些评价是否真正符合自己的价值观?又或者,它们只是他人情绪的一种投射?通过这样的反思,我们可以更好地理解自己,从而不被外界所左右。\n\n因此,从庄子的智慧中,我们获得了一种启示:在生活中,无论面对怎样的评价,都要保持内心的宁静与坚定。只有这样,我们才能在纷扰的人生旅途中找到属于自己的方向,而不被他人的声音所迷惑。这不仅有助于我们的精神成长,也能让我们在复杂的人际关系中游刃有余,活出真实而充实的人生。",
    "### 得失\n\n在庄子的哲学世界中,得失的观念常常被重新审视和解构。一个著名的故事讲述了庄子与一位渔夫之间的对话,这段对话不仅揭示了物质与精神之间的深刻关系,也为我们提供了关于如何看待得失的重要启示。\n\n故事发生在一个宁静的早晨,庄子漫步于河边,偶然遇见了一位正在捕鱼的渔夫。渔夫面带微笑,悠闲地将鱼网抛入水中,似乎并不急于捕捞。他用简单而朴素的话语告诉庄子:“我每天只需捕够几条鱼,就能满足我的生活。我不追求更多,因为那样会让我疲惫不堪。”\n\n庄子听后,不禁思索:这位渔夫所拥有的,不仅是他手中的鱼,更是一种超脱于物质之外的心态。他明白,真正的富足并非来自于外界的积累,而是内心对当下生活状态的珍惜与满足。这种从容淡泊、知足常乐的态度,让他在平凡中找到了幸福。\n\n随着对话深入,庄子向渔夫提出了一个问题:“如果你能够捕到更多的鱼,你是否会感到更快乐?”渔夫摇摇头,回答道:“我并不需要更多。追求过多只会让我失去现在所拥有的一切,我宁愿享受这份宁静。”这一番话让庄子深受触动,他意识到,在现代社会中,人们往往被物质欲望驱使,而忽略了精神层面的追求。\n\n通过这次交流,庄子的得失观念也发生了转变。他开始反思自己曾经对于成功和财富的不懈追求,并逐渐领悟到:人生最重要的是珍惜当下、放下执念。无论外界环境如何变化,我们都应保持内心的平和与满足。正如那位渔夫所展现出的智慧一样,真正值得追求的是一种内心深处的安宁与自在。\n\n这个故事给我们的启示是深远而持久的。在快节奏、高压力的现代生活中,我们常常迷失在对物质利益的不懈追逐之中。然而,通过学习渔夫那种简单而纯粹的人生态度,我们可以学会珍惜眼前的一切,从而减轻精神负担,实现自我治愈。在每一个瞬间找到快乐,让生命充满意义,这才是真正的人生智慧。",
    "### 困境\n\n在庄子的生活中,曾有一段时间,他面临着巨大的困境。那是一个风雨交加的夜晚,庄子独自坐在山顶,四周寂静无声,只有风声和雨滴敲打岩石的声音。他的心中充满了迷茫与不安:作为一位哲学家,他常常思考人生的意义,但此刻却被现实的压力所困扰。朋友们对他的期望、社会对他的评价,以及他自身对理想生活的追求,都让他感到无比沉重。\n\n在这样的困境中,庄子开始反思自己的处境。他意识到,这些外部因素虽然给他带来了压力,却也促使他深入思考内心真正渴望的是什么。他回忆起自己曾经教导弟子的道理:“道生一,一生二,二生三,三生万物。”这句话提醒他,无论多么复杂的问题,其实都可以归结为简单的选择和理解。于是,他决定不再被困扰,而是要从这场风暴中寻找出路。\n\n通过深刻的自省和思考,庄子逐渐领悟到困境并非绝境,而是一种成长的契机。他开始尝试调整自己的心态,将注意力从外界转向内心。他明白,在面对困难时,不应只关注问题本身,而应寻找解决之道。正如大海中的波涛汹涌,总会有平静的一刻,只要耐心等待,就能找到方向。\n\n这一过程不仅让庄子重新审视了自己的价值观,也使他更加坚定了追求内心宁静的重要性。在经历了这场精神上的洗礼后,他终于找到了应对困境的方法:保持冷静、积极面对,并相信每一次挑战都是通往更高智慧的一步。\n\n这个故事告诉我们,当我们身处困境时,不妨像庄子一样,从内心出发进行反思与调整。面对困难,我们可以选择放下执念,以开放的心态去探索解决之道。这不仅能帮助我们走出当下的阴霾,更能在未来的人生旅途中,让我们拥有更强大的内心力量。",
    "### 选择\n\n在庄子的哲学世界中,选择常常是一个令人深思的话题。故事发生在一个阳光明媚的早晨,庄子与他的弟子漫步于山间小径,享受着大自然的宁静与美好。突然,他们遇到了一条河流,河水清澈见底,但却流速极快。在河的两岸,各有一条小路,一边通往繁华的市集,另一边则引向幽静的山林。\n\n弟子面临着一个两难的选择:他可以选择前往市集,追求物质上的富足和名利;也可以选择进入山林,追寻内心的宁静与自我修养。面对这个抉择,他感到无比困惑,不知该如何决断。\n\n庄子看出了弟子的犹豫,于是开始引导他思考。他告诉弟子:“人生就像这条河流,有时我们不得不做出选择,而每个选择都有其独特的意义。”庄子接着分享了自己的智慧,他认为,无论是追求物质还是精神,都没有绝对的对错。关键在于,我们是否能够倾听内心真实的声音,并勇敢地迈出那一步。\n\n经过一番深思熟虑,弟子终于意识到自己真正渴望的是内心的平和,而非外界的喧嚣。他决定放弃前往市集的诱惑,转而走向那片幽静的山林。在那里,他感受到大自然带来的宁静与安详,也找到了自我反省与成长的机会。\n\n这个故事给我们的启示是,在生活中做出选择时,我们常常会面临各种各样的诱惑和压力。然而,真正重要的是要倾听自己的内心,不被外界所左右。勇敢地去追寻那个让自己感到充实和快乐的人生方向,这才是我们应当努力践行的人生哲学。\n\n通过庄子的智慧,我们明白了:每一次选择都是一次自我发现之旅,只要我们坚定信念、勇敢前行,就能找到属于自己的道路。这种勇气不仅能帮助我们克服眼前的困境,更能治愈我们精神上的疲惫,让生命焕发出新的光彩。",
    "### 心态\n\n庄子的心态哲学是其思想体系中不可或缺的一部分,他通过生动的故事传达了对生活的深刻理解。在庄子的著作中,常常可以看到他对心态的重视。他认为,心态不仅影响个人的感受与体验,更在很大程度上决定了一个人如何面对生活中的各种挑战。\n\n#### 故事总结:庄子的心态哲学\n\n有一次,庄子和他的弟子们在河边散步,他们看到一只小鸟在树枝上欢快地鸣叫。弟子们纷纷赞叹这只小鸟的自由与快乐,而庄子却微微一笑,说道:“你们可曾想过,这只小鸟并不为明天而忧虑,也不为过去而懊悔,它只是活在当下,享受此刻。”这个简单的故事让弟子们意识到,真正的快乐源于一种无拘无束、随遇而安的心态。庄子的智慧在于,他教导人们要放下对未来的不安与对过去的执念,以一种平和、开放的心态去面对生活。\n\n#### 积极心态的重要性及其影响力\n\n积极心态的重要性体现在多个方面。首先,它能够帮助我们更好地应对压力和困难。当我们以积极的眼光看待问题时,我们会发现解决方案往往比想象中更容易找到。其次,积极心态还能够提升我们的幸福感和满足感。研究表明,那些拥有积极思维的人通常更容易感受到生活中的美好,并能更有效地建立良好的人际关系。此外,积极心态也具有一定的感染力,它能激励周围的人共同向上,使整个环境变得更加和谐。\n\n#### 启示:培养积极心态应对生活挑战,提升幸福感\n\n从庄子的故事中,我们可以得到启示:培养积极心态是应对生活挑战的重要策略。在日常生活中,我们可以通过一些简单的方法来增强自己的积极思维。例如,每天花几分钟时间反思自己所拥有的美好事物,无论是家人的陪伴、朋友的支持还是工作的成就,都值得我们去珍惜。同时,在面对困难时,不妨尝试将问题视为成长机会,而不是障碍。这种转变不仅能减轻心理负担,还能让我们在逆境中找到前行的动力。\n\n总之,通过学习庄子的心态哲学,我们能够更深入地理解如何调整自己的内在状态,以便更从容地面对生活中的风风雨雨,从而提升我们的整体幸福感。在这个过程中,让我们一起努力培养一种乐观、开放且包容的心态,让生命之花绚烂绽放。"
  ]
}

五.代码(代码节点)

输入是list,输出是把list中的元素通过"\n"拼接:

def main(articleSections: list):
    data = articleSections
    return {
        "result": "\n".join(data)
    }

六.回答(直接回复节点)

代码的输出就是回答的输入,直接输出即可。

参考文献

[1] 迭代节点:https://docs.dify.ai/v/zh-hans/guides/workflow/node/iteration

NLP工程化(星球号)

### 使用 Dify 自动生成 SQL 语句 为了利用 Dify 实现从自然语言到 SQL 的转换,即 text2sql 功能,可以遵循特定的工作流程。此过程不仅涉及将用户的自然语言请求转化为结构化的 SQL 查询,还涵盖了必要的安全性考量以及对不同数据库系统的适应性。 #### 构建 Text-to-SQL 转换模型 Dify 提供了一套完整的解决方案用于创建能够理解人类语言并将其翻译成有效的 SQL 命令的应用程序。这通常涉及到训练机器学习模型识别各种类型的查询意图,并映射这些意图为相应的 SQL 结构[^2]。 ```json { "query": "显示销售部门的所有员工" } ``` 上述 JSON 数据代表了一个简单的 API 请求体,其中包含了用户提出的自然语言问题。“显示销售部门的所有员工”这样的表述会被解析并转化成如下所示的 SQL 语句: ```sql SELECT * FROM employees WHERE department = 'sales'; ``` #### 集成规则驱动的 SQL 生产引擎 对于更复杂的场景,可能需要集成一个基于规则的 SQL 生成器来确保所生产的 SQL 符合目标数据库的具体要求。这种机制可以帮助处理跨多个平台的一致性和兼容性挑战,同时也支持自定义调整以满足特殊需求[^1]。 例如,在面对不同的 RDBMS 如 PostgreSQL 或 MySQL 时,可以通过配置文件指定差异化的参数设置或函数调用方式,从而保证最终输出的 SQL 是针对具体环境优化过的版本。 #### 执行前的安全验证 考虑到直接暴露 SQL 接口给外部应用存在的潜在风险,必须采取措施防止 SQL 注入和其他形式的数据操纵威胁。为此,在提交任何由自动化工具产生的 SQL 到实际执行之前,应该先经过全面而严谨的安全扫描和净化处理。 一种常见做法是在接收到客户端发送过来未经加工的文字描述之后立即对其进行预编译检查,去除掉一切可疑字符组合,只保留合法的操作指令集内的关键词汇表项;另外还可以考虑采用白名单策略限定可接受的动作范围,进一步降低误操作的可能性。 #### 示例:通过 RESTful API 发送 SQL 查询 一旦完成了前面提到的各项准备工作,则可通过标准 HTTP 方法向服务器发起带有有效负载(payload)—— 即准备好的 SQL 文本 —— 的 POST 请求来进行测试。下面是一个具体的例子说明如何使用 `curl` 命令行工具完成这项任务[^3]: ```bash root@ubuntu:~# curl -X POST "http://127.0.0.1:5000/query" \ -H "Content-Type: application/json" \ -d '{"sql": "select * from host limit 1;" }' ``` 这条命令会触发一次远程服务调用,该服务负责解释所提供的 SQL 并返回预期的结果集作为响应内容的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP工程化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值