見出し画像

🤦最前線のAIエンジニアでも勘違いするエンベディング(埋め込み)やベクトル検索の基礎知識

💁‍♀️はじめに:最前線のAIエンジニアでさえ基礎を知らない場合がある

まず初めになぜこのNote記事を書こうと思ったのか?以前のNoteでも触れたように、Hugging FaceのAI Agentコースに参加し、その中の【カスタム知識ベースツール】というセクションにGitHub経由で貢献したことが始まりでした。

このセクションでは埋め込み(embedding)やベクトルデータベースに一部誤解を招くような表現やコード例が含まれており(現在は一部修正済み)、私はその修正案を継続的に提案してきました。実際に、GitHub上のPull Requestを通して説明を修正したり、追加コメントで補足したりしています。

この経験を通じて感じるのは、世界の最前線でAI技術を扱っているはずの開発者やエンジニアの中にも、検索アルゴリズムの基本的な仕組みを誤解している人が少なくないという事です。特に、BM25のような従来型の検索手法と、最新の埋め込みを用いたセマンティック検索の違いについては、キチンと理解されていないケースが多いと感じました。こうした検索アルゴリズムの違いを正しく理解することは、RAGや情報検索型のAIエージェントなど、実践的なAIアプリケーションの精度と設計に直結する重要な知識です
そこで、今回のNote記事ではこうした誤解を解消し、「埋め込みとは何か?」「セマンティック検索とは何が新しいのか?」というとても重要な基礎をおさらいしていきたいと思います。ちなみに、私もこのNoteを書きながらもう一度学習し直しています。
AIやLLMを使った検索技術の本質に興味がある方は、ぜひ読んでみてください。


1️⃣伝統的な検索アルゴリズムの仕組み

情報検索の分野では、キーワードベースのアルゴリズムが長年使われてきました。その代表例がTF-IDFとBM25です。これらの手法は「クエリとドキュメント間でどれだけ単語が一致しているか」に注目し、文書の重要度を数値的にスコアリングします。

🔹 TF-IDF:単語の出現頻度に基づく重みづけ

TF-IDFは、以下の2つの要素を掛け合わせてスコアを出します:

  • TF(Term Frequency): ある単語が文書中にどれくらい登場するか

  • IDF(Inverse Document Frequency): その単語が全体の中でどれくらい珍しいか

以下が簡単な実装例です。

# 必要なライブラリをインポート
from sklearn.feature_extraction.text import TfidfVectorizer

# サンプルの文書を用意(コーパス)
documents = [
    "AI is transforming the world.",
    "Machine learning is a subset of AI.",
    "Natural language processing is a key field in AI."
]

# TF-IDFベクトライザーのインスタンスを作成
vectorizer = TfidfVectorizer()

# 文書からTF-IDF行列を生成
tfidf_matrix = vectorizer.fit_transform(documents)

# 各単語のリストを取得
feature_names = vectorizer.get_feature_names_out()

# TF-IDF行列を配列形式で出力(各文書×各単語の重み)
print(tfidf_matrix.toarray())

# 各単語とそのインデックスを確認したい場合はこちら
for i, word in enumerate(feature_names):
    print(f"{i}: {word}")

TF-IDFは単語の「出現頻度」と「希少性」から文書の重要語を抽出し、検索や分類に活用されます。

🔹 BM25:TF-IDFの進化系

BM25(Best Matching 25)は、TF-IDFをベースに、文書の長さや単語の出現回数に対する正規化処理を加えた手法です。より現実的な検索スコアを提供します。

Pythonでは、rank_bm25 ライブラリを使って簡単に試せます。

# BM25の実装ライブラリをインポート(インストールは `pip install rank-bm25`)
from rank_bm25 import BM25Okapi

# コーパス(文書群)を準備
corpus = [
    "AI is transforming the world.",
    "Machine learning is a subset of AI.",
    "Natural language processing is a key field in AI."
]

# 文書を単語単位に分割(トークナイズ)
tokenized_corpus = [doc.lower().split() for doc in corpus]

# BM25オブジェクトを作成
bm25 = BM25Okapi(tokenized_corpus)

# 検索クエリをトークナイズ
query = "AI and machine learning"
tokenized_query = query.lower().split()

# 各文書に対するBM25スコアを計算
scores = bm25.get_scores(tokenized_query)

# スコアを表示(文書ごとの関連度)
for i, score in enumerate(scores):
    print(f"Document {i}: Score = {score}")

BM25は、検索クエリとのキーワード一致をスコア化して順位をつけます。単語数が多すぎたり少なすぎたりする文書にも柔軟に対応できます。

⚖️ 伝統的検索アルゴリズムのメリット・デメリット

メリット:

  • 実装が簡単で高速

  • 検索結果が解釈しやすい

  • 小規模、制約のあるシステムで有効

デメリット:

  • 文脈や意味を理解しない

  • 同義語や言い換えに対応できない

  • ストップワードやノイズの影響を受けやすい

2️⃣Embedding(埋め込み)によるセマンティック検索とは?

前章で扱ったBM25のような伝統的な検索アルゴリズムは、「クエリに含まれるキーワード」と「文章に含まれるキーワード」がどれだけ一致しているかに依存しています。しかし、同じ意味でも表現が違えば一致しないのが人間の言語。そこで登場するのが、Embedding手法によるセマンティック検索です。

🔹まずEmbeddingとは?

Embeddingとは簡単に言うと、単語・文・文章などをベクトル(数値の配列)に変換する手法の事を指します。このベクトルとは、意味的な近さを持つように学習されています。例えば:

  • 「猫」と「犬」のベクトルは、「猫」と「リンゴ」よりも近い

  • 「AI」と「人工知能」のベクトルは似ている

🧮 Embeddingの例(数値でのイメージ)

単語   ベクトル(次元を簡略化)
猫    [0.8, 0.1, 0.3]
犬    [0.75, 0.15, 0.35]
リンゴ  [0.1, 0.9, 0.8]

このベクトル同士の距離(類似度)を測る事で、言葉の意味的な近さを数値化できます。

🔍 セマンティック検索の基本的な流れ

  • 文書やクエリをベクトル化(Embedding)

  • ベクトル同士の距離や類似度を測定

  • 最も近いものを検索結果として返す

⚙️ 主なセマンティック検索アルゴリズム

セマンティック検索を行うための手法(検索アルゴリズム)には以下のようなものがあります:

  • ベクトルデータベースを使った近似最近傍探索(ANN)
     例:FAISS(Meta、ScaNN(Google、Milvus(Zilliz)

  • エンドツーエンドのモデルベース検索
     例:ColBERT、Dense Retriever、Dual Encoder(BERTなど)

  • RAG(Retrieval-Augmented Generation)系の手法
     → ベクトル検索 + LLMを組み合わせた検索

📐類似度を測るための距離・スコア指標(評価関数)

Embeddingによって得られたベクトル同士の「近さ」=意味的な類似度を計算する方法はいくつかあります。ここでは、よく使われる代表的なアルゴリズムを3つ紹介します。

1.コサイン類似度 ⭐️最も一般的⭐️

定義:2つのベクトルが成す角度の“cos(θ)”を計算
特徴:ベクトルの長さ(絶対的な大きさ)は無視し、無期(意味)の近さに注目
範囲:-1(意味的に真逆)〜 1(完全一致)

from sklearn.metrics.pairwise import cosine_similarity

cosine_score = cosine_similarity([vec1], [vec2])[0][0]

👉意味的に似た文ほどスコアが1に近づきます。

2.ユークリッド距離

定義:2つのベクトルの間の直線距離
特徴:ベクトルの位置が重要になる。ベクトルの大きさに影響されやすい。
範囲:0(完全一致)〜∞(遠いほど大きい)

from scipy.spatial.distance import euclidean

distance = euclidean(vec1, vec2)

👉ただし、ベクトルのスケーリングによる影響を受けやすいため、セマンティック検索ではコサイン類似度の方が人気。

3.マンハッタン距離(L1距離)

定義:軸に沿って移動する距離の合計、タクシー距離とも言われる。
特徴:各次元ごとの差を足し合わせるため、スパースなベクトルに強い。

from scipy.spatial.distance import cityblock

distance = cityblock(vec1, vec2)

🔧Embeddingはあくまで「意味の空間にマッピングする手段」です。検索そのものは、「どのベクトルがクエリに近いか?」を判断する類似度アルゴリズムによって実現します。だからこそ、「どんな距離関数を使うか?」はセマンティック検索の設計でとても重要になってきます。

🧪 PythonでEmbeddingとセマンティック検索を体験

今回はHugging Faceの sentence-transformers モデルを使って簡単なセマンティック検索を実装します。次のコードでは、all-MiniLM-L6-v2 という軽量な事前学習済みモデルを使って、文書とクエリをベクトルに変換し、コサイン類似度に基づいてどの文書がクエリと最も意味的に近いかを判断しています。

# pip install sentence-transformers
from sentence_transformers import SentenceTransformer, util

# モデルをロード(軽量モデル推奨:all-MiniLM-L6-v2)
model = SentenceTransformer('all-MiniLM-L6-v2')

# 文書群(検索対象)
documents = [
    "AI is transforming the world.",
    "Machine learning is a part of AI.",
    "We study how to process language using machines.",
]

# クエリ文(検索したい内容)
query = "What is natural language processing?"

# ベクトル化(embedding)
doc_embeddings = model.encode(documents, convert_to_tensor=True)
query_embedding = model.encode(query, convert_to_tensor=True)

# 類似度を計算(cosine similarity)
cos_scores = util.cos_sim(query_embedding, doc_embeddings)

# スコアが高い順に並べる
results = list(zip(documents, cos_scores[0].tolist()))
results.sort(key=lambda x: x[1], reverse=True)

# 結果を表示
for doc, score in results:
    print(f"Score: {score:.4f} | Document: {doc}")

このコードを実行すると、以下のような出力が得られます:

Score: 0.6053 | Document: We study how to process language using machines.
Score: 0.3839 | Document: Machine learning is a part of AI.
Score: 0.2489 | Document: AI is transforming the world.

この結果から、クエリ "What is natural language processing?" に対して、
最も意味的に近い文書が "We study how to process language using machines." であることがわかります。

このように、セマンティック検索では単語の一致ではなく、「意味の近さ」に基づいて関連文書を抽出することができます。特にFAQ検索、チャットボット、ドキュメント検索など、意味理解が重要なユースケースで非常に有効です。

🔍 BM25との違い:同義語・言い換えへの対応力

たとえばクエリが "What is natural language processing?" だった場合、
BM25では "natural language" や "processing" と完全に一致する文書しか高評価されません。

しかし、セマンティック検索では "language using machines" や "NLP" のような言い換え表現でも高スコアが出ます。

3️⃣BM25 vs セマンティック検索 の違いと使い分け

🆚BM25とセマンティック検索の違い

7つの視点から比較し、全体像を把握してみます。

① 検索の仕組み

  • BM25:単語の一致と出現頻度に基づくルールベース

  • セマンティック:文や単語の「意味的な近さ」をベクトルで表現して検索


② 言葉の言い換えへの強さ

  • BM25:弱い(言い換えや同義語には反応しない)

  • セマンティック:強い(「お花見」と「桜を楽しむ」も意味的に近いと判断)


③ アルゴリズムの中身

  • BM25:TF-IDFをベースに、キーワードの出現回数と位置をスコア化

  • セマンティック:Transformerなどのモデルでテキストを多次元ベクトルに変換し、コサイン類似度などで比較


④ 処理速度と導入の手軽さ

  • BM25:高速・軽量・導入が非常に簡単

  • セマンティック:やや重めだが、精度は高い。モデルやベクトルDBのセットアップが必要


⑤ 学習の必要性

  • BM25:事前学習は不要(ルールで動く)

  • セマンティック:事前学習済みモデルを使う必要あり(例:sentence-transformersなど)


⑥ 向いているユースケース

  • BM25:FAQ、辞書検索、明確なキーワード検索

  • セマンティック:自然言語のQ&A、曖昧な問い合わせ、類義語を含む検索


⑦ 結果の違いの例(同じクエリで比較)

🟦 クエリ:「東京の桜の名所は?」

  • BM25の結果

    • 「東京の桜スポットまとめ2024」

    • 「桜の開花情報:東京編」

  • セマンティック検索の結果

    • 「春におすすめの東京のお花見スポット」

    • 「都内で桜を楽しめる公園・庭園の紹介」

✅BM25は「キーワードマッチング」に強く、セマンティック検索は「意味の理解」に優れています。検索の目的やユーザーの入力方法に応じて、適切な手法を選ぶことが、AI開発や自然言語処理アプリの品質を左右する重要なポイントです。

4️⃣Embeddingやセマンティック検索を体験的に学べるリソース紹介

📄 Google GenAI Intensive コース:Embedding & Vector Stores ホワイトペーパー

  • URLhttps://www.kaggle.com/whitepaper-embeddings-and-vector-stores

  • おすすめポイント

    • Embeddingとは何か、なぜ必要か、どのように使うのかを図解・ステップ付きで丁寧に解説

    • RAG(Retrieval-Augmented Generation)との関連性も明記されており、生成AI文脈での理解が深まる

  • 内容のハイライト

    • テキスト→ベクトル変換の流れ

    • ベクトルストアの役割(例:FAISS, Pinecone)

    • セマンティック検索とその活用例

  • おすすめユーザー

    • LLMアプリ開発者、RAG構築に関心がある人

    • セマンティック検索を「理論から構築まで」通して理解したい人

5️⃣Embeddingの応用例

ここまででEmbeddingやセマンティック検索の基本を理解してきましたが、実際の開発現場ではこれらの技術がどのように活用されているのでしょうか?この章では、Embeddingの具体的な応用例について紹介していきます。

🧩 Embedding × RAG(Retrieval-Augmented Generation)

  • Embeddingの代表的活用例が、RAG(検索拡張生成)です。

  • ユーザーの質問に対して、Embeddingで文章を検索→その文章を基にLLMが解答を生成します。

  • ChatGPTのカスタム知識検索機能、社内FAQボットなどに使われています。

🔮 Embedding × Recommendation(レコメンドシステム)

  • 商品説明やレビューなどをEmbeddingでベクトル化→ユーザーの興味と類似するアイテムを提案します。

  • AmazonやNetflixなどでレコメンドシステムが活用されています。

🔎 Embedding × 類似文書検索・重複検出

  • ドキュメント同士をベクトル比較することで、類似資料の発見や重複チェックが可能になります。

  • 特許検索・論文分類・ニュースまとめなどの分野で活用されています。

🧠 Embedding × マルチモーダル(画像や音声との組み合わせ)

  • テキストと画像のベクトルを同じ空間にマッピングする。

  • 「この画像と似たコンセプトの文章」や、「音声と一致する字幕」などといった検索の活用法が可能です。

今後の展望と課題

Embeddingやベクトル検索は今後もますます使われていく一方で、大手AI企業や開発者たちが直面している現実的な課題もあります。

🌐 品質の維持とアップデートの難しさ

  • 例えばGoogleやOpenAIは、日々変わる情報や新しい知識を反映させるために、ベクトルの再生成やインデックスの再構築を繰り返しています。

  • ただし、ベクトルを定期的に更新するには高い計算コストがかかるため、「更新頻度と品質のバランス」が課題。

  • 特にニュース検索系のRAGアプリでは、「最新情報なのに古いベクトルでヒットしない」問題が起きやすいです。

💸 ベクトル検索のコストとスケーラビリティ

  • 例えばMicrosoftやGoogleは、エンタープライズ向けのベクトル検索サービスを提供していますが、大規模なデータを扱うほどストレージ・検索コストが跳ね上がるのが現実です。

  • 効率化のために「量子化(Quantization)」や「圧縮手法」なども研究されていますが、それによって精度が落ちるリスクもあります。

🔐 プライバシーとセキュリティの対応(特に企業導入時)

  • 自社データをEmbeddingしてベクトルDBに保存する場合、情報漏洩リスクや社内規定との整合性が問題になる可能性も指摘されています。

✅ まとめ

Embeddingやセマンティック検索は、今やAI開発において欠かせない基礎ツールです。このNote記事では、よく混同されがちな従来型の検索メソッドと、Embeddingによる検索の違いを紹介していきました。
大切なのは「なんとなく使う」ではなく、どういう仕組みで、どのような場面で活用されているのかをできるだけ理解しておくことだと思います。このNote記事がその理解のきっかけになっていたらうれしいです。


いいなと思ったら応援しよう!

ゆかとneither🪄 いただいたチップはコミュニティー設置やプロジェクト始動・運営などの活動費に使わせていただきます!そしてNoteにプロセスなどをシェアしていきます。よろしくお願いします!