“ 最近有一些小伙伴采购了我的小说自动配图工作流,但是在使用的时候,有人反馈看不懂工作流的逻辑,希望我可以讲讲,以便更好地学习dify的一些节点知识。我想了一下,如果完全照着正在挂售的自动配图工作流去讲,那对已购的小伙伴是不公平的。虽然我不能原封不动的讲解,但是这类工作流的核心逻辑可以讲解一下。”
本次讲解演示的前置条件:
-
【必要】dify版本:必须**>=**0.7.0。
-
【建议】已经参照我之前教程在dify中添加的fluxpro自定义工具。本次讲解使用这个工具。
-
【建议】推荐使用GPT4o-mini模型。本次讲解使用这个模型。
01.工作流的全局思路
其实这类工作流,要说起来,也比较简单,并没有很多dify新手玩家理解的那么难,其核心就是在迭代逻辑的处理上。
-
开始节点用于接受用户的输入,再预设一个num变量容许用户选择创作几张图;
-
大模型对输入的长文本进行分镜处理,当然这个环节重点是把提示词写好,本次示例我会留下大致的提示词,大家自行优化调试。
-
将大模型的分镜脚本做成数组类型,传递给迭代节点进行循环。
-
迭代节点要处理的工作就有一定的垂直度了,首先要解析迭代中的每一个item中我们需要的字段,然后将这些提取出来的字段发给大模型进行提示词加工,接着讲加工后的内容使用代码节点进行拼接,拼接的内容交给fluxpro工具去生成图片,再提取fluxpro工具返回结果中的图片URL地址,最后通过模板转换节点预设一个单item回复格式。
-
迭代节点结束后,我们再跟一个模板转换节点,将迭代节点输出的每一个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工作流中,对于新手玩家而言,迭代节点可能是最复杂的一个节点,当然,如果你具备一定的编程能力,你很多时候用脚本代码就能撸,但是真要理解迭代这个节点,还是有点绕的。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。