DUICUO

AI メモリを提供するための 8 つの優れたオープン ソースの無料ベクター データベース。

今年は大規模AIモデルの応用が爆発的に成長しました。中でも、LangChainやHaystackといったエンドツーエンドの大規模言語モデル応用フレームワークが、ベクトルデータベースに注目を集めています。

ベクター データベース (ベクター データベースとも呼ばれます) は、簡単に言えば、ベクター形式でデータを管理、保存、取得するデータベースです。

ベクトルデータベースはなぜ AI にとってそれほど重要なのでしょうか?

高次元データの処理における本質的な利点から、ベクターデータベースは画像処理からレコメンデーションシステムまで、あらゆる分野で陰ながら重要な役割を果たしていることは間違いありません。主な機能は以下のとおりです。

  • 管理: ベクター データベースはデータを生データ形式で処理するため、データを効果的に整理および管理でき、AI モデルの適用が容易になります。
  • ストレージ: さまざまな AI モデルで使用される高次元データを含むベクトルデータを保存できます。
  • 検索:ベクターデータベースはデータの効率的な検索に優れており、AIモデルが必要な時に必要なデータを迅速に取得できるようにします。これが、ベクターデータベースがレコメンデーションシステムや検索システムで利用される主な理由です。

したがって、ベクトルデータベースはAIに記憶を与えると言えるでしょう。記憶には、記録と保存だけでなく、検索と管理も含まれます。人間の記憶と同じように、私たちは卒業写真からクラスメイトをいつでも認識できますし、友人と会話をするときには往年の思い出を振り返ることがよくあります。

では、ベクター データベースはどのように機能するのでしょうか?

ベクター データベースの中核は、数学モデルを使用したベクター データの管理です。

では、ベクトルとは一体何でしょうか?簡単に言うと、ベクトルとは方向と大きさの両方を持つ数値オブジェクトです。ベクトルデータベースでは、画像やテキストなどの複雑なデータをベクトルで表現することができます。

各データセグメントは高次元空間のベクトルに変換され、管理されます。類似するデータセグメントを見つける必要がある場合、データベースはすべてのエントリを走査してフィルタリングする必要はありません。代わりに、ベクトル間の距離を計算することでデータをマッチングします。ベクトルが近いほど、データの類似性が高いと判断されます。この方法は非常に効率的で、従来のリレーショナルデータベースと比較して、大量のデータをより高速に処理できます。

以下はテキストベクターストレージの例の図です。

以下は、画像のベクトル化の保存と取得の例の図です。

周知の通り、汎用的な大規模モデルの実行には膨大な計算リソースが必要となるため、多くの大規模モデルはMaaSをベースとしており、その結果、民営化コストが高額になります。一方、特定の業界に特化した大規模モデルアプリケーションでは、データセキュリティ要件が厳しく、セキュリティと専門性を実現するために、関連するビジネス知識やドメイン知識との緊密な統合が求められる場合が多くあります。LangChainのようなフレームワークは、業界特有の大規模モデルアプリケーションに典型的なソリューションを提供し、オープンソースのベクトルデータベースは、LangChainのようなソリューションを根本的にサポートしています。実際、ベクトルデータベースは、エンタープライズナレッジベース、レコメンデーションシステム、ドキュメント管理など、多くのアプリケーションシナリオでも非常に有用です。そのため、ベクトルデータベースは、大規模モデルアプリケーション開発において人気の高い技術となっています。

優れたオープンソースベクターデータベースプロジェクト8つ

オープンソースコミュニティは、ベクターデータベースの開発に計り知れない貢献をしてきました。多くのオープンソースベクターデータベースプロジェクトは、パフォーマンス、柔軟性、堅牢性において優れています。以下は、現在利用可能な優れたオープンソースベクターデータベースプロジェクト8つです。これらのプロジェクトは、AIソリューションに最適なテクノロジーの選択肢となるはずです。

1. ミルバス

https://github.com/milvus-io/milvus

Milvusは、Zillizが提供する高度にカスタマイズ可能なオープンソースのベクターデータベースで、組み込み類似検索などのAIアプリケーションをサポートするように設計されています。Milvus 2.0がリリースされました。これは、ストレージと計算を分離したクラウドネイティブなベクターデータベースです。Milvus 2.0のすべてのコンポーネントはステートレスをサポートしており、アプリケーション全体の柔軟性と耐障害性が向上しています。

Milvus は、Faiss、Annoy、HNSW などの主流のベクトル検索ライブラリ上に構築されており、数百万、数十億、さらには数兆のベクトルを含む高密度のベクトル データセットで類似性検索を実行するように設計されています。

Milvusは、データシャーディング、データ永続化、ストリーミングデータの取り込み、ベクターデータとスカラーデータのハイブリッド検索など、多くの高度な機能をサポートしています。最適な可用性と耐障害性を実現するには、Kubernetesを使用してMilvusをデプロイすることをお勧めします。

Milvusは共有ストレージアーキテクチャを採用し、ストレージとコンピューティングを分離することで、コンピューティングノードに水平方向のスケーラビリティを提供します。データプレーンとコントロールプレーンの分離の原則に従い、Milvusはアクセスレイヤー、コーディネーションサービス、ワーカーノード、ストレージの4つのレイヤーで構成されています。これらのレイヤーは、スケーリングとディザスタリカバリの観点から、互いに独立して動作できます。

以下は Milvus のアーキテクチャ図です。

Milvus の主な機能は次のとおりです。

  • 兆ベクトル データセットでのミリ秒レベルの検索をサポート: 兆ベクトル データセットでの平均レイテンシ (ミリ秒単位) をテストします。
  • 非構造化データの簡素化された管理: 豊富な API とクライアント間で一貫したユーザー エクスペリエンス。
  • 常に高い信頼性を維持: Milvus に組み込まれたレプリケーションおよびフェイルオーバー/スイッチバック機能により、障害発生時にもデータとアプリケーションのビジネス継続性が確保されます。
  • 高いスケーラビリティと弾力性のあるパフォーマンス:コンポーネントレベルのスケーラビリティにより、オンデマンドでのスケーリングが可能です。Milvusは負荷の種類に応じてコンポーネントレベルで自動的にスケーリングできるため、リソースのスケジューリングがより効率的になります。
  • ハイブリッド検索機能: ベクトルに加えて、Milvus は「ブール値」、「整数」、「浮動小数点」などのデータ型もサポートします。
  • 統合ラムダ構造:Milvusは、データストレージにストリーミングとバッチ処理を組み合わせることで、タイムリーさと効率性を両立させています。統合インターフェースにより、ベクトル類似性検索が容易に行えます。強力なコミュニティサポートと業界からの評価:1,000社を超えるエンタープライズユーザー、GitHubで23,000を超えるスター、そして活発なオープンソースコミュニティを誇ります。

詳細については、公式ウェブサイトをご覧ください:https://milvus.io

デモ: https://milvus.io/milvus-demos/

ドキュメント: https://milvus.io/docs

2. ファイス

https://github.com/facebookresearch/faiss

FacebookのAI研究チームが開発したベクトルデータベースであるFaissは、高次元ベクトル検索に優れています。非常に効率的なベクトルライブラリであるため、リアルタイム性が求められるアプリケーションに最適です。Faissは、類似度検索と高密度ベクトルクラスタリングのための高性能ライブラリです。そのアルゴリズムは、RAMサイズを超えるサイズのベクトルセットも含め、あらゆるサイズのベクトルセットを検索できます。また、評価とパラメータ調整のためのサポートコードも含まれています。FaissはC++で記述され、Python/NumPyの完全なラッパーを使用しており、一般的に使用されるアルゴリズムの一部はGPU上に実装されています。

Faiss は、ベクトルのインデックスのセットを保存し、それらを比較する関数を提供することで検索を実行します。

現在、Faiss は GitHub で 24,000 以上のスターを獲得しています。

CPU と GPU に基づいた Python のインストール方法は次のとおりです。

 $ conda install -c pytorch faiss-cpu
 $ conda install -c pytorch faiss-gpu

上記のうち 1 つだけをインストールできます。後者は前者のスーパーセットであるため、同時に 2 つをインストールすることはできません。

3. イライラさせる

https://github.com/spotify/annoy

Annoy(近似最近傍法、Oh Yeah)は、Spotifyが開発した軽量かつ強力なベクターデータベースです。大規模なデータセットを高速に検索できるように設計されており、迅速な応答時間を必要とするアプリケーションに最適です。C++ライブラリですが、Pythonでも使用できます。

大規模な読み取り専用ファイル データ構造を作成し、これらの構造をメモリにマップして、多くのプロセスが同じデータを共有できるようにします。

ANNOYは、本質的にランダム投影と木構造に基づくアルゴリズムです。2015年にSpotify在籍中のErik Bernhardsson氏によって開発されました。ANNOYは、100~1000次元の密なデータセットを対象に検索を実行するように設計されています。最近傍点を計算するために、点集合を半分に分割し、各集合にk個の要素が含まれるまで再帰的に処理を進めます。通常、kは約100です(下の図を参照)。

Annoy の主な機能の公式説明は次のとおりです。

  • 複数の類似度アルゴリズム(ユークリッド距離、マンハッタン距離、コサイン距離、ハミング距離、内積距離)をサポートします。コサイン距離は、正規化ベクトルのユークリッド距離(sqrt(2 - 2 * cos(u, v)))に相当します。
  • 次元が多すぎない場合 (例: <= 100)、パフォーマンスは向上しますが、1000 次元の場合でもパフォーマンスは非常に良好です。
  • メモリフットプリントが小さい
  • 複数のプロセス間でメモリを共有できる
  • インデックスの作成と検索は別々のプロセスです (特に、ツリーが作成されると、それ以上の項目を追加することはできません)。
  • ネイティブ Python サポート。バージョン 2.7、3.6、3.7 でテスト済み。
  • メモリ内の大きなデータセットに収まらないように、ディスク上にインデックスを構築します。

Pythonでannoyをインストールする:

 pip install annoy

Python で annoy を使用する:

 from annoy import AnnoyIndex import random f = 40 # Length of item vector that will be indexed t = AnnoyIndex(f, 'angular') for i in range(1000): v = [random.gauss(0, 1) for z in range(f)] t.add_item(i, v) t.build(10) # 10 trees t.save('test.ann') # ... u = AnnoyIndex(f, 'angular') u.load('test.ann') # super fast, will just mmap the file print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors

4. Nmslib

https://github.com/nmslib/nmslib

Nmslib(非計量空間ライブラリ)は、非計量空間におけるオープンソースのベクトルデータベースです。高性能でクロスプラットフォームな類似検索ライブラリであり、類似検索手法を評価するためのツールキットでもあります。コアライブラリはサードパーティに依存しません。

このプロジェクトの目標は、一般的な検索方法、近似検索方法、さまざまなメトリック空間アクセス方法、非メトリック空間方法など、一般的な空間と非メトリック空間の両方で検索するための包括的なツールキットを作成することです。

Nmslibは、新しい検索手法や距離関数を追加できる拡張可能なライブラリです。C++、Python、Javaでの使用をサポートしており、例えばJavaなどの言語を使用してクエリサーバーを構築できます。

5. クドラント

https://github.com/qdrant/qdrant

Qdrantは、ベクターデータベースとベクター類似性検索エンジンを含むオープンソースプロジェクトです。ベクターデータの保存、検索、管理のための便利なAPIセットを提供し、ペイロードデータも同時に保存できます。これにより、カスタムデータフィルタリングが容易になり、様々なニューラルネットワーク、セマンティックベースマッチング、ファセット検索、高精度なレコメンデーションなどのアプリケーションで非常に役立ちます。

QdrantはRustで開発されているため、高負荷時でも高い効率と信頼性を維持します。Qdrantは非常に使いやすいです。

(1)Dockerを使い始める

docker run -p 6333:6333 qdrant/qdrant br

(2)Pythonでの使用

インストール:

 pip install qdrant-client

接続する:

 from qdrant_client import QdrantClient qdrant = QdrantClient("http://localhost:6333") # Connect to existing Qdrant instance, for production

qdrant の特徴は次のとおりです。

  • フィルタリングと有効なデータ: Q​​drant は JSON 形式のペイロード (有効なデータ) をベクターに関連付け、取得のための should、must、must_not 条件のさまざまな組み合わせをサポートし、すべてのベクターを取得できるようにします。これは Elasticsearch の事後フィルタリングとは異なります。
  • 幅広いデータ型をサポート:ペイロードは、文字列一致、数値範囲、地理的位置など、さまざまなデータ型とクエリ条件に適応します。これらのフィルタリング条件により、類似性マッチングに基づくカスタムビジネスロジックを作成できます。
  • クエリ プランとペイロード インデックス: クエリ プランナーは、保存されたペイロード情報を使用してクエリを最適化します。
  • ハードウェア アクセラレーション: 最新の CPU x86-x64 アーキテクチャを活用することで、Qdrant は最新のハードウェアでより高速な検索パフォーマンスを実現します。
  • 書き込み前のログ:Qdrantは、停電時でも更新確認応答を通じてデータの永続性を確保します。更新ログにはすべての操作が保存されるため、データベースの最新の状態を容易に再構築できます。
  • 分散デプロイメント:バージョン0.8.0以降、Qdrantは分散デプロイメントをサポートします。複数のQdrantマシンがクラスターを形成し、Raftプロトコルを介して連携することで水平スケーリングを実現します。
  • スタンドアロン操作: Qdrant は、外部データベースやオーケストレーション コントローラーに依存せずにスタンドアロン操作をサポートし、構成を簡素化します。

6. クロマ

https://github.com/chroma-core/chroma

Chromaはオープンソースの組み込みベクターデータベースです。Chromaを使えば、LLMアプリケーションを簡単に構築できます。Chromaは非常にシンプルで使いやすく、柔軟性が高く、様々なアプリケーションシナリオのニーズに対応できるように設計されています。サードパーティの埋め込みモデルを使用したクエリとメタデータフィルタリングをサポートしています。

以下は、Chroma と OpenAI 埋め込みと組み合わせて使用​​されるアーキテクチャの概略図です。

Docker ベースの Chromadb については、以下を参照してください。

  • docker-compose: https://github.com/chroma-core/chroma/blob/main/docker-compose.yml
  • dockerファイル: https://github.com/chroma-core/chroma/blob/main/Dockerfile

実際のアプリケーション開発では、Python で Chroma を使用するのも非常に簡単です。

インストール:

 pip install chromadb

4 つのコア API の使用:

 import chromadb # setup Chroma in-memory, for easy prototyping. Can add persistence easily! client = chromadb.Client() # Create collection. get_collection, get_or_create_collection, delete_collection also available! collection = client.create_collection("all-my-documents") # Add docs to the collection. Can also update and delete. Row-based API coming soon! collection.add( documents=["This is document1", "This is document2"], # we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well metadatas=[{"source": "notion"}, {"source": "google-docs"}], # filter on these! ids=["doc1", "doc2"], # unique for each doc ) # Query/search 2 most similar results. You can also .get by id results = collection.query( query_texts=["This is a query document"], n_results=2, # where={"metadata_field": "is_equal_to_this"}, # optional filter # where_document={"$contains":"search_string"} # optional filter )

Chroma の主な機能は次のとおりです。

  • シンプル: 完全な型、包括的なテスト、完全なドキュメント
  • 統合: LangChain (Python および JavaScript)、LlamaIndex などをサポートします。
  • 開発、テスト、および本番プロセス: Python ノートブックで実行される API は、クラスター環境に直接適用できます。
  • 豊富な機能: クエリ、フィルター、密度推定など。
  • 無料でオープンソース

7. ランスDB

https://github.com/lancedb/lancedb

LanceDBは、永続ストレージをサポートするオープンソースのベクトル検索データベースです。このオープンソースプロジェクトは、埋め込みデータの検索、フィルタリング、管理を大幅に簡素化します。

LanceDBのコアはRustで開発され、Lance(高性能機械学習ワークロード向けに設計されたオープンソースの列フォーマット)を使用して構築されています。PythonやJavaScriptなどの言語でAPIを使用してLanceDBを操作できます。

Python は次のように使用されます。

インストール:

 pip install lancedb

検索:

 import lancedb uri = "data/sample-lancedb" db = lancedb.connect(uri) table = db.create_table("my_table", data=[{"vector": [3.1, 4.1], "item": "foo", "price": 10.0}, {"vector": [5.9, 26.5], "item": "bar", "price": 20.0}]) result = table.search([100, 100]).limit(2).to_df()

LanceDB の主な機能は次のとおりです。

  • サーバー管理を必要としない実稼働規模のベクトル検索。
  • ベクター、メタデータ、マルチモーダル データ (テキスト、画像、ビデオ、ポイント クラウドなど) の保存、クエリ、フィルタリングをサポートします。
  • ベクトル類似検索、全文検索、SQL 構文をサポートしています。
  • Python および JavaScript/Typescript をサポートします。
  • ゼロコピー、自動バージョン管理、追加のインフラストラクチャなしでデータ バージョンを管理します。
  • GPU に基づくベクトル インデックスの構築をサポートします。
  • LangChain、LlamaIndex、Apache-Arrow、Pandas、Polars、DuckDB などのエコシステムとの統合をサポートします。

8. ベクトラ

https://github.com/Stevenic/vectra

VectraはNode.js用のネイティブベクターデータベースで、PineconeやQdrantと機能的に似ていますが、Pineconeとは異なり、ローカルファイルを使用して構築されます。各Vectraインデックスはディスク上のフォルダに対応しています。このフォルダには、インデックス内のすべてのベクターとそのメタデータを含む`index.json`ファイルが含まれています。インデックスを作成する際に、メタデータのプロパティを指定できます。`index.json`ファイルには、これらのフィールドのみが保存されます。プロジェクトのその他のメタデータは、GUIDが指定されたファイルに保存されます。

実行時にはVectraインデックス全体がメモリにロードされるため、検索効率は非常に高く、リアルタイムでも検索可能です。ただし、チャットボットのように長いコンテキストを保持する必要があるシナリオには適していません。Vectraは、小規模なコーパス、静的データ、質疑応答形式のドキュメント検索などのアプリケーションに適しています。

Node.js では次のように使用されます。

インストール:

 $ npm install vectra

インスタンスを作成します。

 if (!await index.isIndexCreated()) { await index.createIndex(); }

インデックスを作成します。

 import { LocalIndex } from 'vectra'; const index = new LocalIndex(path.join(__dirname, '..', 'index'));

インデックスにデータを追加します。

 import { OpenAIApi, Configuration } from 'openai'; const configuration = new Configuration({ apiKey: `<YOUR_KEY>`, }); const api = new OpenAIApi(configuration); async function getVector(text: string) { const response = await api.createEmbedding({ 'model': 'text-embedding-ada-002', 'input': text, }); return response.data.data[0].embedding; } async function addItem(text: string) { await index.insertItem({ vector: await getVector(text), metadata: { text } }); } // Add items await addItem('apple'); await addItem('oranges'); await addItem('red'); await addItem('blue');

データ取得:

 async function query(text: string) { const vector = await getVector(input); const results = await index.queryItems(vector, 3); if (results.length > 0) { for (const result of results) { console.log(`[${result.score}] ${result.item.metadata.text}`); } } else { console.log(`No results found.`); } } await query('green'); /* [0.9036569942401076] blue [0.8758153664568566] red [0.8323828606103998] apple */ await query('banana'); /* [0.9033128691220631] apple [0.8493374123092652] oranges [0.8415324469533297] blue */

結論は

これらのオープンソースベクターデータベースはそれぞれ独自の機能を備えています。プロジェクトの具体的なニーズに応じて選択してください。高速データ取得を必要とするプロジェクトの場合は、Annoyが最適かもしれません。ただし、非計量空間を扱うプロジェクトの場合は、Nmslibが最適な選択肢となるかもしれません。適切なベクターデータベースは、AIソリューションにおいてメモリスポンジとして機能し、AIが推論するだけでなく、データを記憶・取得できるようにすることで、AIアプリケーションの有効性を向上させます。