AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


【Dify工作流实操案例】根据用户输入的一段文本自动调用fluxpro绘制成多张配图
发布日期:2024-08-28 14:11:29 浏览次数: 1702


 最近有一些小伙伴采购了我的小说自动配图工作流,但是在使用的时候,有人反馈看不懂工作流的逻辑,希望我可以讲讲,以便更好地学习dify的一些节点知识。我想了一下,如果完全照着正在挂售的自动配图工作流去讲,那对已购的小伙伴是不公平的。虽然我不能原封不动的讲解,但是这类工作流的核心逻辑可以讲解一下。


本次讲解演示的前置条件:

  1. 必要】dify版本:必须>=0.7.0。

  2. 建议】已经参照我之前教程在dify中添加的fluxpro自定义工具。本次讲解使用这个工具。

  3. 建议】推荐使用GPT4o-mini模型。本次讲解使用这个模型。



01

工作流的全局思路


其实这类工作流,要说起来,也比较简单,并没有很多dify新手玩家理解的那么难,其核心就是在迭代逻辑的处理上。

  1. 开始节点用于接受用户的输入,再预设一个num变量容许用户选择创作几张图;

  2. 大模型对输入的长文本进行分镜处理,当然这个环节重点是把提示词写好,本次示例我会留下大致的提示词,大家自行优化调试。

  3. 将大模型的分镜脚本做成数组类型,传递给迭代节点进行循环。

  4. 迭代节点要处理的工作就有一定的垂直度了,首先要解析迭代中的每一个item中我们需要的字段,然后将这些提取出来的字段发给大模型进行提示词加工,接着讲加工后的内容使用代码节点进行拼接,拼接的内容交给fluxpro工具去生成图片,再提取fluxpro工具返回结果中的图片URL地址,最后通过模板转换节点预设一个单item回复格式。

  5. 迭代节点结束后,我们再跟一个模板转换节点,将迭代节点输出的每一个item中所有的内容都展示出来,最后跟上一个回复节点展示到用户面前。



其中的关键,就是迭代节点前中后三个环节的数据处理,迭代节点中的逻辑,我写的基本上就是必不可少的,所以这些工作就一定要去做好。


当然,挂售的那个自动配图工作流,在迭代节点中搭配开始节点,做了一些功能的扩展,这个不是重点,你掌握了这个最基础的核心逻辑,你自己手搓其他功能进去,依然是可以的。


本次示例,我将参照上述写的5个步骤,尽可能详细讲解。


02


工作流步骤示例


一、开始节点:


由于dify的工作流总运行时间是有时长限制的,所以这里我并不建议大家填写过大的数值,所以最好还是预设成一个下拉选项,免得fluxpro账户扛不住,也免得dify工作流运行超时。


二、镜头分镜(LLM节点)



提示词参考:(只是一个大概,请自行优化)

# 角色:专业的影视编剧## 背景:需要根据指定的剧本内容,分析剧本的剧情,构建不同的拍摄镜头,确保每一个镜头要表达的内容与剧本内容一致。## 注意事项:保持创作的创造性,但是不能脱离剧本表达的内容。## 简介:本人是一位有丰富电影拍摄经验的专家,善于根据剧本的内容,创造出符合内容的拍摄镜头,并能准确地描述每一个镜头的内容。## 技能:- 充分理解剧本的剧情、角色变化、场景变化。- 丰富的定量和定性研究能力。- 善于提取分析要点,给出镜头描述。- 善于按照json格式,将一段完整的剧情分割成不同的、连贯的、指定数量的镜头描述,并通过json格式返回。## 目标:- 全面分析剧本内容。- 按照剧本内容,制作指定数量的镜头脚本。- 将所有的镜头脚本按照json格式输出。## 约束:- 不要过度解释。- 不要输出非json格式的内容。- 确保各部分之间的过渡顺畅,保持连贯的流畅性。- 输出应不包含任何XML标签。仅提供包含以下键和值的JSON数组:“tittle”(镜头编号),“content”(每个镜头定格画面的内容)。## 工作流程:1. 根据提供的剧本,充分理解剧本的内容。2. 根据指定的镜头数量,将剧本内容制作成对应数量的镜头描述。3. 每一个镜头都需要描述成具体的定格画面内容。4.每一个镜头的定格画面内容由不超过20个标签组成,每个标签必须是镜头内包含的元素。5.镜头元素包含了:人物描述、场景描述、镜头拍摄手法描述、事件描述等。5.将所有的镜头描述都按照json格式返回。## 输出格式:[ { "tittle": "镜头1", "content": "这里展示你创作的镜头定格画面的内容"}, { "tittle": "镜头2", "content": "这里展示你创作的镜头定格画面的内容"}...] 现在我向你提供关于剧本的所有内容,你需要按照上述的要求严格执行。{ "content": "【{{#sys.query#}}】" }, 根据我提供的信息,制作{{#1723462898707.num#}}个拍摄镜头的定格画面描述,必须按照json格式返回给我。


三、string转数组(代码节点)


参考代码:(仅供参考,如遇bug,自行优化)

def main(jingtou: str) -> dict:import json    data = json.loads(jingtou)    # string转数组对象    result = [{'tittle': item["tittle"], 'content': item["content"]} for item in data]    return {'result': result}


四、迭代逻辑(迭代节点)

4.1 迭代节点的变量设置,如下图所示:

输入变量解读:

就是string转数组对象的代码节点输出变量。

输出变量解读:

这是迭代节点内部最后一个模板转换节点的输出变量。


4.2 提取字段(迭代节点中的第一个节点,代码节点)

输出变量解释:

  • tittle:表示这是镜头的名称。

  • content:表示镜头脚本内容。(此时还是中文)


提取这两个参数,是为了后续我们需要预设单item输出的内容样式和处理镜头脚本内容为图片提示词。

这两个参数是必须要提取的,一是为了最终用户看到的图片对应的名称,二是要将镜头剧情加工成配图。

4.3 转换为图片提示词(迭代节点中的第二个节点,LLM节点

llm主要是将刚提取出来的content内容转成图片提示词。

此时llm提示词,你可以参考如下所示:(仅供参考,自行优化)

system部分:

# 角色:Ai绘图专家## 背景:你是一个专业的AI绘图专家,你对flux文生图大模型非常精通。你善于根据指定的文本内容,转写成绘图的提示词。我用自然语言告诉你要生成的prompt的主题,你的任务是根据这个主题想象一幅完整的画面,然后转化成一份详细的、高质量的prompt,让flux文生图大模型可以生成高质量的图像。## 注意事项:- 保持创作的创造性,但是不能脱离镜头表达的核心内容。-flux文生图大模型是一款利用深度学习的文生图模型,支持通过使用 prompt 来产生新的图像,描述要包含或省略的元素。-你写的prompt需要严格遵守指定的语法和格式。-prompt 用来描述图像,由普通常见的单词构成,使用英文半角","作为分隔符。-prompt 可用于描述人物、风景、物体或抽象数字艺术图画。你可以根据需要添加合理的、但不少于5处的画面细节。##Prompt中() 和 [] 语法:-调整关键字强度的等效方法是使用 () 和 []。(keyword) 将tag的强度增加 1.1 倍,与 (keyword:1.1) 相同,最多可加三层。[keyword] 将强度降低 0.9 倍,与 (keyword:0.9) 相同。##Prompt 格式要求:- prompt 内容包含画面主体、材质、附加细节、图像质量、艺术风格、色彩色调、灯光等部分,但你输出的 prompt 不能分段,例如类似"medium:"这样的分段描述是不需要的,也不能包含":"和"."。- 画面主体:不简短的英文描述画面主体, 如 A girl in a garden,主体细节概括(主体可以是人、事、物、景)画面核心内容。这部分根据我每次给你的主题来生成。你可以添加更多主题相关的合理的细节。- 对于人物主题,你不需要回复任何关于人的描述。- 材质:用来制作艺术品的材料。例如:插图、油画、3D 渲染和摄影。- 附加细节:画面场景细节,或人物细节,描述画面细节内容,让图像看起来更充实和合理。这部分是可选的,要注意画面的整体和谐,不能与主题冲突。- 图像质量:这部分内容开头永远要加上“(best quality,4k,8k,highres,masterpiece:1.2),ultra-detailed,(realistic,photorealistic,photo-realistic:1.37)”, 这是高质量的标志。其它常用的提高质量的tag还有,你可以根据主题的需求添加:HDR,UHD,studio lighting,ultra-fine painting,sharp focus,physically-based rendering,extreme detail description,professional,vivid colors,bokeh。- 色彩色调:颜色,通过添加颜色来控制画面的整体颜色。- 灯光:整体画面的光线效果。## 目标:- 全面分析文本内容,充分理解文本内容表达的构图意境。- 按照文本内容,制作英文的prompt。## 约束:- 直接输出你创作的图像提示词,不要回复与任务无关的任何内容。- 你回复的结果必须以英文半角","结束。- tag 内容用英语单词或短语来描述,并不局限于我给你的单词。注意只能包含关键词或词组。- 注意不要输出句子,不要有任何解释。- tag数量限制20个以内,单词数量限制在30个以内。- tag不要带引号("")。- tag 按重要性从高到低的顺序排列。- 我给你的主题可能是用中文描述,你给出的prompt只用英文,不要包含中文。- 你写出的prompt,不容许包含涉及画面风格的描述。## 工作流程:1. 根据提供的剧本,充分理解剧本的内容。2. 根据指定的镜头数量,将剧本内容制作成对应数量的镜头描述。3. 每一个镜头都需要全部用英文描述成具体的定格画面内容。

user部分:

现在我向你提供关于待处理文本的所有内容,你需要按照上述的要求严格执行。{ "content": "【{{#1723797309206.content#}}】" }根据我提供的信息,制作1个定格画面的英文prompt返回给我。

此时,你要重点处理的是system部分的提示词。推荐使用GPT4o-mini来处理,准确度要高一些。

4.4 摄影写实(迭代节点中的第三个节点,代码节点

这是本次示例演示的一个绘制风格,旨在将用户输入的内容,都转绘成摄影写实风格的配图,当然,你换成其他风格肯定是可以的。但这不在本次讨论范围之内。

def main(arg1: str) -> str:arg=",Street style photography,advertising design poster, movie poster,cinematic,Side profile, shallow focus, warm light, Sony A7R IV, expressive,exquisite details.8k,highdefinition, high-quality."return {"result": arg1 + arg,}


变量解释:

  • arg1变量就是llm节点输出变量

  • arg变量是我们自己写的补充提示词

最后我们将两个部分的提示词加起来,得到一个写实风格的完整文生图提示词。

4.5 fluxpro工具迭代节点中的第四个节点,工具节点

将写实风格的完整提示词作为fluxpro工具的提示词即可。

4.5 参数提取迭代节点中的第五个节点,参数提取节点

我知道很多小伙伴不善于使用代码节点提取参数,所以本次演示,我们使用参数提取节点来处理。

输入变量就是fluxpro工具的输出结果。

增加一个参数,如:URL。用于提取fluxpro 工具返回结果中的图片URL地址,这个参数提取出来,我们是在下个节点使用的。

4.6 item数据展示(迭代节点中的第六个节点,模板转换节点

输入变量:

  • tittle:4.1提取的那个tittle值

  • content:4.1提取的content值

  • url:4.5参数提取节点提取的url值


五、拼接所有迭代item内容(迭代节点后的第一个节点,模板转换)

{% for section in arg %}
{{ section }}
----------------------------------
{% endfor %}


在模板转换节点中,我们只需要使用jinja2语法,写一个for循环,将迭代节点产生的所有item都拼接起来。

最后跟上一个回复节点即可。


到这里为止,一个完整的工作流就做完了。

输出的样子大概如下所示:

其实在dify工作流中,对于新手玩家而言,迭代节点可能是最复杂的一个节点,当然,如果你具备一定的编程能力,你很多时候用脚本代码就能撸,但是真要理解迭代这个节点,还是有点绕的。

如果你对迭代节点有了一些兴趣,不妨看看我之前写的另一篇文章:

手把手教你dify工作流迭代节点内容拼接的两种方法

至此,整个工作流的逻辑基本讲完,有些地方或许写得不够好,大家多担待。我知道有不少小伙伴主要是玩coze的,这个没关系的,我虽然是拿dify作为示例讲解,重点还是希望能给广大爱好者一个参考,引导思路的。在coze上参照这个思路,你也可以做一个全自动化配图智能体。我相信coze上也有人做这类智能体,只是人家没告诉你怎么做而已。

讲点心里话:我之所以讲这些,虽然都很基础,也不代表我将dify玩的多好。只是我认为,随着AI的发展,智能体步入竞品质的趋势越发明显,核心逻辑掌握了,才有竞品质的基础,这一点是我一直想讲的。






53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询