Path Parameters¶
新手可以先跳過這頁
這四個欄位在九成情況維持預設就好,你不用「改」它們——但除錯時要會「看」。第一次學怎麼引用資料,看 JSONPath 語法 就夠了。等你遇到「下一步為什麼抓到空的?」這種問題,再回來看這頁。
這頁能幫你做什麼¶
延續本章開頭的看診比喻:每個步驟都會翻開病歷夾(狀態)讀資料、做完事再寫回去。這一頁講的四個欄位,就是在設定這一步要怎麼讀、怎麼寫那份病歷夾:
| 畫面上的欄位 | 白話說就是 | 預設 |
|---|---|---|
| InputPath | 這一步要看病歷夾的哪一部分(預設:整本都給它看) | $ |
| ResultSelector | 這一步做完後,要把產出整理成什麼欄位再寫上去 | 各任務不同,例如 {"message.$": "$.Payload.message"} |
| ResultPath | 整理好的產出,要寫到病歷夾的哪一欄 | $.<任務名稱>Result |
| OutputPath | 這一步結束後,要把病歷夾的哪一部分交給下一步(預設:整本傳下去) | $ |
四個欄位都在步驟設定面板的「輸入與輸出」分頁。它們的名字在畫面上就是英文,沒有中文翻譯,所以本頁也照畫面寫英文。

為什麼多數人不用動它們
平台在你新增步驟時就把四個欄位都填好了,而且預設值是「整本病歷夾進、整本病歷夾出」——資料不會被弄丟,後面的步驟想讀什麼都讀得到。要改它們,通常是為了效能或刻意隔離資料,那屬於進階需求。
最需要知道的一件事:欄位名稱是 ResultSelector 決定的¶
新手最常踩的坑是:以為任務的原始輸出會原封不動存進狀態。實際上中間會先過一手 ResultSelector,欄位名稱在那裡就被改掉了。
以大型語言模型任務為例,模型回來的原始輸出裡那段文字放在 Payload.message,而預設的 ResultSelector 寫的是 {"message.$": "$.Payload.message"}——意思是「把 $.Payload.message 的內容,改叫 message 再存起來」。所以下游要取這段回答,寫的是 $.LLMActionResult.message;寫 .text 會抓到 null。
怎麼看出「這一步的產出叫什麼名字」
到那個步驟的「輸入與輸出」分頁,看 ResultSelector 欄位裡實際寫了什麼。它是一個帶行號的 JSON 編輯器,內容長這樣:
{"message.$": "$.Payload.message"}
冒號左邊、去掉結尾 .$ 的那個字,就是欄位名(這裡是 message)。下游就寫 $.<這一步的 ResultPath>.message。
下表是各類任務常見的欄位名,可以先當參考,但以你畫面上的 ResultSelector 為準:
| 任務 | 欄位名 | 引用時要寫 |
|---|---|---|
| 大型語言模型 | message | $.LLMActionResult.message |
| 文字 | text | $.TextActionResult.text |
| 檢索/檢索器/排序器 | docs | $.RetrievalActionResult.docs |
| HTTPS API/Lambda/程式碼/傳遞資料 | output | $.HttpsApiActionResult.output |
| 搜尋引擎 | search_results | $.SearchEngineActionResult.search_results |
| MySQL/OpenSearch/Athena | rows(OpenSearch 為 response) | $.MySQLActionResult.rows |
| 執行工作流程 | execution_arn | $.StartWorkflowExecutionActionResult.execution_arn |
第二件事:ResultPath 的名字不會跟著你改名¶
ResultPath 是建立步驟的當下依當時的預設名稱產生的:
| 建立時的任務名稱 | ResultPath |
|---|---|
| LLMAction | $.LLMActionResult |
| RetrievalAction | $.RetrievalActionResult |
| TextAction | $.TextActionResult |
| HttpsApiAction | $.HttpsApiActionResult |
每個步驟各有自己的一欄,所以多個步驟依序跑也不會互相蓋掉。
改名任務後,ResultPath 不會自動更新
把「LLMAction」改名成「AI 分診」之後,它的 ResultPath 仍然是 $.LLMActionResult。下游若照新名字寫 $.AI分診Result 會抓到 null。要確認真正的值,就到那個步驟的「輸入與輸出」分頁看 ResultPath 欄位實際寫什麼。
走一遍:一筆資料怎麼流過一個步驟¶
用看診流程的「AI 分診」步驟(一個大型語言模型任務,建立時叫 LLMAction)示範。
1. 進到這一步之前,病歷夾(狀態)長這樣:
{
"question": "我頭痛又發燒,該看哪一科?"
}
2. InputPath $:整本病歷夾都交給這一步,所以任務收到的就是上面那包。
3. 任務執行:模型讀完主訴,回覆建議科別。
4. 任務的原始輸出(還沒整理過的樣子):
{
"Payload": {
"message": "建議看家醫科。"
}
}
5. ResultSelector {"message.$": "$.Payload.message"}:把它整理成——
{
"message": "建議看家醫科。"
}
這一步決定了狀態裡的欄位叫 message。
6. ResultPath $.LLMActionResult:整理好的產出寫回病歷夾的這一欄,於是病歷夾變成——
{
"question": "我頭痛又發燒,該看哪一科?",
"LLMActionResult": {
"message": "建議看家醫科。"
}
}
原本的 question 還在,只是多了一欄。
7. OutputPath $:整本病歷夾交給下一步。
8. 下一步就可以指名取用這段回答:
{
"summary.$": "$.LLMActionResult.message"
}
畫面上你不用自己打這段 JSON——在下一步的欄位打開「JSONPath」開關、填 $.LLMActionResult.message 就是同一件事(做法見 JSONPath 語法)。
除錯:抓不到值的時候怎麼查¶
照這個順序查,多數問題三步內會現形:
- 確認上一步真的跑過了。 到執行結果頁看那一步有沒有成功(見執行與查看結果)。
- 確認 ResultPath 的實際值。 打開上一步的「輸入與輸出」分頁看
ResultPath欄位——不要用任務現在的名字去猜(見上方改名不會更新)。 - 確認欄位名。 同一個分頁看
ResultSelector,冒號左邊去掉.$的那個字才是欄位名。
還是查不出來,就在中間插一個傳遞資料任務,把當下的整包狀態原樣輸出一次,直接看病歷夾上到底有哪些欄位、叫什麼名字。
狀態裡會多出一個 _lfe_system,那是系統自動加的
執行時,平台會自動在狀態裡注入一個 _lfe_system 物件,內含這次執行的系統資訊(例如 user、groups、lfe_execution_id、workflow_id)。會在哪裡看到它? 到執行結果頁「詳細資料」卡片的「歷史」分頁,或用輸入/輸出檢視器右上角的 「以 JSON 檢視」看原始結構時就會看到。看到它是正常的,不是你弄錯了。請不要去引用 _lfe_system 裡的值,它由系統管理,內容與格式可能變動。
資料很大時:外部記憶體會改變 ResultPath 裡的東西¶
當某個步驟在「執行設定」打開「上傳輸出至外部記憶體」開關時(做法見外部記憶體),它不會把整包內容寫進狀態,而是把內容寄放到外部記憶體、只在狀態裡留一張「寄物單」:
{
"action_type": "llm_action",
"external_memory_id": "mem-abc123",
"message": "Summary"
}
下游要拿完整內容時,就用那張寄物單(external_memory_id)去換。這一段要在編輯器的「程式碼」檢視手寫,寫法見外部記憶體語法。
什麼時候會需要改這四個欄位¶
- 想讓某一步只收到它需要的那一小塊資料(改
InputPath)。 - 想把產出換個名字或只留幾個欄位再寫進狀態(改
ResultSelector)。 - 想把產出寫到自訂的欄位名、而不是預設的
$.<任務名稱>Result(改ResultPath)。 - 想讓下一步只拿到狀態的一部分(改
OutputPath)。
沒有上述需求就別動它們——預設值已經是最不會出錯的組合。另外,取名時盡量用看得懂的步驟名稱(例如 FetchUserData 而不是 Step1),因為 ResultPath 就是照建立當下的名字產生的,之後除錯會好認很多。
相關主題¶
- JSONPath 語法:用
$.指名要取哪一欄 - 外部記憶體語法:資料太大時怎麼存取
- 傳遞資料任務:把當下狀態原樣輸出,用來除錯