セマンティック検索で検索を10倍賢くした方法

トコペディアでは、商品コーパスの価値は、バイヤーが自分に関連する商品を見つけることができて初めて発揮されることを理解しており、検索結果の関連性を高める努力をしています。
そのため、検索結果の関連性を高める努力をしています。モバイルデバイスで検索結果ページを表示すると、「...」ボタンが表示され、その商品に類似した商品を検索するオプションが表示されます。
キーワード検索
トコペディア検索では、商品の検索とランキングに Elasticsearch を使用しています。各検索リクエストに対して、まずElasticsearchに問い合わせを行い、検索クエリに従って商品をランク付けします。Elasticsearchは、各単語を各文字のASCII(またはUTF)コードを表す数字の列として保存します。ElasticSearchはinverted-indexを構築し、ユーザーのクエリに含まれる単語がどの文書に含まれているかを素早く見つけ、様々なスコアリング・アルゴリズムを使ってその中から最もマッチするものを見つけます。これらのスコアリング・アルゴリズムは、単語の意味にはほとんど注意を払わず、むしろ、文書内で単語がどれだけ頻繁に出現するか、単語同士がどれだけ近いかなどに注目する。ASCII表現は明らかに、意味を伝えるのに十分な情報を含んでいる(結局のところ、私たち人間はそれを理解することができる)。残念ながら、コンピュータがASCIIエンコードされた単語をその意味によって比較するための優れたアルゴリズムはない。
ベクター表現
この解決策のひとつは、単語に含まれる文字だけでなく、その意味についても教えてくれるような、別の表現を考えることだろう。例えば、この単語が他のどの単語と一緒に使われることが多いかを表すことができる。そして、似たような文脈は似たようなものを表すと仮定し、数学的手法を使ってそれらを比較しようとする。文章全体をその意味によって符号化する方法を見つけることもできるだろう。
ベクトル表現は、アスキー表現に比べて単語の意味も明らかにする](https://assets.zilliz.com/Blog_How_we_used_semantic_search_to_make_our_search_10x_smarter_2_776af567a8.png)
埋め込み類似検索エンジンの選択
さて、特徴ベクトルができたところで、残された問題は、大量のベクトルの中から、目的のベクトルと似ているものをどのように取り出すかです。埋め込み類似度検索エンジンに関しては、Githubで公開されているいくつかのエンジン(FAISS, Vearch, Milvusなど)でPOCを試みました。
負荷テストの結果、他のエンジンよりもMilvusを優先しました。一方、FAISSは以前他のチームで使ったことがあるので、新しいものを試してみたいと思っています。Milvusと比較すると、FAISSはより基礎的なライブラリであるため、使い勝手はあまりよくありません。Milvusについて学ぶにつれ、私たちは最終的にMilvusの2つの主な機能を採用することに決めました:
Milvusは非常に使いやすい。Milvusは非常に使いやすい。Dockerイメージを引っ張ってきて、自分のシナリオに基づいてパラメータを更新するだけでいい。
より多くのインデックスをサポートし、詳細なサポートドキュメントがある。
一言で言えば、Milvusはユーザーにとって非常に使いやすく、ドキュメントも非常に詳しい。もし何か問題に出くわしたとしても、大抵はドキュメントで解決策を見つけることができる。
Milvusクラスタサービス
機能ベクトル検索エンジンとしてMilvusを使用することを決定した後、私たちは低充填率キーワードと高充填率キーワードをマッチングさせたい広告サービスのユースケースの1つにMilvusを使用することにしました。開発(DEV)環境にスタンドアロンノードを設定し、配信を開始したところ、数日間順調に稼働し、CTR/CVRの指標も改善されました。本番環境でスタンドアロンノードがクラッシュすると、サービス全体が利用できなくなります。したがって、可用性の高い検索サービスをデプロイする必要がある。
Milvusは、クラスタ・シャーディング・ミドルウェアであるMishardsと、コンフィギュレーション用のMilvus-Helmの両方を提供しています。TokopediaではインフラのセットアップにAnsibleのプレイブックを使っているので、インフラ・オーケストレーション用のプレイブックを作成した。Milvusのドキュメントにある以下の図は、Mishardsがどのように動作するかを示しています:
Mishardsの仕組み](https://assets.zilliz.com/Blog_How_we_used_semantic_search_to_make_our_search_10x_smarter_3_4fa0c8a1a1.png)
Mishardsはアップストリームからのリクエストを分割したサブモジュールにカスケードし、サブサービスの結果を収集し、アップストリームに返します。Mishardsベースのクラスタソリューションの全体的なアーキテクチャを以下に示します:
Mishardsの全体アーキテクチャ](https://assets.zilliz.com/Blog_How_we_used_semantic_search_to_make_our_search_10x_smarter_4_724618be4e.jpeg)
公式ドキュメントではMishardsについてわかりやすく紹介しています。興味のある方はMishardsを参照してください。
私たちのkeyword-to-keywordサービスでは、Milvus ansibleを使って、書き込み可能なノード1台、読み取り専用ノード2台、Mishardsミドルウェアインスタンス1台をGCPにデプロイしました。今のところ安定しています。類似検索エンジンが依存する100万、10億、あるいは1兆ベクトルのデータセットを効率的に照会することを可能にする巨大な要素は、ビッグデータ検索を劇的に加速するデータ整理プロセスであるインデックス作成である。
ベクターインデクシングはどのようにして類似検索を加速させるのか?
類似検索エンジンは、入力とデータベースを比較し、入力に最も似ているオブジェクトを見つけることで動作する。インデクシングはデータを効率的に整理するプロセスであり、大規模なデータセットに対する時間のかかるクエリを劇的に高速化することで、類似検索を有用なものにする上で大きな役割を果たす。膨大なベクトルデータセットがインデックス化された後、クエリは入力クエリと類似したベクトルを含む可能性が最も高いクラスタ、つまりデータのサブセットにルーティングすることができる。実際には、これは本当に大きなベクトルデータに対するクエリを高速化するために、ある程度の精度が犠牲になることを意味する。
単語がアルファベット順に並べられた辞書に例えることができる。単語を調べるとき、同じ頭文字の単語だけを含むセクションに素早く移動することができ、入力単語の定義の検索を劇的に高速化することができる。
次は何かって?
ブログ_セマンティック検索を使って検索を10倍賢くする方法_5.jpeg
上に示したように、すべてに当てはまる解決策はありません。私たちは常に、埋め込みを取得するために使用されるモデルの性能を向上させたいと考えています。
また、技術的な観点からは、複数の学習モデルを同時に実行し、様々な実験結果を比較したいと考えています。画像検索やビデオ検索など、私たちの実験についての詳細は、このページをご覧ください。
参考文献
- ミシャード・ドックス:https://milvus.io/docs/v0.10.2/mishards.md
- ミシャード: https://github.com/milvus-io/milvus/tree/master/shards
- ミルヴァス・ヘルム:https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
このブログ記事は https://medium.com/tokopedia-engineering/how-we-used-semantic-search-to-make-our-search-10x-smarter-bd9c7f601821 から転載しています。
他のユーザーストーリーを読んで、Milvusを使ったものづくりについてもっと学びましょう。
読み続けて

Milvus WebUI: A Visual Management Tool for Your Vector Database
Milvus WebUI is a built-in GUI introduced in Milvus v2.5 for system observability. WebUI comes pre-installed with your Milvus instance and offers immediate access to critical system metrics and management features.

DeepSeek Always Busy? Deploy It Locally with Milvus in Just 10 Minutes—No More Waiting!
Learn how to set up DeepSeek-R1 on your local machine using Ollama, AnythingLLM, and Milvus in just 10 minutes. Bypass busy servers and enhance AI responses with custom data.

DeepSeek vs. OpenAI: A Battle of Innovation in Modern AI
Compare OpenAI's o1 and o3-mini with DeepSeek R1's open-source alternative. Discover which AI model offers the best balance of reasoning capabilities and cost efficiency.