ベクトルデータベースWeaviateの概念を整理する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以前の記事で、ベクトルデータベースのPineconeを紹介しました。そろそろ他のベクトルデータベースも試してみたいと思い、今回はWeaviateについて調べてみました。「ベクトルデータベースとは」というところについては、以前の記事で触れていますので参照してください。

Weaviateの概要

Weaviateは、オープンソースでAI Nativeのベクトルデータベースです。「AI Native」というところが特徴で、MLモデルをモジュールとして組み込むことができ、それによってデータベースの内部でオブジェクトのベクトル化を行ったり、分類をしたり、結果を言語生成して返すなど様々なユースケースに対応できます。

主な特徴は以下のとおりです。(What is Weaviate? より意訳してます)

  • オープンソースです。
  • データオブジェクトをベクターでインデックス化することで、そのセマンティックな特性に基づいて保存・取得することができます。
  • スタンドアローン(純粋なベクトルデータベース)としても使えますし、コア機能を拡張する様々なモジュールと一緒に使うことでベクトル化を代替したりできます。
  • GraphQL APIがあり、データに簡単にアクセスすることができます。
  • 高速です(オープンソースのベンチマーク

Weaviateの概念

Weaviateはかなり多機能で、ドキュメントを読んで全体を把握するまでがけっこう大変なので、予め知っておくと良さそうな概念(コンセプト)をまとめていきます。

実行環境

  • Weaviate: WeaviateはOSSなので、ローカル環境で動作させたり、自前でサーバーを立て動作させることができます。
  • Weaviate Cloud Services(WCS): AWS/Google Cloud/Azureなどのクラウド環境にデプロイされたフルマネージドサービスです。
  • Embedded Weaviate: クライアントライブラリを使用して、アプリケーションコード内で直接Weaviateを実行する(Experimentalです)

※ 本記事ではWCSやEmbedded Weaviate特有の概念は扱いません。

データ構造

  • Class: データベースに格納されるデータの型です。Classの設定はSchemaによって定義されます。
  • Schema: Classに格納されるデータの構造や、Classで使用するモジュールの設定などを定義します。
  • Class Collection: 同じClassのData objectの集合です。この単位でベクトル空間(インデックス)が作られます。
  • Cross-references: 異なるClassのData objectに関連を持たせることができます。より高度な検索やユースケースに対応することができます。
  • Data object: Classに格納されるデータのことです。内部的には、構造化されたオブジェクト(JSON)とベクトル(オブジェクトをEmbeddingしたもの)の両方を保持します。データには全てのコレクションに渡って一意なUUIDが自動的に付与されます。UUIDはCross-referencesに使用されます。

モジュール

Weaviateはモジュール化されたアーキテクチャを採用しており、例えばベクトル化やバックアップなどの機能は、オプションのモジュールによって実現されます。

以下がWeaviateのアーキテクチャです。

Modules - Introductionより転載)

主なモジュールの種類

  • Vectorizer: データオブジェクトをベクトル化するために使用されるモジュールです。text2vec-*, multi2vec-*, img2vec-* などのモジュールがあります。これらは Dense Retriever と呼ばれるモジュールで、密なベクトルを作り、セマンティック検索に使用されます。一方、Sparse Retrievers と呼ばれる疎なベクトルについては、まだ対応していないですが、まもなくMB25が対応される予定があるようです。(Dense RetrieverとSparse Retrieversについては、こちらの記事も参考にしてください。)
  • Retriever: Vectorizerとセットになっているようです。いまいち役割が掴みきれていないので、分かったら追記します。
  • Reader: 質問から検索されたデータの集合から、答えを抽出するモジュールです。内部的には、入力された質問をベクトル化してセマンティック検索を行い、その結果をMLモデルで質問に対する回答文章として返します。
  • Generator: 質問から検索されたデータの集合から、言語生成モデルを使用して回答を生成するモジュールです。内部的には、入力された質問をベクトル化してセマンティック検索を行い、その結果を言語生成モデルで文章化して返します。

その他にも、gcs-backuptext-spellcheck などのモジュールがあります。モジュールのインターフェイスに従えば自分でオリジナルのモジュールを作ることもできます。

インデックス

WeaviateはClassに対して、近似最近傍インデックス(ANN)と転置インデックスの2つのインデックスを作ることができます。

  • 近似最近傍インデックス(ANN): セマンティック検索に使用されるベクトルのインデックスです。
  • 転置インデックス: データのプロパティによる検索や、BM25クエリ(キーワード検索に近い)に使用されるインデックスです。

ベクトルインデックス(ANN)に対しては、ユースケースに応じていくつかのアルゴリズムの中から選択できるようです。

インターフェイス

RESTful APIとGraphQL APIが用意されています。

役割としては、RESTful APIは管理系のエンドポイント、GraphQL APIは検索系のエンドポイントとなっています。

また、GraphQL APIのGUIとして、Weaviate Consoleが用意されています。ローカル環境のインスタンスとも接続できます。

おわりに

ざっと駆け足でWeaviateの概要を紹介しました。

従来、データベースといえばデータを格納・検索するものでしたが、Weaviateはモジュールの仕組みによってアプリケーションの一部を代替してくれるようになっていることがとても新鮮でした。データベース側がMLの処理を行うことで、アプリケーション側の実装や負荷を下げることができます。一方で、MLがデータベース側のCPU/GPUを使うことになるため、リソースを上手く分散できるのかが気になりました。(OpenAIのモデルを使う場合はAPIなので負荷がかからないですが)。このあたりはトレードオフが発生すると思うので、よく調べたほうが良さそうです。

まだまだ分かっていないことが多いので、さらにドキュメントを読んだり、色々なモジュールを試してみたいと思います。