Dify可实现《三角洲行动》多线剧情的可视化、可调试流程管理。通过Chatflow类型应用搭建骨架,配置JSON格式隐藏变量,用条件分支节点控制跳转,结合LLM动态生成与知识库预设台词,经代码节点持久化状态变更,最终输出Mermaid格式剧情树。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

明确剧情分支设计的核心需求
你要为《三角洲行动》这类强叙事FPS设计多线剧情,但手动维护分支逻辑容易漏掉条件跳转、重复对话节点或冲突结局,导致测试时玩家卡在死循环里出不来。Dify 能把“玩家选择→触发条件→新对话→隐藏变量变更→结局判定”这条链路变成可调试、可回溯的可视化流程,而不是靠脑补画满整张A3纸。
搭建基础工作流骨架
登录 Dify 控制台 → 进入【工作室】→ 点击【创建应用】→ 选择「Chatflow」类型 → 命名为「剧情树生成器」→ 点击【创建空白应用】。
这一步必须选 Chatflow,【聊天助手类型不支持变量持久化与条件路由,无法记录玩家已触发的隐藏状态】。选错类型后面所有分支逻辑都会失效。
创建完成后,进入可视化编辑器,先拖入一个「开始节点」作为入口,再拖入一个「输出节点」作为出口,用连线连通。这两个节点是骨架,缺一不可——没有开始节点,工作流根本不会启动;没有输出节点,生成的对话树永远卡在中间步骤,无法返回给编剧查看。
配置剧情变量与初始状态
双击「开始节点」→ 在「变量定义」区域添加以下三个变量:
player_choice(字符串,默认值为空)
hidden_flags(JSON对象,默认值为{"has_seen_bunker": false, "trust_level": 0})
current_scene(字符串,默认值为"intro")
hidden_flags 必须用 JSON 格式写,不能写成 plain text。如果写成 has_seen_bunker=false,后续所有条件判断都会返回 false,因为 Dify 的条件引擎只识别标准 JSON 结构。这个坑很多人踩过,改一次要重跑整个测试流程。
插入分支决策节点
在开始节点和输出节点之间,拖入一个「条件分支」节点,并连接好上下游。
双击该节点 → 切换到「条件设置」标签页 → 点击【添加条件】→ 输入以下规则:
当 {{current_scene}} == "intro" 且 {{player_choice}} == "search_bunker" → 目标节点:bunker_entry
当 {{current_scene}} == "intro" 且 {{player_choice}} == "contact_commander" → 目标节点:comms_call
默认分支 → 目标节点:fallback_dialog
注意:条件表达式里不要加引号包裹变量名,{{current_scene}} 是合法写法,"{{current_scene}}" 是非法写法,会直接报错中断流程。Dify 不做字符串自动转换,它严格按语法解析。
构建对话生成与状态更新节点
方法一:用 LLM 节点动态生成台词
拖入一个「LLM」节点,命名为「生成 bunker 对话」→ 双击打开 → 在提示词框中粘贴:
你是一名《三角洲行动》资深叙事设计师。根据以下状态生成一段不超过80字的NPC对话:当前场景=掩体探索,玩家已触发隐藏标记=has_seen_bunker=true,信任等级=2。要求包含1个可选动作提示(如[检查通风管]或[呼叫支援]),不带任何解释性文字。
方法二:用知识库节点调取预设台词库
先在 Dify「数据集」中上传一份 CSV 文件,列名为 scene_id、choice_path、dialog_text、next_scene、set_flag;内容示例:intro→search_bunker→“通风管有动静,但信号被屏蔽了。”→bunker_hall→{"has_seen_bunker":true};然后在此处拖入「知识库检索」节点,绑定该数据集,检索字段设为 choice_path,查询值设为 {{player_choice}}。
两种方法可混用:LLM 负责即兴发挥,知识库负责关键剧情锚点。不要全用 LLM,否则每次生成结果不一致,编剧无法验收;也不要全用知识库,否则失去分支延展性。
接入结局判定与变量写入
拖入一个「代码执行」节点(需提前在 Dify 设置中启用沙箱),命名为「更新隐藏状态」→ 双击 → 在代码框中输入 Python:
import json
flags = json.loads(INPUT["hidden_flags"])
if INPUT.get("player_choice") == "search_bunker":
flags["has_seen_bunker"] = True
flags["trust_level"] += 1
OUTPUT = {"hidden_flags": json.dumps(flags)}
这一步不可跳过。LLM 节点或知识库节点本身不修改变量,它们只输出临时内容;只有通过代码节点显式赋值,hidden_flags 才会在后续所有分支中持续生效。漏掉这步,玩家选十次“search_bunker”,trust_level 永远停在 0。
导出可读剧情树结构
拖入最后一个「LLM」节点,命名为「格式化为Mermaid」→ 提示词写:
将以下对话流程转为 Mermaid 语法的graph TD图:每个节点用圆角矩形,标注scene_id;每条边标注玩家选择;所有结局节点用双圆圈;隐藏变量变更用虚线箭头指向变量名。输入数据:{{all_dialog_nodes}}。
连接此节点到「输出节点」→ 保存并发布应用。
现在你可以把玩家输入(如 current_scene=intro, player_choice=search_bunker)发给这个工作流,它会实时返回一张可复制进文档的 Mermaid 图,直接粘贴到 Obsidian 或 Notion 里就能渲染成可视剧情树。



















