AI Personal Learning
and practical guidance
豆包Marscode1

Dify comes with a long story generator workflow

This article briefly introduces the practice of Dify's own long story generator workflow, especially the flexible combination of iteration nodes and code nodes, which can make Dify workflow like a tiger. When the workflow execution is over, you can view the log -> trace, for each node in the workflow execution for detailed view and debugging.

-1


 

I. Start (start node)

Starting the node is relatively simple and consists of inputting the title and outline of the story article. The detailed inputs and outputs are as follows:

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

 

II. Generating subheadings and outlines (LLM nodes)

The function of this node is to expand section (understandable as first level headings) into bullets (understandable as second level headings) based on article_title (article title) and article_outline (article outline). The focus is on getting the prompt words right and giving a sample (One-Shot Learning). The sections involving cue words usually require fine-tuning. The node section setup information is shown below:

-2

1. Data processing
{
"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. Output

The output is basically a big model to generate subheadings (section|understandable as first level headings) and outlines (bullets|understandable as second level headings), i.e., the content of the text field.

{
"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
}
}

 

III. Extracting subheadings and outlines (code nodes)

This node is a code node, i.e., it is passedPythonThe code way to extract the subtitle and outline isArray[Object]Type.

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. Input
{
"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. Output
{
"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. 启示:培养积极心态应对生活挑战,提升幸福感"
}
]
}

 

IV. Iteration (Iteration nodes + LLM nodes)

An iteration node can be understood as a loop, and the contents of the loop are the operations in the iteration node.

-3

The point is still to write a good prompt that tells the title of the article and a complete outline for the LLM to write a section.

-4

Since there are 5 first level headings, 5 iterations are required to generate the corresponding chapter content.

-5

1. Input

Here are the inputs for the entire iteration node, i.e., the subtitle and outline:

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

Below is the output of the entire iteration node, generating the appropriate chapter content based on the subtitle and outline.

{
"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总之,通过学习庄子的心态哲学,我们能够更深入地理解如何调整自己的内在状态,以便更从容地面对生活中的风风雨雨,从而提升我们的整体幸福感。在这个过程中,让我们一起努力培养一种乐观、开放且包容的心态,让生命之花绚烂绽放。"
]
}

 

V. Codes (code nodes)

The input is a list and the output is the elements of the list spliced by "\n":

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

 

VI. Answers (direct response nodes)

The output of the code is the input of the answer, just output it directly.

 

bibliography

[1] Iteration node: https://docs.dify.ai/v/zh-hans/guides/workflow/node/iteration

May not be reproduced without permission:Chief AI Sharing Circle " Dify comes with a long story generator workflow
en_USEnglish