iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
生成式 AI

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

【Day17】Dify 入門 (3):使用知識庫來做 RAG 並結合 Notion database

  • 分享至 

  • xImage
  •  

前言

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 閾值表示搜尋關鍵字要和檢索到的文件有多接見才會納入考慮,設定越高意味著你需要搜尋的字串需要更精確。

建立好知識庫後,也可以自己去篩選資料,彈性非常大

在 Agent 中使用吧!

建立好的知識庫可以在 Dify 任何有「知識庫」、「知識檢索」、「上下文」等地方使用。舉例來說,在 Agent 編排設定中有一個上下文區塊,點擊新增可以看到剛剛建立的資料庫


(這邊的名字都可以到知識庫中設定)

以下是我的所有設定,我在聊天增強的區塊新有加入「引用和歸屬」,讓 Dify 把查到的資料來源寫出來,如果我的知識庫不只一的檔案,這樣可以加快 Debug 的速度,看是哪邊資料有問題。

讚ㄉ

串接 Notion

除了直接上傳檔案,Dify 還有整合 Notion 的 API,不過你會需要額外的設定

申請 Integration

請參考官方教學建立一個 Integration

取得 Integration Secret,這個先複製起來

到你的 Notion workspace 找到要整合的頁面,在 Connect to 那邊搜尋 Integration 的名字,連接起來

建立資料庫

這邊我建立了一個資料庫 (database) 來測試,名字為「水果自我介紹」,內容則是請 gpt-4o-mini 幫我想水果的自我介紹

Dify 設定 Notion 資料庫

設定 -> 資料來源 -> 新增工作空間

然後就會跳出以下錯誤

{"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

再回來看資料來源就可以看到你的空間了,

我們可以為這個水果自我介紹資料庫建立一個知識庫,你可以選擇要加入哪些資料庫的哪些頁面,這邊我們全部加入

將這個資料庫放到昨天的水果機器人

效果如下

踩到的坑 (Docker 網路相關)

不知道為什麼我把 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 好 能做到的事情也更多了!期待一下吧~


上一篇
【Day16】Dify 入門 (2):讓 Agent 使用自定義工具吧!(內含一咪咪 FastAPI)
下一篇
【Day18】Dify 工作流 (1):工作流基本介紹 (Chatflow, Workflow)
系列文
Python 新手的 AI 之旅:從零開始打造屬於你的 AI / LLM 應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言