变量与数据流设计技巧
节点会连,变量不会传 —— 这是新手最常卡住的地方。本篇讲清楚数据在流程中怎么流动、怎么变形。
先画数据流,再摆节点
搭建前先回答三个问题:
- 入口有什么? Start 节点收集哪些字段 (用户消息、自定义变量)
- 出口要什么? Answer 的回复模版 / End 的输出变量需要哪些数据
- 中间怎么变? 从入口到出口,数据经过哪些加工
把这条链写成一行,再对着它摆节点:
用户消息 → 分类结果 → (行情分支)股票代码 → 行情JSON → 格式化文本 → 回复结构化输出:让 LLM 的结果能被下游"用"
LLM 默认输出自由文本 text(String),下游节点很难精确取值。需要下游做判断、取字段时,打开 LLM 节点的结构化输出开关:
- 输出变量变为
structured_output(Object),按你配置的 JSON Schema 生成 - 配置时逐个定义字段:参数名、参数类型、是否必填
- 典型用法:让 LLM 抽取
{"ticker": "NVDA", "intent": "查行情"},下游 IF Else / Http Request 直接引用字段
原则:给人看的用
text,给机器用的用structured_output。
三个变量节点的分工
| 节点 | 干什么 | 什么时候用 |
|---|---|---|
| Variables Transformer | 用 Jinja2 模板做格式化、类型转换、合并拆分 | 拼接文案、把 Object 转成展示文本、简单变换 |
| Parameter Extractor | 用大模型从文本中提取结构化参数 | 需要把自然语言转成工具调用入参时 |
| Code | Python / JavaScript 自定义逻辑 | Transformer 表达不了的复杂计算、清洗、校验 |
选择顺序:能用 Transformer 就不用 Code(模板比代码好维护);Code 是兜底方案。
分支数据的汇聚:Branch Aggregator
IF Else / Question Classifier 分出去的多条分支,各自产生了不同的输出变量,下游 (如 Answer) 只想引用"一个"结果时,用 Branch Aggregator:
- 不分组状态:把多个分支的变量聚合为一个输出,类型由选择的第一个变量决定 —— 所以各分支的输出类型要保持一致(都是 String 或都是 Object)
- 分组状态:需要聚合多组不同含义的变量时使用
反模式:每个分支各接一个 Answer 节点、复制同样的回复模版。改为分支 → 聚合 → 单个 Answer,模版只维护一份。
循环中的数据传递
- Iteration(迭代):输入一个列表,对每个元素执行一遍内部子流程,产出结果列表。支持并行模式加速,支持配置错误处理(单个元素失败不影响整体)。适合"对每篇新闻生成摘要"这类批量任务
- Loop(循环):按次数或条件反复执行,每轮更新变量并传给下一轮,内部有「结束循环」特殊节点控制退出。适合"反复优化直到满足条件"这类任务
- 两者内部都不能放 Start / End 节点,子流程从内部的 Home 开始
常见数据流问题排查
| 症状 | 常见原因 | 解法 |
|---|---|---|
| 下游选不到想要的变量 | 上游节点没连线,或变量在分支里 | 检查连线;分支变量先过 Branch Aggregator |
| LLM 提示词报"请在提示中填写上下文变量" | 配了上下文但提示词里没插入变量 | 在提示词中插入该变量,或移除上下文配置 |
| 输出的 JSON 下游解析失败 | 靠提示词约束格式,模型偶尔跑偏 | 改用结构化输出 (JSON Schema 强约束) |
| 聚合后类型不对 | Branch Aggregator 各分支类型不一致 | 统一各分支输出类型,必要时先用 Transformer 转换 |
| 循环里的结果没带出来 | 循环体内变量没写回迭代输出 | 检查 Iteration 输出变量配置 |