AIGCの進化を加速させる鍵：なぜベクトルストアが不可欠なのか？

最近、AIGCに関する記事を読むと、<font color="red">**`RAG`**</font>（Retrieval-Augmented Generation）や<font color="red">**vector store/vector database**</font>といったキーワードがよく登場します。

RAGという手法や、それを実装する上で必須となるベクトルストアについて理解するには、ベクトルの基礎から従来のリレーショナルデータベースが抱える課題に至るまで、多岐にわたる背景知識が必要になります。初心者にとっては、これらの概念をすべて理解するにはかなり難しいでしょう。そこでこの記事では、初歩から丁寧に、わかりやすく解説を進めていきます。読み進めるうちに、初心者の方でも以下の点について理解できるようになることを目指します。

- 従来のリレーショナルデータベースではなぜAIGC分野の要求を満たせないのか、そしてなぜベクトルストアが必要とされるのか
- そもそもベクトルとは何か、具体的にどういうものなのか
- AIGC分野で大規模言語モデル（LLM）だけでは足りない理由と、ベクトルストアがなぜ不可欠なのか
- ベクトルストアの業界地図

# 1. リレーショナルデータベース
## 1.1 リレーショナルデータベースとは
リレーショナルデータベース（Relational Database、RDBと略語される）は、関係モデルを基にデータの蓄積、検索などを実現できるシステムです。
代表なリレーショナルデータベースにはオープンソースの`MySQL`や`PostgreSQL`と商用の`SQL Server`や`Oracle`などがあります。

データを<font color="red">**行**</font>と<font color="red">**列**</font>から成る<font color="red">**テーブル形式**</font>で格納し、利用者が理解しやすい構造にしています。
リレーショナルデータベース内のテーブルは、行（レコード）と列（フィールド）の集まりであり、複数のテーブルでデータベースが形成されます。

同一の列には同じ型のデータが入り、数値型や日付型や文字列型など<font color="red">**ほとんどのデータ属性は直接比較することが可能**</font>です。そのような<font color="red">**構造化データ**</font>の蓄積も検索も非常に効率よくできています。

https://www.javadrive.jp/mysql/type/

## 1.2 リレーショナルデータベースの欠点
しかし、直接比較が難しい属性のデータは検索に苦労します。
たとえば、画像、音声、動画、ドキュメント/テキストデータなどの<font color="red">**非構造化データ**</font>をバイナリデータへ変換された上で、リレーショナルデータベースに保存することは可能ですが、そのデータを直接検索することはできません。

一見、自然言語で書かれた文書やテキストデータは検索しやすそうに思えますが、実際にはそう簡単ではありません。もし検索対象がキーワードだけであれば比較的容易ですが、<font color="red">**セマンティック検索**</font>、つまり単にキーワードが一致するかどうかだけでなく、文書の意図や意味まで理解し、関連性の高い情報を探し出す作業は、格段に難易度が上がります。

現在、文書やテキスト、画像、ビデオ、音声などの非構造化データが一般的に多く使われていますが、これらのデータは直接比較が難しいため、検索が難しいという問題があります。

# 2. vector store
## 2.1. vectorとは
まずは、身近な例からご説明しましょう。
コンピュータ科学に詳しい方ならご存じかと思いますが、色の表し方には基本的な原則があります。私たちは、赤、緑、青という基本色が存在し、これらを組み合わせることで様々な色を作り出すことができることを知っています。これは、ベクトル表現の典型的な例です。
この事例では、いくつかの要素が関わってきます。RGB(赤、緑、青)の3つの色は、基本的な次元として捉えられ、これらによって3次元の座標系が形成されます。この座標系を用いて、点の位置を特定することができます。色を混ぜるとき、私たちは実質的にこの座標系の中で一点から別の点へ移動しているのです。この移動は、ベクトルとして表されます。

ベクトルって、<font color="red">**高校2年生の数学で習ったあの概念!!**</font>
ベクトルが新しいデータモデルだとか、新しい概念だとかいうわけではありません。実は、これは数学の世界で長い歴史を持つ概念で、高校を卒業した人なら誰もが知っているはずのものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/e29b5dc4-abba-938f-8551-be948d942000.png)

IT分野でもベクトルは基本データ構造である<font color="red">**配列**</font>であり、ほぼすべての初級レベルのコンピュータサイエンスの授業でも教えられています。
ベクトルは実際には<font color="red">**一連の浮動小数点数**</font>であり、配列の形で並んでいます。

ベクトルは、一見すると単純な数字の集まりに過ぎませんが、幾何学的な視点から見ると、これらの数値が多次元の配列空間を作り出し、それぞれの次元が<font color="red">**その空間の様々な特徴や属性を代表**</font>していると言えます。
さまざまな属性を定義することで、<font color="red">**文書やテキスト、画像、ビデオ、音声などの非構造化データを多次元ベクトルとして描写することができます。**</font>

ベクトルは<font color="red">**比較可能**</font>です。
たとえば、色をRGBで表される色のベクトル=配列（赤なら[255,0,0]」のように）に変換すれば、異なる色同士がどれくらい似ているか、またはどれくらい近いかを比較できます。
比較するには、ユークリッド距離やコサイン距離などの距離を算出する方法がありますが、結果は通常、距離に基づいて順序付けられ、TOP K、すなわち最も類似しているオものの上位K個（K-NN、k近傍法）が選ばれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/f18897ac-485e-d12a-9591-f2539d6006bc.png)

直接比較できない非構造化データも、ベクトルに変換することで、そのベクトルが示す分布や距離が実際の関係性を映し出していれば、ベクトル同士の比較を通じて検索を実行することが可能になります。この技術によって、画像検索やテキスト検索などの機能が実現されています。


## 2.2. vector embeddingsとは
さまざまなサイズや内容の画像を同じベクトル空間にマッピングしたり、長さが異なるテキストを一つのベクトル空間に置き換えることが可能です。この空間内で、互いに近い位置にあるベクトルは、似た意味合いを持つとされています。

<font color="red">**vector embeddings(ベクトル埋め込み)**</font>とは、<font color="red">**非構造化データをベクトル（配列）に変換すること**</font>、すなわちデータを<font color="red">**ベクトル化**</font>することを意味します。

<font color="red">**ベクトル化のプロセスは、ベクトルストアではなく、専門の機械学習モデルを用いて行います。**</font>

ここでは特にテキストデータに焦点を当てて説明します。
テキストデータを扱う際、一般的には単語や文章などの離散的なテキストを連続値のベクトル空間にマッピング（埋め込み）し、テキストを機械が解析しやすい形式に変換します。埋め込みの主な目的は、テキストの意味や文法的な情報を把握し、それを以降の作業で役立てることです。埋め込みを活用することで、テキストデータに基づいて数値計算や機械学習のタスクをより効果的に進めることができます。これは、テキストの分類、クラスタリング、感情分析などに利用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/83fe6eab-46b8-d942-db1a-7c6b47615845.png)

## 2.3 vector storeとは
ベクトルデータベースの主な機能は以下の通りです：
- ベクトルのCRUD(追加、削除、更新、検索)
- インデックス技術を用いて、高速なベクトル検索機能
    - これは、K近傍法(KNN)や近似最近傍法(ANN)などのアルゴリズムを用いて、各ベクトル間の類似度を計算し、意味的に関連する情報を見つけ出す「ベクトル検索」を行うことを意味します
    - CRUDはデータベースの基本機能であり、従来のデータベース製品がベクトル型のサポートを加えることは難しくありません。拡張性が十分にあれば、多くのコードを変更する必要さえないため、インデックスの差異がコアコンピタンスとなります

## 2.4 vector storeと従来のデータベースの主な違い
1. データの規模
従来の関係型データベースでは、1億件のデータ管理を大規模な取り組みと見なしていますが、ベクトルストアの場合、数千億のデータを扱うのが一般的です。たとえば、512個の浮動小数点数から成るベクトルは約2KBのサイズになります。数千億のデータを保存するためには、200TBのストレージ容量（バックアップを除く）が必要ですが、これは単一のマシンでは扱えない規模です。その結果、拡張可能な分散システムが必要になり、システムの拡張性、信頼性、コスト効率に大きな挑戦をもたらします。

2. クエリの方法と計算集中性
従来のデータベースでのクエリは、ポイント検索や範囲検索のような正確な検索が主で、検索結果は条件に完全に一致するかどうかに基づいています。
一方で、ベクトルストアでは、近似検索が一般的で、条件に「近い」結果を探します。得られる結果は入力条件と最も似たものですが、このような近似比較には高度な計算処理能力が必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/fc062bff-b0f7-8b30-c9a6-aa47bdc07e90.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/60533f24-dab0-84ed-b308-dbed765e2637.png)

## 2.5 vector storeの役割
1. プライベートなドメイン知識の蓄積
プライベートなドメイン知識をベクトルストア蓄積し、そしてベクトルストアをLLMの外部知識ベースとして活用できる。自社専用のLLMをトレーニングする必要がなく、汎用のLLMをチューニングするよりもコストが抑えられ、速度も速いため、データベースの更新を通じてAIの知識をリアルタイムに更新できるというメリットがあります。

1. 自社データを外部に漏れないこと(データの安全性)
企業が保有するデータを内部のデータベースに保存し、ChatGPTなどのpublicなLLMの学習に供することなく社内で管理できます。

1. 長期記憶の保持
LLMは基本的に短期記憶しか持ち合わせていません。例えば、ChatGPTを利用すると、扱えるコンテキスト情報には一定の制限があります。ベクトルストアを用いることで、このような制限を超え、コンテキスト情報の喪失を防ぐことが可能になります。


## 2.6 vector indexとは
例えば、1000次元のベクトル間の類似度を公式で計算しようとすると、計算量が膨大になり、CPUへの負荷も大きくなります。1億個のベクトルをそれぞれ一度計算しようものなら、時間と計算コストはさらに跳ね上がります。この問題を解決するために、「ベクトルインデックス」という概念が用いられます。

ベクトルインデックスは、特定の数学モデルを使用して、時間と空間の効率性を追求したデータ構造で、ベクトルデータを整理するために構築されます。ベクトルインデックスを利用することで、目的とするベクトルに類似したベクトルを効率良く探し出すことが可能になります。

ベクトルインデックスは、従来のリレーショナルデータベースのインデックスと似た役割を持ちますが、一つ大きな違いがあります。ベクトルストアでベクトルインデックスによって見つかるのは、近似的な結果であり、100%正確な結果ではない点です。ベクトルインデックスは類似度に基づいていますので、これを「近似最近傍検索（Approximate Nearest Neighbor Search、ANS）」と呼びます。ベクトルインデックスがない場合、あるベクトルの類似度を探す作業は、リレーショナルデータベースでの全スキャンに似ており、しかもさらに計算処理が加わるため、コストは大幅に高くなります。


## 2.7  vector storeの種類
検索文からユーザーの意図や目的をしっかりと捉え、ユーザーが探している情報にピッタリ合った検索結果を提供するセマンティック検索の分野では、ベクトルストアには様々な形態があります。

- 専用のベクトルストア:
    - Pinecone
    - Milvus
    - Weaviate
    - FAISS
    - Chroma
- 既存のデータベースシステムにvector storeの機能を追加したもの: 
    - PostgreSQLのオープンソース拡張機能`pgvector`
- 検索サービスにvector storeの機能を追加したもの: 
    - Elasticsearch
    - Amazon OpenSearch

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28664/d5b1f55b-4e57-a296-e3df-766587220792.png)

https://atmarkit.itmedia.co.jp/ait/articles/2402/29/news042.html