跳轉到
版本 v1.0.25

Path Parameters

新手可以先跳過這頁

這四個欄位在九成情況維持預設就好,你不用「改」它們——但除錯時要會「看」。第一次學怎麼引用資料,看 JSONPath 語法 就夠了。等你遇到「下一步為什麼抓到空的?」這種問題,再回來看這頁。

這頁能幫你做什麼

延續本章開頭的看診比喻:每個步驟都會翻開病歷夾(狀態)讀資料、做完事再寫回去。這一頁講的四個欄位,就是在設定這一步要怎麼讀、怎麼寫那份病歷夾

畫面上的欄位 白話說就是 預設
InputPath 這一步要看病歷夾的哪一部分(預設:整本都給它看) $
ResultSelector 這一步做完後,要把產出整理成什麼欄位再寫上去 各任務不同,例如 {"message.$": "$.Payload.message"}
ResultPath 整理好的產出,要寫到病歷夾的哪一欄 $.<任務名稱>Result
OutputPath 這一步結束後,要把病歷夾的哪一部分交給下一步(預設:整本傳下去) $

四個欄位都在步驟設定面板的「輸入與輸出」分頁。它們的名字在畫面上就是英文,沒有中文翻譯,所以本頁也照畫面寫英文。

大型語言模型任務的「輸入與輸出」分頁:InputPath、ResultSelector、ResultPath、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 語法)。

除錯:抓不到值的時候怎麼查

照這個順序查,多數問題三步內會現形:

  1. 確認上一步真的跑過了。 到執行結果頁看那一步有沒有成功(見執行與查看結果)。
  2. 確認 ResultPath 的實際值。 打開上一步的「輸入與輸出」分頁看 ResultPath 欄位——不要用任務現在的名字去猜(見上方改名不會更新)。
  3. 確認欄位名。 同一個分頁看 ResultSelector,冒號左邊去掉 .$ 的那個字才是欄位名。

還是查不出來,就在中間插一個傳遞資料任務,把當下的整包狀態原樣輸出一次,直接看病歷夾上到底有哪些欄位、叫什麼名字。

狀態裡會多出一個 _lfe_system,那是系統自動加的

執行時,平台會自動在狀態裡注入一個 _lfe_system 物件,內含這次執行的系統資訊(例如 usergroupslfe_execution_idworkflow_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 就是照建立當下的名字產生的,之後除錯會好認很多。

相關主題