:::

自行架設Dify使用的重排序模型:Text Embeddings Inference / Self-Hosting a Dify Reranking Model: Text Embeddings Inference

5月 12, 2025 , , 4 Comments Edit Copy Download

2025-0109-003246.png

隨著在Dify使用的知識庫越來越多,傳統的用相似度來計算權重分數的做法已經不敷使用,而使用重排序模型來排序檢索結果順序的做法也越來越受歡迎。這次我們來架設HuggingFace推出的Text Embeddings Inference,並讓Dify能用它來做重排序吧。

As the knowledge base used in Dify grows, the traditional method of calculating weight scores based on similarity is becoming inadequate.  Using reranking models to reorder retrieval results is gaining popularity.  Let's set up HuggingFace's Text Embeddings Inference and integrate it into Dify for reranking.


重排序模型 / Rerank Model

2025-0108-231946.png

https://docs.dify.ai/learn-more/extended-reading/retrieval-augment/rerank

重排序模型,有時稱為 Rerank Model 、 Reranking Model,以下則稱之為 Reranker,這是一種用於提升資訊檢索系統效能的模型。在檢索增強生成 (Retrieval-augmented generation, RAG ) 的過程中,文字被嵌入模型 (Embedding Model)轉換為語意向量,而檢索回來的結果會依照查詢語句跟檢索結果的語意向量來進行餘弦相似度的計算,以此來進行結果的排序。

然而,上述的排序方式僅限於查詢語句跟檢索結果本身,往往無法考慮到背後的情境脈絡。這時候 Reranker 擁有深度學習模型的知識就能彌補這個缺憾。Reranker的運作分成兩個階段進行:

  1. 初始檢索:檢索系統運用傳統的資訊檢索技術,例如BM25、TF-IDF或是向量的餘弦相似度,從大量文件中找到跟查詢語句相關的文件。至此跟傳統資訊檢索的做法很類似。
  2. 重新排序:將查詢語句與檢索結果輸入到 Reranker ,請它用深度模型學習到的知識來重新排序檢索到的文件,最後輸出每份文件的相關分數。而檢索結果便可依照相關分數來遞減排序,使得Reranker認為最相關的結果排序在前面。

開放原始碼的重排序模型 / Open Source Reranker Model

在Reranker概念興起的時候,大多都是VoyageCohere等商用付費方案。後來總算是有一些開源的模型可供使用,而現在更是有許多框架能讓我們輕鬆架設Hugging Face上的Reranker。

https://github.com/huggingface/text-embeddings-inference?tab=readme-ov-file#text-embeddings-inference

https://github.com/huggingface/text-embeddings-inference?tab=readme-ov-file#text-embeddings-inference 

Text Embeddings Inference (TEI) 專案是一個由 Hugging Face 開發的工具包,專為部署和服務開源文字嵌入模型而設計。這個專案旨在提供一個更有效率的解決方案,讓使用者能夠快速且有效率地從各種模型中提取語意向量 (embedding),同時也能夠使用 Reranker來改善檢索結果的排序。TEI 的設計就是將上述功能封裝成 API 端點,方便使用者在其他系統 (例如Dify) 呼叫 TEI,以此使用Embedding模型和Reranker。

https://huggingface.co/BAAI/bge-reranker-large

https://huggingface.co/BAAI/bge-reranker-large 

在各種開源的Reranker中,BAAI/bge-reranker-large 模型就是其中一個知名的代表。它是由北京智源人工智慧研究院 (BAAI) 開發的 BGE (BAAI General Embedding) 系列模型中的一個重要成員。它是一個輕量級的重新排序模型,專門用於改善資訊檢索系統的效能。此模型的設計目標是提供一個既準確又更有效率的解決方案,能在初步檢索後,對候選檔案進行更精細的排序,確保最相關的檔案優先呈現。由於其參數規模相對較小,部署和推論速度都很快,非常適合在資源有限的環境中使用。

由於我們要處理的文件大多是以中文為主,Reranker也需要具備能夠理解中文的能力。而 bge-reranker-large 支援多種語言,可以處理中文和英文等語境,確實適用於多語言的應用情境。


用Docker Compose架設 Text Embeddings Inference / Setting Up Text Embeddings Inference with Docker Compose

2025-0108-234547.png

Text Embeddings Inference的架設可以用Docker來配置。以下我們用docker-compose.yml來取得Text Embeddings Inference CPU版本的映像檔,並且指定它準備好BAAI/bge-reranker-large 模型:

version: "3.9"
services:
  api:
    image: ghcr.io/huggingface/text-embeddings-inference:cpu-1.6
    ports:
      - 8080:80
    environment:
      - MODEL_ID=BAAI/bge-reranker-large
    volumes:
      - ./data:/data

其中紅字的8080為對外的接口,請根據你的需求來調整。

而藍字的BAAI/bge-reranker-large則是Reranker的ID。它可以對應到Hugging Face的模型保存庫:

https://huggingface.co/BAAI/bge-reranker-large 

https://huggingface.co/models?pipeline_tag=sentence-similarity&sort=trending

https://huggingface.co/models?pipeline_tag=sentence-similarity&sort=trending 

如果你想要嘗試其他模型,可以在Hugging Face搜尋Sentence Similarity來看看其他模型。

2025-0108-235230.png

設定好這樣就能用「docker compose up」指令,讓Text Embeddings Inference開始運作。一開始容器會先花一些時間下載模型,而模型會擺在該目錄底下的data資料夾中。

2025-0108-235346.png

看到「Starting HTTP server: 0.0.0.0:80」,就表示Text Embeddings Inference已經準備好了。如果你的網站IP是192.168.100.100,那你就能用以下網址來使用Text Embeddings Inference: http://192.168.100.100:8080 


以Text Embeddings Inference作為Dify的重排序模型 / Reranking Model in Dify Using Text Embeddings Inference

接下來我們到Dify裡面設定Reranker,詳細步驟分成連接Reranker與使用Reranker兩部分。讓我們一個一個來看怎麽操作吧。

連接 Reranker / Set Reranker as Model Provider

2025-0108-235633.png

(1) 按右上角的帳號,(2) 開啟 Settings。

2025-0108-235725.png

(1) 在「Model Provider」裡面,(2) 滑鼠移到Text Embedding Inference,按下「+ Add Model」按鈕。

2025-0108-235841.png

在設定對話視窗裡面進行以下操作:

  1. 選擇Rerank。
  2. 輸入模型名稱:BAAI/bge-reranker-large 。
  3. 輸入網址: http://192.168.100.100:8080 
  4. 按「Save」儲存。

2025-0108-235959.png

看到 Model Provider 開頭有 Text Embeddings Inference ,並能夠顯示你剛剛設定的模型,那就表示 Dify 已經準備好可以使用這個 Reranker 了。

在知識庫使用 Reranker / Using Reranker in the Knowledge Base

2025-0109-000306.png

(1) 接下來我們來到知識庫 (Knowledge),(2) 按「Create Knowledge」新增知識庫。

2025-0109-000530.png

上傳「中國編目規則第三版 1. 總則.pdf」作為知識庫看看。

2025-0109-000708.png

在Retrieval Setting裡面,我們就能選擇 BAAI/bge-reranker-large 作為我們的 Rerank Model。我通常會把 Top K設成最高的 10,其他設定就依照大家各自的需求來調整吧。

2025-0109-000941.png

接下來花點時間等待Embedding Model的處理。

2025-0109-002312.png

總算是將文字向量 (Embedding) 處理好了。

2025-0109-002420.png

(1) 接下來我們可以進入Retrieval Test 來測試, (2) 在Source Text 輸入要檢索的文字,例如「作者」。實際上編目規則不會寫「作者」,而只會寫「著者」。(3) 按下「Test」,(4) 右側顯示的檢索,可以注意到檢索到的大多是包含「著者敘述」的片段。

2025-0109-002725.png

此時Text Embeddings Inference也會出現執行rerank的訊息。這就表示此檢索的確是結合了Reranker重排的結果。


結語 / Conclusion

Reranker模型在許多評比上都被人聲稱能帶來錦上添花的效果,但Reranker真的有這麼好嗎?就我個人的感覺來看,其實大多時候使用加權分數排序的做法,就已經能夠達到不錯的效果。使用Reranker只是重新排序檢索到的文件順序,但如果你都會把10份文件丟給大型語言模型參考,那麼文件的順序其實不會帶來很大的影響。

https://jina.ai/reranker/

https://jina.ai/reranker/ 

比起檢索結果的排序,影響更大的可能是檢索效率的降低。一開始我使用的是Jina Reranker的免費 API。雖然可以用,但每次送出請求跟等到回應的速度實在是太慢了。再加上對於大型語言模型的生成結果也看不太出來有什麼很大的影響,使得我一度放棄 Reranker,使用傳統的加權分數就好。

2025-0109-001633.png

https://dify.ai/blog/introducing-parent-child-retrieval-for-enhanced-knowledge 

最近則是在測試 Dify 1.5 的親子檢索 (Parent-Child Retrieval)功能。該功能主要目的是改善分段 (chunking) 的方式,同時採用較大範圍的 Parent Chunking 跟細部的 Child Chunking 兩種形式,以此改善RAG裡脈絡被分段過程破壞的問題。此做法的Child Chunks 分段數量會顯著增加,我就想說該來重新拾回 Reranker 看看,會不會讓親子檢索的效益變得更好。

跟Jina Reranker相比,至少Text Embeddings Inference執行Reranker的速度顯著地快得多,並沒有很明顯的延遲感。儘管 Reranker 對 RAG 的影響還需要更多的評估,但目前看起來使用Text Embeddings Inference 來做 Reranker,至少不會阻礙RAG的使用,那就夠了。


那這篇關於使用Text Embeddings Inference架設Reranker的介紹就到此為止了。文章的最後要來問的是:你覺得自己架設好呢,還是使用別人的服務好呢?

  • 1. 自己架設比較好:可以掌控所有設定。
  • 2. 自己架設比較好:我的電腦效能超強,就是為了跑AI。
  • 3. 用別人的服務比較好:租用服務的硬體效能好,比自己買還省錢。
  • 4. 用別人的服務比較好:租用服務的設定都準備好了,不用我自己操心。
  • 5. 其他:歡迎在下面留言,分享你的想法吧!

總共4 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 補充一下使用Rerank模型的一些經驗:

    1. 如果有多重檢索結果的時候,很適合用Rerank再重新排序過。

    例如我們可能會檢索向量資料庫、也會檢索網路搜尋引擎,這時候就可以將兩個不同來源的檢索結果,放到Rerank去重新排序。
    不過如果LLM允許的token數量足夠多的話,我之前都是不重新排序,兩種結果通通丟給LLM。

    2. TEI的Reranker還是很容易當機

    如果一段時間沒有使用,TEI會把Reranker暫停。下次要使用的時候需要一點時間喚醒,結果就容易讓Reranker這個步驟失敗。
    不知道有沒有更好用的reranker provider可以使用?

    回覆刪除
  2. 請問如果有兩個模型,是不是在docker 這樣寫呢?
    services:
    api:
    image: ghcr.io/huggingface/text-embeddings-inference:cpu-1.6
    container_name: tei
    # ports:
    # - 8080:80
    environment:
    - MODEL_ID=BAAI/bge-reranker-v2-m3
    - MODEL_ID=BAAI/bge-m3
    volumes:
    - data:/data
    networks:
    docker_vlan5x:
    ipv4_address: 192.168.5.210
    networks:
    docker_vlan5x:
    external: true
    volumes:
    data:

    回覆刪除
    回覆
    1. 您好,

      我記得TEI不能同時載入兩個不同的模型。
      所以最好的做法是啟動兩個不同的Docker容器,用不同的port或IP去取用不同的模型。

      刪除
  3. 自行架設Dify使用的重排序模型:Text Embeddings Inference
    https://www.youtube.com/watch?v=sOq0fTUosAo&list=PLKnvkZ00-pHr7aQ_bHKC1gjzLXnbR2Cmk&index=3

    ----

    「布丁布丁聽什麼?」是結合Google NotebookLM生成的實驗性節目。

    主要的內容來自於布丁撰寫的BLOG
    - 布丁布丁吃什麼? https://blog.pulipuli.info

    收聽方式:
    - YouTube Podcast: https://www.youtube.com/playlist?list=PLKnvkZ00-pHr7aQ_bHKC1gjzLXnbR2Cmk
    - SoundOn Podcast: https://sndn.link/pulipuli

    回覆刪除