セマンティック検索とは
Semantic Search / 意味検索
キーワードの一致ではなく、埋め込みベクトルによる意味的な類似度に基づいて検索する手法
ひとことで言うと
言葉が一致するかではなく、意味が近いかどうかで検索する方法。
概要
セマンティック検索(意味検索)とは、クエリと文書をそれぞれ埋め込みベクトルへ変換し、ベクトル空間上での類似度に基づいて関連する文書を検索する手法。 キーワードの完全一致や単語の出現頻度に基づく従来のキーワード検索と異なり、表記が違っても意味が近い語句(同義語・言い換え表現)を含む文書も検索結果に含められる点が特徴。 RAGにおける文書検索の中核技術として、ベクトルデータベースと組み合わせて広く使われている。 検索クエリに含まれない同義語や関連語でも意味的に近ければヒットさせられる一方、固有名詞や型番のような表記の完全一致が重要な検索には弱いという弱点もあり、キーワード検索と組み合わせて補うことが多い。
背景
キーワード検索は、クエリと文書で使われている単語が一致しないと関連文書を見つけられないという限界があった。 セマンティック検索は、単語の表記ではなく意味を数値ベクトルとして比較することで、同義語や言い換えを含む関連文書も検索できるよう発展した。
アーキテクチャ
クエリと文書を同一の埋め込みモデルでベクトル化し、コサイン類似度等の指標でベクトル間の距離を計算する。 実運用では、ベクトルデータベースの近似最近傍探索を用いて、大量の文書ベクトルの中から類似度の高い上位 k 件を高速に取得する。
ワークフロー
文書群を埋め込みモデルでベクトル化しインデックスへ格納 → クエリを同じ埋め込みモデルでベクトル化 → クエリベクトルと文書ベクトルの類似度を計算 → 類似度上位 k 件を検索結果として返す。
コード例
埋め込みベクトルのコサイン類似度で検索する
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("all-MiniLM-L6-v2")
docs = ["猫が窓辺で眠っている", "犬が公園で走っている", "今日の天気は晴れ"]
doc_embeddings = model.encode(docs)
query = "ペットが休んでいる様子"
query_embedding = model.encode(query)
scores = util.cos_sim(query_embedding, doc_embeddings)
print(scores)利点
- キーワードが一致しなくても、意味的に関連する文書を検索できる
- 表記ゆれ・同義語・言い換えに対して頑健な検索が可能になる
- 多言語対応の埋め込みモデルを使えば、言語をまたいだ検索も実現できる
欠点
- 固有名詞・型番・エラーコード等、表記の完全一致を要するクエリでは、キーワード検索よりも精度が劣りやすい
- 埋め込みモデルの学習データやドメインが対象と乖離していると、類似度の精度が下がる
- 類似度の計算だけでは判断根拠が分かりにくく、検索結果の説明性が低い
比較
関連用語
よくある質問
セマンティック検索だけで十分?
固有名詞や専門用語の完全一致検索を要する場面ではキーワード検索の方が精度に優れ、両者を組み合わせたハイブリッド検索が併用されやすい。