Semantic Search
セマンティック検索は、クエリの正確な単語ではなく意味に基づいて文書や画像を順位付けします。埋め込み、近傍検索、リランカーを使用します。
セマンティック検索は、クエリに含まれる語句との一致ではなく、クエリの意味とどれほど一致するかに基づいて、ドキュメント、画像などの項目をランキングします。「うちの猫がお腹を空かせている」という検索で、「新しく迎えた子猫の給餌スケジュール」というタイトルのページが返されることがあります。両者には共通する単語がありません。最新のシステムでは埋め込みを使います。ニューラルエンコーダーがクエリと項目をベクトルに変換し、意味が似ている場合はベクトル同士が近くなります。ベクトル検索で最も近い項目を見つけます。Web検索は2019年にこの方向へ進み始めました。Googleが検索クエリの理解にBERTを適用し、米国の英語検索の10件に1件に影響したと発表した年です。
セマンティック検索の仕組み#
セマンティック検索システムの多くは、バイエンコーダーで検索し、リランカーで結果を調整します。バイエンコーダーはすべてのドキュメントを事前に一度ずつ埋め込みに変換し、ベクトルをベクトルデータベースに保存します。クエリ時にはクエリだけを埋め込みに変換し、近似最近傍インデックスがコサイン類似度に基づいて上位候補を返します。Sentence-BERT(2019年)によって、文に対してこの手法を実用化できました。1万文から最も類似するペアを見つけるのに、BERTのクロスエンコーダーでは約65時間かかったのに対し、文の埋め込みを使うと約5秒で済みました。続いてDense Passage Retrieval(2020年)は、オープンドメインの質問応答において、学習した埋め込みがBM25キーワードランキングを、上位20件の文章検索精度で9~19ポイント上回ることを示しました。最後に、クロスエンコーダーのリランカーがクエリと各候補をまとめて読み、短い候補リストをより正確に並べ替えます。
この例では、Sentence Transformersライブラリを使い、単語の重複と埋め込み類似度を比較します。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
documents = [
"How to reset a forgotten account password",
"Feeding schedule for a new kitten",
"Quarterly sales report for the retail division",
"Best hiking trails near Denver",
]
query = "my cat is hungry"
# Keyword search: documents sharing at least one word with the query
query_words = set(query.lower().split())
print("Keyword matches:", [d for d in documents if query_words & set(d.lower().split())])
# Semantic search: rank documents by cosine similarity of their embeddings
doc_embeddings = model.encode(documents)
query_embedding = model.encode(query)
scores = model.similarity(query_embedding, doc_embeddings)[0]
best = int(scores.argmax())
print(f"Semantic match: {documents[best]!r} (cosine {scores[best]:.2f})")どのドキュメントにも「my」「cat」「is」「hungry」が含まれないため、キーワード照合では空のリストが返されます。セマンティック検索では、意味が最も近いドキュメントとして、子猫の給餌スケジュールがコサイン類似度0.56で返されます。
セマンティック検索と関連用語の比較#
- キーワード検索: BM25などの計算式を使い、完全一致する語句に基づいてドキュメントをランキングします。名前、型番、埋め込みでは区別しにくい希少語句には適していますが、同義語や言い換えは見落とします。
- ハイブリッド検索: キーワード検索とセマンティック検索を併用して結果を統合する手法です。本番の検索システムやRAGシステムでよく使われます。
- セマンティックセグメンテーション: 画像内のすべてのピクセルにクラスを付与する、無関係なコンピュータービジョンタスクです。「セマンティック」という単語を共有するだけです。
- セマンティックキャッシュ: 同じ意味に基づく照合をLLMリクエストに適用し、新しいプロンプトが以前のものと同じ意味なら、保存済みの回答を再利用します。
実際のアプリケーション#
- 検索拡張生成(RAG): ユーザーの表現がドキュメントの表現と異なる場合でも、言語モデルに必要な文章を見つけます。
- 特許検索: 異なる用語で同じ発明を説明している先行技術を提示します。
- 小売の商品検索: 「雨の日の通勤に履く靴」のようなクエリを、商品情報にその語句が使われていない防水スニーカーと照合します。
- レコメンデーションシステム: ユーザーがすでに選択した項目の近くに埋め込みが配置される記事や商品を推薦します。
意味による画像検索#
対照学習で画像とキャプションのペアを使って学習したモデル(CLIPなど)は、テキストと画像を同じ空間に埋め込みます。そのため、タグやキャプションのない写真もテキストクエリでランキングできます。Ultralyticsのセマンティック画像検索ソリューションもこの方法で構築されています。そのVisualAISearchクラスは、フォルダー内のすべての画像をCLIPで一度埋め込みに変換し、各テキストクエリも同じ空間に埋め込みます。そして、クエリとのコサイン類似度がしきい値を超える画像を最大30枚返し、類似度の高い順に並べます。「ベンチに座っている犬」のようなクエリで、ラベルのないコレクションから一致する写真を見つけられます。










