【生成AIアプリのためのベクトル検索】③ ベクトル検索の概念的理解

# はじめに

## 背景 〜 ベクトルデータベースとしてのApache CassandraとDataStax Astra DB

2022年からの生成AIの隆盛に対して、[Apache Cassandra](https://cassandra.apache.org/_/index.html)に対して、[DataStax](https://www.datastax.com/jp)エンジニアにより[ベクトル検索機能の拡張提案](https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-30%3A+Approximate+Nearest+Neighbor%28ANN%29+Vector+Search+via+Storage-Attached+Indexes)が提案され、DataStax社のCassandraマネージドサービスである[Astra DB](https://www.datastax.com/lp/astra-registration)で利用可能になっています。
本記事シリーズは、このような動向の一環として同社から発表されたホワイトペーパーの内容に基づきます。

## 出典と日本語版

このシリーズ記事の原典は、以下で入手可能です。

https://www.datastax.com/resources/whitepaper/vector-search-for-generative-ai-apps

ブログ記事では、忠実な訳出ではなく、読みやすさを重視して、一部省略しています。
省略のない日本語版のホワイトペーパーの入手を希望される方はinfo-jp@datastax.comまでご連絡いただければ、提供させていただきます。

# 【生成AIアプリのためのベクトル検索】③ ベクトル検索の概念的理解

## ベクトル検索とは何か?

ベクトル検索は、類似した属性または特徴を持つ関連オブジェクトを検索する方法です。ベクトル検索を活用することができるオブジェクトの一般的な例には、テキスト、画像、ビデオなどがあります。

ベクトル検索では、**エンベディング**と呼ばれる特定のタイプの機械学習モデルを使用して、オブジェクトとそのコンテキストを記述します。エンベディングされたデータは、オブジェクトのセマンティクスを捉えるベクトルです。このアプローチにより、ベクトル検索では、正確にどの部分が類似する対象を探すことになるかについて前知識を持つ必要がなく、類似したデータを見つけることができます。

ここで英語を例に挙げると、「happy」、「cheerful」、「joyful」という単語はすべて同様の意味を持ちますが、従来のキーワードベースの検索では、「happy」というキーワードを用いた場合、「cheerful」と「joyful」に一致するドキュメントは検索されません。これを解決するのが、ベクトル検索の能力です。ベクトル検索は意味を理解することができるため、ユーザーが網羅的に指示せずとも、検索したい対象を伝えることができます。

ベクトル検索は、　**近似最近傍 (ANN) 検索**と呼ばれるアルゴリズムを使用して非常に高速に実行できます。ANN(approximate nearest neighbor)は、数学的に互いに類似するベクトルを素早く導出します。

## エンベディング（埋め込み）の基礎 
エンベディング（埋め込み）は、テキストの意味を封じ込めたデータの数学的表現です。テキストをベクトル化して埋め込み（エンベディング）表現に変換する際には、ドキュメントを構成する単語群から数値のリストへの変換を実施します。エンベディングの結果、ベクトル空間内では、互いに関連性の高い意味を持つベクトル同士は、近接した場所に配置されることになります。

予め注意しておくと、ベクトル空間は実際には非常に大きな次元を持つ（ ベクトルは多くの数値で構成される）のが通常です（が、ここでは単純化しています）。

### ベクトル間の類似性の概念的把握

例を用いて考えてみましょう。図 1 は、「衣服の種類」に関する次元と「服の色」という属性に関する次元の2つの次元を持つ単純なベクトル空間を示しています。

#### 図1.  衣服を表現する2次元ベクトル空間

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/c745e296-0d31-32b2-d1d0-e16a78787b21.png)


この例では、ベクトルは2次元の情報を持ち、ベクトルデータを構成するそれぞれの要素は、次の２つの情報を表してます：

```JavaScript
[<衣服の種類>, <服の色>] 
```

ここで、「赤いシャツ」のベクトルは `[1, 1]`で、「青いズボン」のベクトルは `[-1, -1]` で表されているとします。そこに、「緑色のスカート」を加えます。スカートは機能的にはズボンに近く、緑は色のスペクトルとして青に近いため、そのエンベディングベクトルは「青いズボン」に近い位置にあるはずで、例えば`[-0.8, -0.8] `のような値を取ると推測することができます。 

上の例は、エンベディングを使ってベクトル空間を構築する方法と、その空間の中で、オブジェクトが存在する場所についてのアイディアを示しています。

### エンベディングに対する算術演算
次に、エンベディングに対する算術演算がどのように機能するかを示す例を見てみましょう。ここで扱うベクトル空間は、「人物の肩書き」と「性別」という二つの概念を捉えた情報を扱っています。図2を参照ください。



#### 図2. セマンティック情報を保持するベクトル演算の例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/a1740341-df49-fbfd-fa82-5ef1fc8cbf0a.png)


埋め込み（エンベディング）表現はベクトルであるため、ベクトル同士で算術演算を行うことができます。その際、その演算結果のベクトルには、ベクトルの元となった自然言語の組み合わせに相当する意味概念が保持されることが期待されます。

たとえば、ベクトル同士の計算において、《「王子」 - 「男性」 + 「女性」 》という計算式の結果として得られるベクトルは、「プリンセス」を表すベクトルと類似する値であると考えられます。

同様に、《「王子」 - 「男性」》 と《「プリンセス」 - 「女性」》という２つの計算式の結果のベクトルは、互いに非常に近い距離にあるでしょう。この場合、これらのベクトルは、「王または女王の直系の子孫である王族（男女の別を問わない）」という概念を捉えていると見ることができます。

# 最後に 

ここで挙げられている用例は、あくまで概念的把握のための単純化された例です。
例えば、３次元空間を表すベクトルのそれぞれの要素が、それぞれ縦横高さの距離の数値を著しているのとは異なり、実際のエンベディングモデルでは、それぞれの次元が持つ意味は、このように単純に考えることができません。

そのため、エンベディングモデルが行っている操作については、基本的にブラックボックスとして扱うのが理に適っています（それは例えば、３次元空間を表すベクトルデータが、３次元の空間配置を前提として意味を持つ〜ベクトルの数値自体にはその情報は含まれない〜のと同様と言えます）。
大事なことは同じモデルを使った結果同士の比較に意味があるということです。

エンベディングモデルには、さまざまな目的をもつものが存在しています。ハギングフェイスのリーダーボードで情報を確認することができますので、参考まで紹介します。

https://huggingface.co/spaces/mteb/leaderboard