昨天介紹了「問題分類」和「知識檢索」這兩個關鍵節點,不過你可能在想,如果想做出更細緻的操作像是「條件判斷」和「迭代」呢?不只程式碼可以做到,在 Dify 中也有相對應的節點。
舉例來說,當使用者問到「我要從台北到高雄,請問有什麼交通方式?高雄的天氣怎麼樣?還有高雄有哪些夜市推薦?」,這種很大的問題一次來,就可以先讓 LLM 將問題拆分子問題,然後根據拆分的子問題去迭代處理,如果沒有子問題,就做出對應的處理,諸如此類...
新增一個參數提取器節點
輸入變量是被提取參數的字串,提取參數可以根據需要設定,像這邊我就設定了 date
注意:參數的命名語意要盡可能和你的目的相同,不然模型可能會誤解你的意思。比如說我希望提取的是日期,那就不應該用 apple
當作參數名稱。
如果你的平台使用者問的問題會比較複雜,不一定每此都會有參數資訊的話,那可以考慮把必填取消
輸出除了參數,還有是否成功提取參數,可以用條件判斷來決定走向
可以選擇不同的參數類型
String
: 字串Number
: 數字Array[String]
: 多個字串Array[Number]
: 多個數字Array[Object]
: 多個物件,這邊物件就和 JSON 的物件是一樣的,由 key 和 value 組成這邊用來告訴語言模型如何提取參數,以這邊日期當作例子,沒有特別指定的話模型就會輸出英文的 key。這邊我問了:「2024 年的情人節餐廳好多人」,以下是輸出
給他範例參考的話
就會依照你給他的格式去輸出
在 Agent 使用工具的章節中,我們讓模型用工具後,這些工具的輸出通常都會有特定的格式。比方說 duckduckgo 的圖片搜尋功能,就會先提取句子中的要搜尋的主題,這就是一個參數提取的過程。只不過參數提取的過程不是由我們去定義,而是由工具去定義
直接從工具導入要提取的參數,其實就是幫你把工具的參數 description 和參數名稱導入而已。以下是 duckduckgo 的 image search 的例子
新增一個迭代節點
通常會搭配參數提取來使用,這邊我用了一個可以提取水果名稱的參數提取器
輸入必須為 Array
在迭代節點中,可以新增每次要迭代要做的事情,像這邊我希望每個水果都可以有自己的介紹
每次迭代的物件名稱為 迭代名稱/item
,這邊就會是水果的名稱
記得要指定迭代的輸出
以下是完整的流程會像是這樣,先提取水果,然後迭代水果的介紹,最後輸出
輸入「蘋果鳳梨香蕉」
輸出為
{ "output": [ "蘋果是清脆多汁的水果,富含維生素和纖維,常被譽為「一天一蘋果,醫生遠離我」。", "鳳梨,酸甜可口,汁多肉嫩,是夏日解渴的絕佳選擇。", "香蕉是一種富含鉀和纖維的美味水果,口感柔滑,能量充沛,隨時隨地都是理想的點心選擇。" ] }
我們可以延伸上面水果的例子,利用「條件判斷」節點來判斷水果參數的輸出是否為空,先判斷有沒有水果參數再來處理
如果沒有水果,就提醒使用者
測試一下,沒有水果的句子
有水果的句子
透過日誌來檢查參數提取的輸出
在設計迭代 (或者說「多次推論」)的系統要特別小心,不要讓模型處理太複雜的問題,避免使用者等太久或者花費的 token 太多
其實以上的設計還有一個問題,像是輸出的 object 格式如何轉換成我們想要的字串?明天來介紹「模板轉換」和「代碼執行」 (Code Execution,更精確來講應該是說「程式碼執行」)
期待一下吧~