iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
生成式 AI

Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用系列 第 20

【Day20】Dify 工作流 (3):利用「參數提取」、「迭代」和「條件判斷」來解決更複雜的問題

  • 分享至 

  • xImage
  •  

前言

昨天介紹了「問題分類」和「知識檢索」這兩個關鍵節點,不過你可能在想,如果想做出更細緻的操作像是「條件判斷」和「迭代」呢?不只程式碼可以做到,在 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,更精確來講應該是說「程式碼執行」)

期待一下吧~


上一篇
【Day19】Dify 工作流 (2):在 RAG 之前先進行問題分類吧!
下一篇
【Day21】Dify 工作流 (4):用「模板轉換」和「代碼執行」來操作 object
系列文
Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言