變數與資料流設計技巧
節點會連,變數不會傳 —— 這是新手最常卡住的地方。本篇講清楚資料在流程中怎麼流動、怎麼變形。
先畫資料流,再擺節點
搭建前先回答三個問題:
- 入口有什麼? 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 輸出變數配置 |