Milvus 2.5のご紹介:全文検索、より強力なメタデータフィルタリング、ユーザビリティの向上!
概要
Milvusの最新バージョン2.5では、レキシカル検索やキーワード検索とも呼ばれる全文検索という強力な新機能が追加されました。全文検索とは、Googleで検索するのと同じように、特定の単語やフレーズを検索して文書を見つけることができる機能です。これは、単に正確な単語と一致させるのではなく、検索の背後にある意味を理解する、当社の既存のセマンティック検索機能を補完するものです。
文書の類似性には業界標準のBM25メトリックを使用しており、我々の実装はスパースベクトルに基づいているため、より効率的な保存と検索が可能です。スパースベクトルとは、ほとんどの値がゼロであるテキストを表現する方法であり、保存や処理を非常に効率的に行うことができる。このアプローチは、ベクトルを検索の中核とするmilvusの製品哲学によく適合している。
さらに、我々の実装の特筆すべき点は、ユーザーが最初にテキストをスパースベクトルに手動で変換するのではなく、テキストを直接挿入してクエリできることです。これにより、Milvusは非構造化データの完全処理に一歩近づいた。
しかし、これは始まりに過ぎない。2.5のリリースに伴い、Milvusの製品ロードマップを更新しました。Milvusの今後の製品リリースでは、Milvusの機能を4つの主要な方向性で進化させることに焦点を当てます:
- 非構造化データ処理の合理化;
- 検索の質と効率の向上
- より容易なデータ管理
- アルゴリズムと設計の進歩によるコスト削減
私たちの目標は、AI時代に情報を効率的に保存し、効率的に検索できるデータインフラを構築することです。
スパースBM25による全文検索
セマンティック検索は通常、文脈認識や意図理解に優れているが、ユーザーが特定の固有名詞やシリアル番号、完全に一致するフレーズを検索する必要がある場合、キーワードマッチングによる全文検索の方がより正確な結果を得られることが多い。
例で説明しよう:
- セマンティック検索は、"再生可能エネルギーソリューションに関する文書を探す "といった場合に優れています。
- テスラ・モデル3 2024に言及した文書を探す "場合は全文検索の方が優れている。
以前のバージョン(Milvus 2.4)では、ユーザーは検索する前に自分のマシンで別のツール(PyMilvusのBM25EmbeddingFunctionモジュール)を使ってテキストを前処理する必要がありました。 このアプローチにはいくつかの制限がありました。増大するデータセットをうまく扱えない、余分なセットアップステップが必要、プロセス全体が必要以上に複雑になる、などです。技術的には、1台のマシンでしか動作しないこと、BM25のスコアリングに使用される語彙やその他のコーパスの統計は、コーパスが変更されると更新できないこと、クライアント側でテキストをベクトルに変換するのは、テキストを直接扱うより直感的でないこと、などが主な制限でした。
Milvus2.5はすべてを簡素化します。テキストを直接扱うことができます:
- 元のテキスト文書をそのまま保存
- 自然言語クエリを使った検索
- 結果を読みやすい形で返す
Milvusは、複雑なベクトル変換をすべて自動で行い、テキストデータの取り扱いをより簡単にします。これは私たちが "Doc in, Doc out "と呼んでいるアプローチで、お客様は読みやすいテキストで作業し、残りは私たちが処理します。
技術的な実装
Milvus 2.5では、組み込みのSparse-BM25実装により、以下のような全文検索機能が追加されました:
- tantivyで構築されたトークナイザー:Milvusはtantivyエコシステムと統合されました。
- 生文書の取り込みと検索機能:テキストデータの直接取り込みとクエリのサポート
- BM25関連性スコアリング:スパースベクトルに基づいて実装されたBM25スコアリングの内部化
私たちは、発達したtantivyエコシステムと連携することを選択し、milvusテキストトークナイザをtantivy上に構築しました。将来的には、Milvusはより多くのトークナイザーをサポートし、ユーザーが検索品質をより理解できるようにトークン化プロセスを公開する予定である。また、全文検索のパフォーマンスをさらに最適化するために、ディープラーニングベースのトークナイザーやステマーストラテジーを探求していきます。以下は、トークナイザーの使用と設定のためのサンプルコードです:
# Tokenizer configuration
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=65535,
enable_analyzer=True, # Enable tokenizer on this column
analyzer_params={"type": "english"}, # Configure tokenizer parameters, here we choose the english template, fine-grained configuration is also supported
enable_match=True, # Build an inverted index for Text_Match
)
コレクションスキーマでトークナイザーを設定した後、ユーザーは add_function メソッドで bm25 関数にテキストを登録できます。これはMilvusサーバ内部で実行されます。追加、削除、変更、クエリなどの後続のデータフローは、ベクトル表現ではなく、生のテキスト文字列を操作することで完了します。新APIによるテキスト取り込みと全文検索の方法については以下のコード例を参照:
# Define the mapping relationship between raw text data and vectors on the schema
bm25_function = Function(
name="text_bm25_emb",
input_field_names=["text"], # Input text field
output_field_names=["sparse"], # Internal mapping sparse vector field
function_type=FunctionType.BM25, # Model for processing mapping relationship
)
schema.add_function(bm25_function)
...
# Support for raw text in/out
MilvusClient.insert('demo', [
{'text': 'Artificial intelligence was founded as an academic discipline in 1956.'},
{'text': 'Alan Turing was the first person to conduct substantial research in AI.'},
{'text': 'Born in Maida Vale, London, Turing was raised in southern England.'},
])
MilvusClient.search(
collection_name='demo',
data=['Who started AI research?'],
anns_field='sparse',
limit=3
)
Sparse-BM25と呼ばれる、クエリとドキュメントをスパースベクトルとして表現するBM25関連性スコアリングの実装を採用しました。これにより、以下のようなスパースベクトルに基づく多くの最適化が可能になる:
Milvusは最先端のSparse-BM25実装により、ベクトルデータベースアーキテクチャに全文検索を統合したハイブリッド検索機能を実現している。Sparse-BM25は、用語頻度を従来の転置インデックスではなくスパースベクトルとして表現することで、グラフインデックス、積量子化(PQ)、スカラー量子化(SQ)などの高度な最適化を可能にします。これらの最適化により、メモリ使用量を最小化し、検索性能を高速化する。転置インデックスアプローチと同様に、Milvusは生テキストを入力とし、内部でスパースベクトルを生成することをサポートしている。これにより、どのようなトークナイザでも動作し、ダイナミックに変化するコーパスに示されるどのような単語でも把握することができる。
さらに、ヒューリスティックに基づく刈り込みにより、低バリューのスパースベクトルを破棄することで、精度を落とすことなく効率をさらに向上させている。スパースベクトルを用いた従来のアプローチとは異なり、BM25のスコアリング精度ではなく、コーパスの成長に適応することができる。
- スパースベクトル上にグラフインデックスを構築することで、長いテキストを含むクエリでは転置インデックスよりも優れたパフォーマンスを発揮する;
- ベクトル量子化やヒューリスティックに基づく刈り込みなど、検索品質にわずかな影響しか与えずに検索を高速化する近似技術の活用;
- セマンティック検索と全文検索を実行するためのインターフェースとデータモデルを統一し、ユーザーエクスペリエンスを向上させる。
# Creating an index on the sparse column
index_params.add_index(
field_name="sparse",
index_type="AUTOINDEX", # Default WAND index
metric_type="BM25" # Configure relevance scoring through metric_type
)
# Configurable parameters at search time to speed up search
search_params = {
'params': {'drop_ratio_search': 0.6}, # WAND search parameter configuration can speed up search
}
まとめると、Milvus 2.5は、全文検索を導入することで、セマンティック検索だけでなく検索機能を拡張し、ユーザーが高品質なAIアプリケーションを容易に構築できるようにした。これらは、Sparse-BM25検索の空間における初期ステップに過ぎず、今後、さらなる最適化手段が試されることが予想される。
テキストマッチ検索フィルター
Milvus2.5でリリースされた2つ目のテキスト検索機能は、特定の文字列を含むエントリーに検索をフィルタリングできるテキストマッチである。この機能もトークン化に基づいて構築されており、enable_match=True
で有効化される。
Text Matchでは、クエリーテキストの処理は、トークン化後のORのロジックに基づいていることは注目に値する。例えば、以下の例では、'vector' または 'database' のいずれかを含むすべての文書('text' フィールドを使用)が結果として返されます。
filter = "TEXT_MATCH(text, 'vector database')"
もし、'vector' と 'database' の両方をマッチさせる必要がある場合は、2つのテキストマッチを別々に記述し、ANDでオーバーレイする必要があります。
filter = "TEXT_MATCH(text, 'vector') and TEXT_MATCH(text, 'database')"
スカラーフィルタリング性能の大幅な向上
スカラーフィルタリングの性能に重点を置いているのは、ベクトル検索とメタデータフィルタリングを組み合わせることで、様々なシナリオにおいてクエリの性能と精度を大幅に向上させることができるという発見に由来しています。これらのシナリオは、自律走行におけるコーナーケースの識別のような画像検索アプリケーションから、企業知識ベースにおける複雑なRAGシナリオまで多岐にわたる。このように、大規模なデータ・アプリケーション・シナリオに実装することは、企業ユーザーにとって非常に適している。
実際には、フィルタリングしているデータ量、データの編成方法、検索方法など、多くの要因がパフォーマンスに影響します。Milvus 2.5では、このような問題に対処するために、3つの新しいタイプのインデックス、BitMapインデックス、Array Invertedインデックス、Varcharテキストフィールドをトークン化した後のInvertedインデックスを導入しました。これらの新しいインデックスは、実際のユースケースにおいてパフォーマンスを大幅に向上させることができます。
具体的には
- BitMap インデックスは、タグフィルタリング(一般的な演算子には in、array_contains などがある)を高速化するために使用でき、フィールドカテゴリデータ(データのカーディナリティ)が少ないシナリオに適している。その原理は、あるデータ行があるカラムに特定の値を持つかどうかを判断し、「はい」を1、「いいえ」を0として、BitMapリストを保持します。下図は、ある顧客のビジネス・シナリオに基づいて行ったパフォーマンス・テストの比較である。このシナリオでは、データ量は5億、データカテゴリーは20、異なる値は異なる分布割合(1%、5%、10%、50%)を持ち、異なるフィルタリング量の下でのパフォーマンスも異なります。50%のフィルタリングでは、BitMap Indexによって6.8倍の性能向上を達成できる。カーディナリティが大きくなると、BitMap Indexと比較して、Inverted Indexの方がバランスの取れた性能を示すことは注目に値する。
- Text Matchは、テキストフィールドがトークン化された後のInverted Indexに基づいている。その性能は、2.4で提供したWildcard Match(つまり、like + %)関数をはるかに上回る。社内のテスト結果によると、Text Matchの利点は非常に明確で、特にコンカレントクエリーシナリオでは、最大400倍のQPS向上を達成することができます。
JSONデータ処理に関しては、2.5.x以降のバージョンで、ユーザー指定のキーに対する転置インデックスの構築と、すべてのキーに対するデフォルトの位置情報の記録を導入し、構文解析を高速化する予定です。この両分野により、JSONとDynamic Fieldのクエリパフォーマンスが大幅に向上すると期待しています。今後のリリースノートやテクニカルブログでより多くの情報をご紹介する予定ですので、ご期待ください!
新しい管理インターフェース
データベースの管理にコンピューターサイエンスの学位は必要ありませんが、データベース管理者には強力なツールが必要です。そのため、クラスタ管理WebUIを導入しました。これは、クラスタのアドレスからポート9091/webuiでアクセスできる新しいWebベースのインターフェイスです。この監視ツールは以下を提供します:
- クラスタ全体のメトリクスを表示するリアルタイム監視ダッシュボード
- ノードごとの詳細なメモリおよびパフォーマンス分析
- セグメント情報とスロークエリのトラッキング
- システムの健全性インジケータとノードのステータス
- 複雑なシステム問題のための使いやすいトラブルシューティングツール
このインターフェースはまだベータ版ですが、データベース管理者からのユーザーフィードバックに基づいて積極的に開発を進めています。今後のアップデートでは、AIによる診断、よりインタラクティブな管理機能、クラスタ観測機能の強化を予定しています。
ドキュメンテーションと開発者エクスペリエンス
Milvusをより利用しやすくするために、ドキュメントと SDK/APIエクスペリエンスを全面的に刷新しました。改善点は以下の通りです:
- 基本的な概念から高度な概念への明確な進行を伴う再構築されたドキュメントシステム
- 実用的な実装を紹介するインタラクティブなチュートリアルと実例
- 実用的なコードサンプルを含む包括的なAPIリファレンス
- 一般的な操作を簡素化した、より使いやすいSDKデザイン
- 複雑な概念を理解しやすくする図解ガイド
- AIを活用したドキュメントアシスタント(ASK AI)による迅速な回答
アップデートされたSDK/APIは、より直感的なインターフェイスとドキュメントとのより良い統合を通じて、開発者のエクスペリエンスを向上させることに重点を置いています。私たちは、2.5.xシリーズで作業する際に、これらの改善に気づいていただけると信じています。
しかしながら、ドキュメントとSDKの開発は継続的なプロセスであることを私たちは知っています。私たちは、コミュニティからのフィードバックに基づいて、コンテンツ構造とSDK設計の両方を最適化し続けます。私たちのDiscordチャンネルに参加して、あなたの提案を共有し、さらなる改善にご協力ください。
概要
Milvus2.5には13の新機能といくつかのシステムレベルの最適化が含まれており、これはMilvusだけでなくオープンソースコミュニティによって貢献されたものです。本記事ではそのうちのいくつかにしか触れていませんが、詳細についてはリリースノートや 公式ドキュメントをご覧ください!
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word