今回は、以前投稿されたRAG(Retrieval-Augmented Generation)やRAGでの検索機能についての解説記事を踏まえて、その内部で使用されている検索技術である「ベクトル検索」に焦点を当てて、深堀りしていきます。
1. ベクトル検索とは
RAG(Retrieval-Augmented Generation)について学んだことがある方なら、「LLMに外部知識を与えることで、より正確で最新の回答を生成できる」という基本原理はご存知だと思います。
ここで「システムは膨大な文書の中から、どうやって『質問に関連する情報』を見つけ出しているのだろう?」という疑問が浮かびます。
実は、この「関連情報の検索」こそがRAGの成否を決める最重要ポイントなのです。そして、その背後で動いているのがベクトル検索という技術です。
従来のキーワード検索の限界
具体的なシナリオで考えてみましょう。
あなたがカスタマーサポートのシステムを構築していて、「決済エラーが発生した」というユーザーからの問い合わせに対応したいとします。
従来のキーワード検索では、こんな問題が発生します:
- ユーザーA:「決済失敗しました」
- ユーザーB:「支払いNGになります」
- ユーザーC:「課金できないんですが」
これらはすべて同じ問題を指しているのに、使っている言葉が違うため、キーワード検索では適切な解決方法(FAQ)にアクセスできない可能性があります。結果として、ユーザー満足度は低下し、問い合わせ対応の効率も悪化してしまいます。
ベクトル検索で解決できること
しかし、ベクトル検索を導入することで、このような問題を解決することができます。
なぜなら、ベクトル検索は「キーワードの一致」ではなく「意味の近さ」で検索するからです。
この記事を読むことで、
ベクトル検索の仕組みを理解し、なぜRAGにベクトル検索が不可欠なのかを理解できます。
それでは、ベクトル検索について一緒に学んで行きましょう!
2. ベクトル化:「意味を数値化する」とは何か
まず、ベクトル検索のベクトルとは何を意味するのかについて、説明していきます。
言葉の「意味」をコンピュータに伝える
私たち人間は、「猫」と「犬」が似ている動物だと直感的に理解できます。どちらもペットとして飼われる、4本足の哺乳類だからです。
しかし、コンピュータにとって「猫」も「犬」も、ただの文字列の羅列に過ぎません。「cat」と「dog」という3文字の英単語に、何の関連性も見出せないのです。ここに大きな課題があります。
つまり、コンピュータに「意味の近さ」を理解させ、計算可能にする必要があるのです。
ベクトル=意味の座標
ベクトル検索は、この課題を「座標」という発想で解決します。
数学的な難しい定義は一度置いておいて、地図上の位置として考えてみてください。
例えば、2次元の平面上に言葉を配置するとしたら:

- 「猫」を座標 (0.8, 0.9) に配置
- 「犬」を座標 (0.7, 0.85) に配置
- 「自動車」を座標 (0.1, 0.2) に配置
このように配置すると、「猫」と「犬」は近い位置にあり、「自動車」は遠い位置にあることが一目瞭然です。
実際のベクトル検索では、2次元ではなく数百次元(例:768次元、1024次元など)の空間を使いますが、基本的な概念は同じです。
想像してみてください。2次元の散布図上に、こんなふうに単語が配置されています:
- 右上のエリア:「猫」「犬」「ウサギ」「ハムスター」(ペット関連がクラスター化)
- 左下のエリア:「自動車」「バス」「電車」「飛行機」(乗り物関連がクラスター化)

意味が似ている単語同士は、自然と近くに集まるのです。
Embeddingモデル
では、どうやって言葉を座標(ベクトル)に変換するのでしょうか?
ここで登場するのがEmbeddingモデルです。Embeddingモデルは、言語を数値に翻訳する機械のようなものです。
- 入力:自然言語のテキスト(例:「決済エラーが発生しました」)
- 出力:数値ベクトル(例:768次元の数値の配列)

このモデルは、大量のテキストデータから「意味の関係性」を学習しているため、似た意味を持つテキストは似たベクトルに変換されます。
ここで、Embeddingモデルを使用する上での重要な注意点として、
異なるモデルで変換したベクトルは、比較できない
という性質を覚えておきましょう。
これは、各Embeddingモデルが、テキストを異なる方法でベクトル化するためです。
例えるなら、一方が「摂氏」で温度を測り、もう一方が「華氏」で測っているようなものです。モデルごとに変換後のベクトルの”単位”が違うようなものなので、そのまま比較しても意味がありません。
したがって、RAGシステムでは、以下の両方を同一のEmbeddingモデルで処理する必要があります:
- 文書の埋め込み(事前にベクトル化してデータベースに保存)
- クエリの埋め込み(ユーザーの質問をリアルタイムでベクトル化)
これがベクトル検索の大前提になります。
3. 類似度計算の仕組み
「近さ」の測り方:コサイン類似度
ベクトル空間上で「ベクトル同士がどれだけ似ているか」を測る方法は、実は複数あります。その中でも最も一般的なのがコサイン類似度です。
これは、2つのベクトルの「向きの近さ」を表す指標で、次の式で定義されます。
\text{cosine_similarity}(A, B) = \frac{A \cdot B}{|A||B|}
$$
ここで \( A \cdot B \)はベクトルの内積、\( |A| \) と \( |B| \) はそれぞれのベクトルの大きさ(ノルム)を表します。
値は -1 から 1 の範囲を取り、1 に近いほど2つのベクトルの方向が似ている、つまり意味的に近いことを示します。
多くのRAGシステムでは、このコサイン類似度が標準的に使われています。
補足:他にも「ユークリッド距離」や「内積」といった計算方法がありますが、それぞれ特性が異なります。
具体的なシナリオでの類似度計算
では、具体的なシナリオで、ベクトル検索がどう動くか体験していきましょう。
【シナリオ】
ユーザークエリ: “パスワードを忘れました”
FAQ候補:
- A. “ログインできない場合の対処法”
- B. “商品の返品方法について”
- C. “認証情報の再設定手順”
【処理の流れ】
1. クエリをベクトル化
→ [0.2, 0.8, 0.1, 0.3, 0.5, ...]
2. 各FAQをベクトル化して類似度を計算
A → [0.3, 0.7, 0.2, 0.4, 0.6, ...]
類似度: 0.89
B → [0.1, 0.2, 0.9, 0.1, 0.1, ...]
類似度: 0.34
C → [0.25, 0.75, 0.15, 0.35, 0.55, ...]
類似度: 0.92
3. スコアが高い順に並べ替え
→ C(0.92), A(0.89), B(0.34)【結果】 最も関連性の高い「C:認証情報の再設定手順」がトップに表示される
このように、キーワードが完全一致していなくても、意味的に最も近い情報を見つけ出すことができるのです。
4. Pythonでベクトル検索を体験
理論だけではわかりにくいので、実際にPythonコードを実行して、ベクトル検索を体験してみましょう。
ここでは、「猫」という単語に似ている単語を検索するという簡単な例で、ベクトル検索の仕組みを理解していきます。
Step 1:単語のベクトル辞書を作る
まずは、各単語を2次元のベクトル(座標)として表現します。実際のベクトル検索システムでは、数百〜数千次元のベクトルに変換しますが、ここでは分かりやすく2次元で表現しています。
import numpy as np
# 簡易的な単語ベクトル辞書
# 実際のAIでは、Embeddingモデルが自動的にこのようなベクトルを生成します
word_vectors = {
# ペット系
"猫": np.array([0.8, 0.9]),
"犬": np.array([0.7, 0.85]),
"ウサギ": np.array([0.75, 0.8]),
# 乗り物系
"自動車": np.array([-0.8, -0.6]),
"バス": np.array([-0.7, -0.5]),
"飛行機": np.array([-0.9, -0.7]),
}ベクトル空間では、似た単語の座標は近くなるため、ペットに関する単語と乗り物に関する単語がそれぞれ近くに配置されます。
Step 2:ベクトルの類似度を計算する関数を定義
ベクトル同士の「近さ」は先程説明した「コサイン類似度」で計測しようと思います。
類似度の計算方法を定義するため、以下のコードを実行してください。
Step 3:検索を実行してみよう
それでは、実際に「猫」に似ている単語を探してみましょう!
結果は、「犬」と「ウサギ」の類似度が高くなり、乗り物系の単語は類似度が低く算出されたと思います。時間があれば、query = "猫"の部分を他の単語に変えて再度実行してみてください。
今回は、各単語のベクトルを手動で定義しましたが、実際のベクトル検索ではより高次元でベクトル化が行われるため、キーワードが完全一致していなくても、正確に意味的に近い単語を自動的に見つけ出すことができます。
5. まとめ
ここまでの内容をまとめます。
ベクトル検索は、「意味の近さ」で情報を見つける仕組みです。
その流れは次の3ステップに整理できます。
- 意味を数値化する
テキストをEmbeddingモデルで高次元のベクトルに変換。 - 近さを測る
ベクトル同士の類似度(コサイン類似度など)を計算。 - 関連度で並べる
スコアの高い順に結果を返す。
この仕組みにより、言葉の表現が異なっても「意味的に近い」情報を正確に見つけ出せます。
RAGでは、このベクトル検索が外部知識を取り込む中核的な役割を担っています。
ベクトル検索は、一見複雑に見えますが、その本質は「意味を座標で表現し、近さで比較する」というシンプルなアイデアです。
この記事が、あなたの理解を一歩深めるきっかけになれば幸いです。


