Dify 中有自動建立的向量資料庫 (在 Dify 中叫「知識庫」),甚至可以串接 Notion database!今天來實作 RAG,如果不知道什麼是 RAG 的可以參考 Day8 的說明歐~
不知道什麼是 RAG 的可以參考 Day8, Day9 的介紹歐
在 Dify 中,點選知識庫 -> 建立知識庫,可以上傳各種格式的資料 (但沒有 JSON)
將我們在 Day9 爬到的 JSON 檔改成 txt 檔,並且上傳,然後點選下一步
mv edited.json data.txt
左邊是 Dify 自動幫資料分段
如果你不想要用這種分段清洗方式的話,可以選擇自定義,然後將分段識別符號改成 JSON 每一筆資料的結尾。
索引方式的「採用 Q & A 分段模式」表示 Dify 會讓模型將你每一段切好的文件變成一個 Q & A,將他選起來後看到右邊的預覽 QA,不過這個方法會消耗額外的 token,要特別注意
選擇嵌入模型,可以參考〈使用繁體中文評測各家 Embedding 模型的檢索能力〉這篇文章的建議來選
在「檢索設定」這邊可以看到三種檢索方式
你應該會注意到一個酷名詞 "rerank",顧名思義就是重新排序的意思。為什麼需要重新排序呢?因為一開始向量檢索到的資料不一定是最精確的,rerank 模型會對這些檢索到的文件進行近一步評估,根據與查詢關鍵字的相關性重新排序,最後得到最佳的結果。
目前 Dify 支援的 rerank 供應商有 jina, cohere等等
這邊我們選擇混合檢索方法。因為我沒有 rerank 模型,所以使用「加權分數」來調整語意和關鍵詞的比重;Score 閾值表示搜尋關鍵字要和檢索到的文件有多接見才會納入考慮,設定越高意味著你需要搜尋的字串需要更精確。
建立好知識庫後,也可以自己去篩選資料,彈性非常大
建立好的知識庫可以在 Dify 任何有「知識庫」、「知識檢索」、「上下文」等地方使用。舉例來說,在 Agent 編排設定中有一個上下文區塊,點擊新增可以看到剛剛建立的資料庫
(這邊的名字都可以到知識庫中設定)
以下是我的所有設定,我在聊天增強的區塊新有加入「引用和歸屬」,讓 Dify 把查到的資料來源寫出來,如果我的知識庫不只一的檔案,這樣可以加快 Debug 的速度,看是哪邊資料有問題。
讚ㄉ
除了直接上傳檔案,Dify 還有整合 Notion 的 API,不過你會需要額外的設定
請參考官方教學建立一個 Integration
取得 Integration Secret,這個先複製起來
到你的 Notion workspace 找到要整合的頁面,在 Connect to 那邊搜尋 Integration 的名字,連接起來
這邊我建立了一個資料庫 (database) 來測試,名字為「水果自我介紹」,內容則是請 gpt-4o-mini
幫我想水果的自我介紹
設定 -> 資料來源 -> 新增工作空間
然後就會跳出以下錯誤
{"error":"invalid_request","error_description":"query failed validation: query.client_id should be a string or `undefined`, instead was `0`.","request_id":"5965c278-11fe-4766-b70c-2f8c1d6211ed"}
這是因為我們在啟動 Docker 的時候就要在 dify/docker/.env
中設定,這邊需要回到你啟動 dify 的地方,我剛剛選擇的 integration type 是 internal 所以將 NOTION_INTEGRATION_TYPE
改成 internal,然後在 NOTION_INTERNAL_SECRET
填入剛剛的 secret token。
# ------------------------------
# Notion Integration Configuration
# Variables can be obtained by applying for Notion integration: https://www.notion.so/my-integrations
# ------------------------------
# Configure as "public" or "internal".
# Since Notion's OAuth redirect URL only supports HTTPS,
# if deploying locally, please use Notion's internal integration.
NOTION_INTEGRATION_TYPE=public
# Notion OAuth client secret (used for public integration type)
NOTION_CLIENT_SECRET=
# Notion OAuth client id (used for public integration type)
NOTION_CLIENT_ID=
# Notion internal integration secret.
# If the value of NOTION_INTEGRATION_TYPE is "internal",
# you need to configure this variable.
NOTION_INTERNAL_SECRET=secret_xxxx
然後重新啟動服務
docker compose down
docker compose up -d
再回來看資料來源就可以看到你的空間了,
我們可以為這個水果自我介紹資料庫建立一個知識庫,你可以選擇要加入哪些資料庫的哪些頁面,這邊我們全部加入
將這個資料庫放到昨天的水果機器人
效果如下
不知道為什麼我把 Notion 加進來之後,Dify 的 ocntainer 就無法連接我電腦內部的 API QQ,其他功能都能用不過自定 API 和 Ollama 就不行,所以我後來又重置了 Dify。我直接連同 dify 目錄中的 volume 一起刪掉了 (真的不知道怎麼辦) 在 dify/docker/volumes
底下。結果最後發現可能是 Orbstack 的問題,因為我所有 docker 的服務都無法連接到主機,但我停止 Orbstack 改成用 docker desktop 就可以了,我的青春時間QQ
有了 Dify 我們可以很快就做出 RAG 的 PoC (概念驗證, Proof of Concept),甚至可以結合 Notion 的 database,這對有些新創、小團隊使用 Notion 來管理公司的單位,真的十分方便~
做到一半的時候發現自定義 API 不斷發生 503 error,查看 docker log、檢查 FastAPI 服務,都沒有發現錯誤,直到我想到測試同樣也是使用 docker 啟動的 Open WebUI 時,才發現原來是我的 Orbstack 出問題
最近好多事情要處理,社團的專案、學生自治組織的活動、公司實習、推甄、打工還有課業,希望我能堅持到 30 天TT,現在放棄還太早了海狸大師!!
基本的 Dify 功能都認識完了,明天會開始使用工作流 (workflow) 來玩玩更複雜的應用,雖然說複雜但 還是比 LangChain 好 能做到的事情也更多了!期待一下吧~