こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。
今回はPythonから少し離れますが、最近の興味の中心であるベクトル検索についてお話ししたいと思います。ベクトル検索は最初のうちはなかなかとらえにくいかと思いますが、どういったことがベクトル検索でできるのかを中心に取り上げてみたいと思います。
ベクトル検索とは何か。
何かしらの情報を探すために、Webサイトや、PDFなど文書といった多くの情報の中から文字を検索したいという要望は昔からありました。そこでコンピュータとプログラミングによって、多くの情報の中から自分の探したいものを見つけ出すという技術が少しずつ進化を続けてきました。近年はAIに質問すればAIに答えてくれるようになっていますが、これもAIの知識の中から答えを引き出していくというものになりますので、1つの検索手段の一種だと考えています。
さて、その検索は大きく分けると3種類に分けられると考えています。
ひとつ目は、ブラウザの検索機能を使い、PDFなどの中から特定の文字が含まれていないかを調べます。見つかった場所にはハイライトを付け、ジャンプできるようになっているものです。いわゆる総当たり方式です。
ふたつ目は、Googleやサイト内検索で使われている検索エンジンです。
みっつ目が、今回お話しするベクトル検索です。このベクトルとは、高校数学で出てくる「数値の塊」のことを指しています。
検索の種類については、この3段階で押さえてもらえればと思います。
従来の検索
まずひとつ目とふたつ目の従来の検索について簡単に説明します。
ひとつ目の検索は、そのページを上から順番にキーワードを検索していく総当たり方式です。ただこれは、検索対象としたいものがどれかわかっている状態で行われます。そのため、どちらかといえば、コンピュータの計算力を使って力業で検索していく機能ですが、広い意味では検索と言っていいと思います。ただ、検索エンジンを使った検索とは技術的に一線が引かれます。
ではふたつ目の検索エンジンは何かというと、大量のドキュメントの中から検索したい文字列もしくは関連する情報を引っ張り出す機能です。
この二つの違いをイメージしてみましょう。
例えば500ページのPDF文書から、知りたい文字がどこにあるかを調べたい場合、本来なら1ページずつ見ていかなくてはなりませんが、現実的に人の手では難しい部分があります。
ひとつ目の総当たり方式検索の場合、コンピュータの機能を使って検索をかけますが、大体数秒程度でどこに該当の文字があるかを教えてくれます。
一方、ふたつ目の検索エンジンの場合、目次をとても細かくしたものを最初に作り記憶しておくことで、調べたいキーワードがどこにあるのかを見つけ、目的のページでさらにどこにその文字があるのかを逆引きして見つけます。
昨今の検索エンジンの世界では、いろいろな高度な技術が使われていますので、あいまいな言葉でも検索ができますし、ちょっとした表記ゆれでもうまく取り除いてくれます。どの情報が本当に知りたいものなのかをキーワードごとに重みづけする機能も持っていますので、優先順位でランキング付けをして順番に表示してくれるようになっています。
ベクトル検索が注目を浴びる理由
つい最近まで、検索エンジンを使って、特定の言葉から目的のドキュメントの該当のページまでどうやればたどり着けるかという研究がされてきました。そこからさらに発展して登場したのがベクトル検索という世界です。
近年、AIやLLM(大規模言語モデル)が非常に騒がれていますが、同時に大きな注目を浴びているのがこのベクトル検索です。ベクトル検索はセマンティック検索と呼ばれることもあります。
なぜベクトル検索が注目を浴びることになったのか。それはベクトル検索が意味も含めた検索ができるためです。これまでならキーワードがある場所を探すために、1つから複数個のキーワードをスペースで区切って探していました。ですが、ベクトル検索は、検索したい文字の意味を考えて、それに近いものをとってくることができます。
このベクトル検索は近年、注目が非常に高くなっており、いろいろなところで導入が進んでいます。
例えば、最近、Googleに質問を投げると、AIが答えてくれているような形で回答が表示されるようになっていますが、実はこれはベクトル検索を有効に使った一つの事例といえます。
ベクトル検索の仕組み
さて、ベクトル検索にはいくつかの要素があります。
1番大きな要素としては、言葉の意味を数値にすることです。冒頭でも言った通り、ベクトル自体は数値の塊です。その数値の塊を作る作業がまず発生しますが、作られると同時に出来た数値の塊と似た数値を持つベクトル空間の近くに配置されます。これをEmbedding(エンベッティング)と言います。
世の中にはすでに学習済みのEmbeddingモデルが大量にあり、そのモデルごとに少しずつ特徴が異なっています。日本語を含めた多言語対応しているものもあれば、していないものもありますが、モデルの出来の良さによっては意味を正確にとらえた数値化を行うことができます。
こうしてできているベクトルが、文字の意味を本当に理解して意味を持った数値となっているとしたら、文章を数値として表現することが可能です。
クエリーも同じように数値化(ベクトル化)します。すると、事前にベクトル化しておいた文書群の中から、クエリーのベクトルに近いもの、つまり意味が近い文書を探し出すことができます。
これは、先ほど説明した3種類の検索方法のうち、キーワード検索と比較すると分かりやすくなります。例えば、Googleやサイト内検索などのキーワード検索は、「このキーワードはどこに含まれているか」を探し、考え方によっては意味の近いものを探してきます。
一方、ベクトル検索は、意味が近いものをベクトル空間の中から探します。そのため、検索語とまったく同じ単語が使われていなくても、意味が近い文書を見つけ、「目的の情報はこの文書にあります」「こういう風に書かれています」といった形で結果を返せるわけです。ここまでがベクトル検索の2番目の世界です。
ここまでをまとめると、まず、Embeddingモデルを使って、文書の意味をしっかり捉えた数値(ベクトル)に変換します。このベクトルは、意味が近いものほど近くの空間に配置して集められます。
次に、自分が質問したい内容(クエリー)をベクトル化します。その後、あらかじめベクトル化して集めておいたものの中から、クエリーのベクトルに近いものを検索して取得し、どこに関連する情報が書いてあったのかを探し出すという流れです。
ここで、今度はベクトルに近いものを探してくるという技術が必要になりますが、それを可能とするのがベクトルデータベースです。ベクトルデータベースは、あらかじめベクトル化したデータが保存されており、その中からクエリーにできるだけ近いものを検索できるデータベースエンジンです。
まず、検索したい文字列(クエリー)を入力するとベクトル化されます。その後、データベースに保存されているベクトルとの距離が近いものが検索され、上位10~20件の検索結果を取得できる仕組みになっています。
この周辺についてより詳しいことを知りたい方は、技評のPython Monthly Topicsの4月号、5月号で詳しく書きましたので、そちらをご覧ください。今回のお話をもとに読んでいただくと、理解が進みやすいのではないかと思います。
Pythonによるベクトル検索の基礎と実践~Embedding、Vector DB~(技評4月号)
Pythonマルチモーダル検索とANN〜ベクトル検索の応用編〜(技評5月号)
EmbeddingモデルとPythonの関係
ところで、Embeddingモデルはこの5年ほどの間にかなりの数のモデルが増えています。
元々、LLMをはじめ、ディープラーニングを基礎技術としたさまざまなAIモデルが作られており、Embeddingモデルも、その一つです。
最近では、LLMの技術を活用したEmbeddingモデルが作られるようにもなっています。
なお、モデルのベースがいくつかあります。、LLMをベースにした物が最近は目立っています。当初は、BERTをベースにしたものが多く、それによって意味を持ったベクトルを生成できるようになりました。
ここでPythonとの関係です。Pythonはベクトル化やEmbedding、それらを学習するときのツールのデファクトスタンダードとして使われています。
一般的にEmbeddingモデルの学習には多くの時間とコストがかかるため、多くの場合はGPUが利用されます。公開されている学習済みのモデルを利用するだけであれば、自分でモデルを学習させる必要はありません。
そのモデルを作る世界に到達するには非常にハードルが高いのですが、Pythonでは、Hugging FaceのTransformersライブラリをベースにしたSentence Transformersなどを利用できますので、学習済みのEmbeddingモデルを比較的簡単に扱えます。
また、GPUがあれば、より高速にベクトル化することができますが、必ずしもGPUが必要なわけでもなく、CPUでもベクトル化は可能です。さらに、最近のApple Siliconを搭載したMacBookでもある程度高速にベクトル化できます。
Sentence Transformersをきちんと利用すれば、GPUやApple Siliconが利用できる環境でそれらを活用し、そうでない場合でもCPUでベクトル化できますので、Pythonできちんとやりかたを覚えれば、ベクトル検索の世界に近づけるかと思います。
もちろん、ベクトル検索の世界はPythonだけのものではなく、他のプログラミング言語でも利用できます。ただ、PythonでやるのならSentence Transformersを直接利用できますし、一歩進めばモデルのカスタマイズにも取り組みやすいというのが利点となります。
ここまでがベクトル検索の概要となります。
ベクトル検索への挑戦
ベクトル化したデータをデータベースに保存し、近いものを探し出せるようにするというのが基本的な仕組みなわけですが、実のところ、その構成要素を分解していくと、中で使われている技術自体は難しくても、そこまで高度なプログラミング力が必要なわけではなかったりします。
サンプルコードは世の中にあふれていますし、先ほど紹介した私の記事の中でも記述していますので、それらが読めるようになれば使い方がわかってくるのではないかと思います。
ベクトル検索の世界では、驚きの結果がでることがありますので、自分が持っている文書をベクトル化できれば、自分だけの検索エンジンが作れます。また、その先にはRAG(Retrieval-Augmented Generation)があります。RAGは、ベクトル検索で得た結果をLLMに渡し、それをもとに自然言語で回答を作ってくれる仕組みです。この技術をうまく活用すれば、自分が持っているデータの中だけを検索して、回答を得られるようにできますので、FAQのような受け答えも作れるようになります。
ただのテキスト検索からマルチモーダルな検索へ
ここまで、検索の世界をテキストの文字列を検索するという世界観でお話してきましたが、ここからさらに踏み込んでいくと、文字列以外の画像などのいろいろなデータを扱うことができるマルチモーダルな世界になります。
画像を検索するには、ピックアップしたい画像について文字列を入力します。こういったことは最近のAIでもできますが、この技術を使えば自分やコミュニティが持っている写真の中から言葉で探せるようになります。
画像検索というと、かつては写真にタグ付けなどの説明文付けというアノテーションの作業を人手で行っていました。ですが、マルチモーダル用のEmbeddingモデルは、ベクトル化の時に画像と言葉を同一のベクトル空間になるように事前に学習したものが存在していますので、データベースにためてあるものをアノテーションなしに自然言葉で検索できるようになります。
先ほど紹介した技評5月号の記事で、Google社のSigLIP 2というマルチモーダルEmbeddingモデルを取り上げていますが、こういったものを利用することで自分の持っている画像を検索できるようになります。
少し不思議な感じはするかもしれませんが、こういった事前に学習されたモデルを利用すれば同じようなことをできるベクトル検索の世界を実現することができます。
また、もうひとつ。私が面白いなと思っているところとして、顔写真をベクトル化するという技術です。これは非常に進化している技術で、すでに複数の写真から顔の情報を抜き取り、その特徴をベクトル化させています。
このモデルを使った実験では、現在の私の写真から10年前の写真をピックアップすることができ、とても驚きました。これは顔の特徴がすべてベクトル化されているためで、別の写真であってもベクトルが近いものから探し出せます。
データ分析試験とベクトル検索
私たちがやっているデータ分析試験でもベクトルという言葉が出てきます。
ベクトル検索では、ベクトル同士の近さをどのように測るために、いろいろな方法が利用されています。例えばL2ノルム(ユークリッド距離)やコサイン類似度があります。また、ベクトルが正規化されている場合は、内積を用いて類似度を求めることもできます。
こういったベクトル検索の構成要素を数学的に解釈ができるかという点は、データ分析試験の範囲の中でも問われますので、すでに試験に合格された方の中でもこのベクトルの解釈が苦手だと感じている方は再勉強してもらえればと思います。
そうすると、「ベクトル同士が近いとはどういうことか?」といった疑問を抱えると思います。この近さという部分にはいろいろな指標が実際にはあるわけですが、多くの場合はコサイン類似度が利用されます。また、ベクトルがL2正規化されている場合は、内積によって同じように類似度を求めることができます。内積計算はPythonではNumPyの@演算子で簡単に答えを求められます。その類似度を数値として計算し、数値の大きい順に並べることで、検索結果として利用されます。
高校や大学で学ぶベクトルや行列演算が、このような技術にも活用されていることが分かると思います。また、細かな計算式を覚えなければならないというようなものでもありませんので、改めて触れていってもらえればと思います。
おまけ
2026年8月21日から広島県で開催されるPyCon JP 2026では、私のトークが採用され、画像検索関連のトークを行います。トークタイトルは「VLMで2.3万枚のPyCon JP写真を検索!無料クラウド枠で実用的なマルチモーダル&顔認識検索システムを構築した裏側」と少しマニアックな内容になっていますが、ベクトル検索の可能性や、画像検索について触れて頂けるチャンスになるかと思います。
初心者・初学者にもわかりやすく解説するつもりですので、是非とも会場でお会いできればと思っています。
