昨天已經帶大家用工作流做一個「思考」並「翻譯」的機器人,今天我們一樣用 Day9 宿舍資料的例子來做一個 RAG 的機器人,並且機器人在推論之前會先分類問題,讓回應更精確。
我可以先將使用者的問題先分為不同的類別 (e.g. 房間維修、網路故障、規則規範、室友問題等等) 。如果我問了「房間燈壞了」這樣的問題,透過問題分類,系統將此問題分類為房間維修問題,並在維修相關的資料庫中進行檢索,避免檢索到其他無關資訊。當然,也可以把不相關的問題排除掉,等等的例子就會看到了。
接下來就來認識 Dify 中的「知識檢索」和「問題分類」節點吧!
建立一個新的 Chatflow,然後右鍵選擇新增「知識檢索」
記得要先在知識庫中上傳資料,上傳的教學可以參考 Day17 的內容
點擊 + 來把宿舍資料新增上去
其他設定基本上都和 Day17 一樣,你也可以修改混合檢索的權重
查詢變量這邊放的通常是前一個節點的結果,或者使用者的提問,端看使用情境有所不同。
在問題分類節點可以自行定義問題的類別,以及要用什麼模型來分類,因為問題分類是相對簡單的任務,所以我這邊用的是 Groq 的 API (Groq 的 LPU 可以讓模型推論速度非常快)。如果把記憶功能打開,那模型就會根據你的聊天記錄來分類問題。
高級指令可以當作一個補充說明,讓問題分類更明確。
你可能會想說,為啥還要有記憶功能?根據使用者的提問來分類問題不就好了?有這樣的疑問表示開發經驗不夠多~舉個例子好了,當使用者詢問「你能幫我查機票嗎?」接著再問「最近有特價嗎?」,如果沒有記憶功能,模型可能無法將「特價」和「機票」或者「機場」聯繫起來。
然後來觀察節點,會發現出現分支了,也就是說,我們可以根據不同的問題類別來設計客製化的 Prompt、工具使用等等,是一個 LLM 系統「好壞」的關鍵點。
我們先將剛剛分類的問題分類器接到開始,然後在「其他問題」的類別接上一個 LLM,就叫它「其他問題 LLM」,然後接上一個直接回覆
記得設定知識檢索的查詢變量,這邊是 sys.query
也就是使用者的輸入
在這個「其他問題 LLM」加上對應的 prompt
這樣的接法可以避免使用者問了沒有相關的問題,但出現 LLM「已讀亂查」的情況,也能讓白目使用者知道自己問的東西與宿舍無關。
接著在與宿舍有關的問題這邊,接上知識檢索節點,和一個「宿舍問題 LLM」以及對應的「直接回覆」
設定「宿舍問題 LLM」的上下文,這邊我希望上下文為知識檢索到的結果
一樣如果不知道怎麼寫 Prompt,可以用 Dify 內建的 Prompt generator 或者 Day12 提到的工具,以下是我用 Anthropic prompt generator 生成的提示詞
你是一個專門回答宿舍問題的AI助手。你的任務是根據提供的背景資訊(context)來回答用戶的問題(query)。請使用繁體中文回答,並保持友善、專業的態度。 以下是相關的背景資訊: <context> {$CONTEXT} </context> 用戶的問題是: <query> {$QUERY} </query> 請仔細閱讀背景資訊和用戶的問題。分析資訊中與問題相關的部分,並組織一個清晰、準確的回答。如果背景資訊中沒有足夠的資料來完整回答問題,請誠實地說明你無法回答該部分,並只提供你能確定的資訊。 在回答時,請遵循以下指引: 1. 使用繁體中文 2. 保持禮貌和專業 3. 盡可能提供具體和實用的資訊 4. 如果問題涉及多個方面,可以分點回答 5. 避免使用過於複雜的術語,保持語言通俗易懂 請將你的回答放在<answer>標籤內。不要重複問題或背景資訊,直接開始你的回答。 記住,只根據提供的背景資訊回答。如果資訊不足,請誠實地說明,不要編造或猜測資訊。
記得在 SYSTEM prompt 的 context 這邊加入上下文。還有一個值得注意的點,因為 Dify 的 LLM prompt 已經幫我們分好 user, system, assistant 了,所以這邊我把 prompt generator 生成的 <query>
部分刪掉,只保留人設的部分;也將 <answer>
標籤相關的說明刪除。
問題:「我想要財富自由啊啊啊」
可以看到綠色的框框就是資料流動的方向,這邊成功分類問題,而且給使用者相對應的提示
然後我問了跟活動相關的,成功分類 + 檢索
不過如果你也是住在成大宿舍,就知道根本沒有什麼所謂的 K 書活動、幹部訓練等等 (還 105 個人??三小?現在學生自治的意願都很低餒 QQ)。遇到這種問題,你可以點擊工作流的「檢視日誌」去查看每一個節點發生的事情
按下「追蹤」
然後選擇知識檢索
就會發現,靠,是真的有這筆資料,真的有 105 個人參與幹部訓練 🤨🤨
這時候我再到官網上去查,真的有這個活動不過已經是民國 96 年發生的事了,我那時候根本連電腦是啥都不知道吧哈哈哈啊。
不過這也透露一個訊息,這個 "bug" 是出自於「資料錯誤」而不是「流程錯誤」,至少我們釐清問題點了。如果你使用的是 LangChain,也有對應的測試 log 套件可以用,像是 LangSmith 可以追蹤每個 Chain 發生的問題。追蹤測試過程是開發大型 LLM 應用很重要的一環。
最後再分享一個小東西,按下右鍵可以新增便條紙
和其他人協作時,可以一目了然現在的情況
看到這邊基本上你已經可以用 Dify 獨立做出很多應用了,像是幫企業網站做機器人、法規資料庫查詢機器人等等應用。我真的太喜歡 Dify 了 🫶🦙。
明天要來介紹更進階的邏輯和轉換部分,看似死板的 No code 工具其實還是蠻有彈性的,期待一下吧~