模型排名器概述Compatible with Milvus 2.6.x

傳統的向量搜尋純粹依據數學上的相似度來排序結果——即向量在高維空間中的匹配程度。雖然這種方法效率很高,但往往會忽略真正的語義相關性。以搜尋「資料庫優化的最佳實踐」為例:您可能會收到向量相似度很高、且頻繁提及這些術語的文件,但這些文件實際上並未提供可付諸實行的優化策略。

Model Ranker 透過整合能理解查詢與文件之間語義關係的先進語言模型,徹底革新了 Milvus 的搜尋方式。它不再僅依賴向量相似度,而是評估內容的意義與上下文,從而提供更智能、更相關的搜尋結果。

限制

  • 模型排序器無法與分組搜尋功能併用。

  • 用於模型重新排序的欄位必須為文字類型(VARCHAR )。

  • 每個模型重新排序器每次僅能使用一個VARCHAR 欄位進行評估。

運作原理

模型排序器透過一套明確定義的工作流程,將語言模型的理解能力整合至 Milvus 搜尋流程中:

Model Ranker Overview 模型排名器概覽

  1. 初始查詢:您的應用程式將查詢傳送至 Milvus

  2. 向量搜尋:Milvus 執行標準向量搜尋以識別候選文件

  3. 候選文件檢索:系統根據向量相似度識別出初始候選文件集

  4. 模型評估:模型排序器函式處理查詢-文件配對:

    • 將原始查詢與候選文件傳送至外部模型服務

    • 語言模型評估查詢與每份文件之間的語義相關性

    • 每份文件會根據語義理解獲得相關性分數

  5. 智慧重新排序:根據模型產生的相關性分數,重新排列文件順序

  6. 強化搜尋結果:您的應用程式將收到依語義相關性排序的結果,而非僅依向量相似度排序

根據您的需求選擇模型供應商

Milvus 支援以下用於重新排序的模型服務供應商,各家皆具備獨特特性:

供應商

最適合

特點

應用範例

vLLM

需要深度語義理解與客製化的複雜應用

  • 支援各種大型語言模型

  • 靈活的部署選項

  • 更高的運算需求

  • 更大的客製化潛力

部署了能理解法律術語與判例法之間關係的領域專用模型之法律研究平台

TEI

快速實施且資源利用率高

  • 針對文字處理進行優化的輕量級服務

  • 部署更簡便,資源需求更低

  • 預先優化的重新排序模型

  • 基礎架構開銷極低

需要高效重新排序功能且符合標準要求的內容管理系統

Cohere

優先考量可靠性與整合便利性的企業級應用程式

  • 企業級的可靠性與可擴展性

  • 無需維護基礎架構的託管服務

  • 多語言重新排序功能

  • 內建流量限制與錯誤處理機制

需要高可用性搜尋功能、穩定 API 效能及多語言產品目錄的電子商務平台

Voyage AI

具有特定效能與語境需求的 RAG 應用程式

  • 專為重新排序任務訓練的模型

  • 針對不同文件長度的細粒度截斷控制

  • 針對生產環境工作負載進行優化的推論

  • 多種模型變體(rerank-2、rerank-lite 等)

包含不同文件長度的研究資料庫,需要精細調校的效能控制與專業的語義理解

SiliconFlow

以成本效益為優先考量,處理長篇文件之應用

  • 具備可配置重疊度的進階文件分塊功能

  • 基於區塊的評分(得分最高的區塊代表該文件)

  • 支援多種重新排序模型

  • 提供標準版與專業版兩種方案,兼具成本效益

技術文件搜尋系統,專門處理需要智慧分割與重疊控制的長篇手冊及論文

Hugging Face

採用 Hugging Face 託管式句子相似度模型的應用程式

  • 採用託管式hf-inference 服務提供者

  • 從 Hugging Face Hub 選取模型

  • 針對每個候選句計算一個句子相似度分數

  • 採用 API 金鑰驗證

希望利用 Hugging Face 模型對候選文字進行重新排序,卻無需自行運作獨立推論服務的語義搜尋應用程式

有關各模型服務實作的詳細資訊,請參閱專用文件:

實作

在實作 Model Ranker 之前,請確保您已具備:

  • 一個 Milvus 集合,其中包含名為 `VARCHAR ` 的欄位,該欄位存有待重新排序的文字

  • 一個可由您的 Milvus 實例存取且正在運行的外部模型服務

  • Milvus 與您選用的模型服務之間具備適當的網路連線

模型排序器可與標準向量搜尋及混合搜尋操作無縫整合。實作過程涉及建立一個 Function 物件來定義您的重新排序設定,並將其傳遞給搜尋操作。

建立模型排序器

要實作模型重新排序,首先需定義一個具有適當配置的 Function 物件。在此範例中,我們使用 TEI 作為服務提供者:

from pymilvus import MilvusClient, Function, FunctionType

# Connect to your Milvus server
client = MilvusClient(
    uri="http://localhost:19530"  # Replace with your Milvus server URI
)

# Create a model ranker function
model_ranker = Function(
    name="semantic_ranker",  # Function identifier
    input_field_names=["document"],  # VARCHAR field to use for reranking
    function_type=FunctionType.RERANK,  # Must be set to RERANK
    params={
        "reranker": "model",  # Specify model reranker. Must be "model"
        "provider": "tei",  # Choose provider: "tei", "vllm", etc.
        "queries": ["machine learning for time series"],  # Query text
        "endpoint": "http://model-service:8080",  # Model service endpoint
        # "maxBatch": 32  # Optional: batch size for processing
    }
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.ranker.ModelRanker;

MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
        .uri("http://localhost:19530")
        .build());

ModelRanker ranker = ModelRanker.builder()
        .name("semantic_ranker")
        .inputFieldNames(Collections.singletonList("document"))
        .provider("tei")
        .queries(Collections.singletonList("machine learning for time series"))
        .endpoint("http://model-service:8080")
        .build();
// nodejs
// go
# restful

參數

是否必填?

說明

值 / 範例

name

是

執行搜尋時用於識別您的函式的標識符。

"semantic_ranker"

input_field_names

是

用於重新排序的文字欄位名稱。

必須為VARCHAR 類型的欄位。

["document"]

function_type

是

指定正在建立的函數類型。

對於所有模型排名器,此參數必須設定為「RERANK 」。

FunctionType.RERANK

params

是

一個包含基於模型的重新排序函數配置的字典。可用的參數(鍵)會因服務提供者而異。

{...}

params.reranker

是

必須設定為 `"model" ` 才能啟用模型重新排序。

"model"

params.provider

是

用於重新排序的模型服務提供者。

"tei"

params.queries

是

重新排序模型用於計算相關性分數的查詢字串清單。

查詢字串的數量必須與搜尋操作中的查詢數量完全相符(即使使用查詢向量而非文字),否則將回報錯誤。

["search query"]

params.endpoint

是

模型服務的 URL。

"http://localhost:8080"

max_client_batch_size

否

單批次中最多可處理的文件數量。較大的數值會提高吞吐量,但需要更多記憶體。

32 (預設)

定義模型排序器後,您可透過將其傳遞至 `ranker` 參數,在搜尋操作中套用該模型:

# Use the model ranker in standard vector search
results = client.search(
    collection_name,
    data=[your_query_vector], # Number of query vectors must match that specified in model_ranker.params["queries"] 
    anns_field="vector_field",
    limit=10,
    output_fields=["document"],  # Include the text field in outputs
    ranker=model_ranker,  # Apply the model ranker here
    consistency_level="Bounded"
)
import io.milvus.v2.common.ConsistencyLevel;
import io.milvus.v2.service.vector.request.SearchReq;
import io.milvus.v2.service.vector.response.SearchResp;
import io.milvus.v2.service.vector.request.data.EmbeddedText;

SearchReq searchReq = SearchReq.builder()
        .collectionName(COLLECTION_NAME)
        .data(Collections.singletonList(new EmbeddedText("machine learning for time series")))
        .annsField("vector_field")
        .limit(10)
        .outputFields(Collections.singletonList(document))
        .functionScore(FunctionScore.builder()
                .addFunction(ranker)
                .build())
        .consistencyLevel(ConsistencyLevel.BOUNDED)
        .build();
SearchResp searchResp = client.search(searchReq);
// nodejs
// go
# restful

翻譯者DeepL

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?