モデル・ランカーの概要Compatible with Milvus 2.6.x
従来のベクトル検索は、純粋に数学的な類似性によって結果をランク付けする。効率的ではあるが、このアプローチはしばしば真の意味的関連性を見逃してしまう。例えば、「データベース最適化のベストプラクティス」を検索してみましょう。ベクトル類似度が高く、これらの用語に頻繁に言及している文書を受け取るかもしれませんが、実際には実用的な最適化戦略を提供しているわけではありません。
Model Rankerは、クエリとドキュメント間の意味的関係を理解する高度な言語モデルを統合することで、Milvusの検索を変えます。ベクトル類似度だけに頼るのではなく、コンテンツの意味と文脈を評価し、よりインテリジェントで関連性の高い結果を提供します。
制限事項
モデル・ランカーはグループ化検索では使用できません。
モデル・ランカーに使用されるフィールドはテキスト型(
VARCHAR)でなければなりません。各モデルランカーは、一度に1つのフィールド(
VARCHAR)のみを評価に使用することができます。
仕組み
モデルランカーは明確に定義されたワークフローを通じて、言語モデル理解機能をMilvusの検索プロセスに統合します:
モデルランカーの概要
最初のクエリ:お客様のアプリケーションからMilvusへクエリが送信されます。
ベクトル検索Milvusは標準的なベクトル検索を行い、候補文書を特定します。
候補文書の検索ベクトル類似度に基づいて候補文書の初期セットを特定する。
モデル評価モデルランカー機能はクエリと文書のペアを処理する:
元のクエリと候補文書を外部のモデルサービスに送る。
言語モデルがクエリと各文書の意味的関連性を評価する。
各文書は意味理解に基づく関連性スコアを受け取る
インテリジェントな並べ替え:文書がモデルによって生成された関連性スコアに基づいて並べ替えられる。
向上した結果:アプリケーションはベクトルの類似性だけでなく、意味的な関連性によってランク付けされた結果を受け取ります。
ニーズに合ったモデルプロバイダーを選択
Milvusは以下のリランキング用モデルサービスプロバイダをサポートしており、それぞれ特徴があります:
プロバイダ |
最適 |
特徴 |
使用例 |
|---|---|---|---|
vLLM |
深い意味理解とカスタマイズを必要とする複雑なアプリケーション |
|
法律用語と判例関係を理解するドメイン固有のモデルを展開する法律研究プラットフォーム |
TEI |
効率的なリソース使用による迅速な実装 |
|
標準的な要件で効率的なリランキング機能を必要とするコンテンツ管理システム |
コヒーレ |
信頼性と統合の容易さを優先するエンタープライズ・アプリケーション |
|
一貫したAPIパフォーマンスと多言語製品カタログによる高可用性検索を必要とするEコマースプラットフォーム |
Voyage AI |
特定のパフォーマンスとコンテキストを必要とするRAGアプリケーション |
|
きめ細かなパフォーマンス制御と専門的な意味理解を必要とする、ドキュメントの長さが異なる研究用データベース |
シリコンフロー |
費用対効果を優先する長文のドキュメントを処理するアプリケーション |
|
インテリジェントなセグメンテーションとオーバーラップ制御を必要とする長いマニュアルや論文を処理する技術文書検索システム |
各モデルサービスの実装に関する詳細情報は、専用ドキュメントをご参照ください:
実装
Model Rankerを実装する前に、以下を確認してください:
再ランクされるテキストを含む
VARCHARフィールドを持つMilvusコレクション。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
パラメータ |
必須か? |
説明 |
値 / 例 |
|---|---|---|---|
|
はい |
検索実行時に使用する関数の識別子。 |
|
|
はい |
再ランク付けに使用するテキストフィールドの名前。
|
|
|
はい |
作成する関数のタイプを指定します。 すべてのモデルランカーに対して |
|
|
はい |
モデルベース・リランキング関数の設定を含む辞書。利用可能なパラメータ(キー)はサービスプロバイダによって異なる。 |
|
|
はい |
モデルリランキングを有効にするには、 |
|
|
はい |
リ ラ ンキングに使用す る モデル ・ サービ ス ・ プ ロ バ イ ダー。 |
|
|
はい |
リランキングモデルが関連性スコアの算出に使用するクエリ文字列のリスト。 クエリ文字列の数は、検索操作のクエリ数と正確に一致する必要があります(テキストの代わりにクエリベクタを使用する場合でも)。 |
|
|
はい |
モデルサービスのURL。 |
|
|
いいえ |
1バッチで処理する文書の最大数。値が大きいほどスループットは向上しますが、より多くのメモリを必要とします。 |
|
標準ベクトル検索への適用
モデル・ランカーを定義した後、それを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