AIメモリに与える8つの優れたオープンソースの無料ベクターデータベース

AIメモリに与える8つの優れたオープンソースの無料ベクターデータベース

今年、AI大規模モデルの応用は爆発的な成長を遂げました。その中でも、LangChainやHaystackなどのエンドツーエンドの大規模言語モデル応用フレームワークにより、ベクトルデータベースが新たなホットスポットとなりました。

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

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

画像処理から推奨システムまで、高次元データの処理における本質的な利点により、ベクトル データベースは間違いなく舞台裏のヒーローです。主な機能は次のとおりです。

  • 管理: ベクター データベースはデータを生の形式で処理し、データを効率的に整理および管理できるため、AI モデルのアプリケーションが容易になります。
  • ストレージ: さまざまな AI モデルに必要な高次元データを含むベクトルデータを保存できます。
  • 検索: ベクター データベースは、データを効率的に取得することに特に優れており、AI モデルが必要なときに必要なデータをすばやく取得できるようにする機能を備えています。これは、ベクター データベースが一部の推奨システムや検索システムで使用できる重要な理由でもあります。

したがって、ベクトル データベースは AI にメモリを与えると言えます。このメモリには、記録と保存だけでなく、検索と管理も含まれます。人間の記憶と同じように、私たちは卒業写真を通してクラスメートが誰であるかを常に認識できます。また、友人とおしゃべりしているときに過去を思い出すこともよくあります。

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

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

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

各データは高次元空間のベクトルに変換されて管理されます。類似したデータを見つける必要がある場合、データベースは各エントリを走査して選択する必要はありません。代わりに、ベクトル間の距離が計算されてベクトルが一致します。ベクトルが近いほど、データの類似性が高くなります。このアプローチは非常に効率的で、従来のリレーショナル データベースよりも高速に大量のデータを処理できます。

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

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

周知のとおり、一般的な大規模モデルの運用には膨大な計算リソースが必要となるため、多くの大規模モデルは MaaS をベースとしており、民営化コストが非常に高くなります。これとは矛盾する点は、特定の業界での大規模モデルの適用においては、データ セキュリティに高い要件が課されることが多く、セキュリティと専門性を確保するには、関連するビジネスまたはドメイン知識との詳細な統合が求められることです。 LangChain などの大規模モデル アプリケーション フレームワークは、業界の大規模モデル アプリケーションに古典的なソリューションを提供し、オープン ソース ベクトル データベースは、LangChain などの大規模モデル アプリケーション ソリューションに基本的なサポートを提供します。実際、ベクトル データベースは、多くのアプリケーション シナリオ (エンタープライズ ナレッジ ベース、推奨システム、アーカイブ管理など) でも非常に役立ちます。そのため、ベクター データベースは、大規模なモデル アプリケーションの開発でも人気のテクノロジになっています。

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

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

1.ミルバス

出典: milvus

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

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

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

Milvus は共有ストレージ アーキテクチャを採用し、ストレージとコンピューティングを分離し、コンピューティング ノードの水平スケーラビリティを備えています。データ プレーンとコントロール プレーンの分解の原則に従って、Milvus はアクセス レイヤー、コーディネーション サービス、作業ノード、ストレージの 4 つのレイヤーで構成されます。これらの層は、スケーリングや災害復旧の観点からは互いに独立している場合があります。

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

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

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

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

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

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

2.ファイス

https://github.com/facebookresearch/faiss

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

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

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

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

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

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

3.イライラさせる

https://github.com/spotify/annoy

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

これは、大きな読み取り専用ファイル データ構造を作成し、それをメモリにマッピングすることで実現され、多くのプロセスが同じデータを共有できるようになります。

ANNOY の中核は、ランダム投影とツリーに基づくアルゴリズムです。これは、Spotify で働いていた Erik Bernhardsson によって 2015 年に開発されました。 ANNOY は、100 ~ 1000 の密な次元を持つデータセットを検索できるように設計されています。最近傍を計算するには、点のセットを半分に分割し、各セットに k 個の項目が含まれるまでこれを再帰的に実行します。通常、k は約 100 になります (下の図を参照)。

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

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

Python言語でのインストールの煩わしさ:

 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 は、停電時でも更新の確認を通じてデータの耐久性を保証します。変更ログにはすべての操作が保存されるため、最新のデータベース状態を簡単に再構築できます。
  • 分散展開: v0.8.0 以降、Qdrant は分散展開をサポートします。複数の Qdrant マシンがクラスターを形成し、Raft プロトコルを通じて調整して水平スケーリングを行います。
  • 独立した操作: Qdrant は独立した操作をサポートし、外部データベースやオーケストレーション コントローラーに依存しないため、構成が簡素化されます。

6. クロマ

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

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

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

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

  • ドッカー作成: 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 および js)、LlamaIndex などをサポートします。
  • 開発、テスト、および運用プロセス: Python ノートブックで実行される API は、クラスター環境に直接適用できます。
  • 豊富な機能: クエリ、フィルタリング、密度推定など。
  • 無料でオープンソース

7. ランスDB

出典: github.com

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

LanceDB のコアは Rust で開発され、高性能 ML ワークロード向けに設計されたオープンソースの列指向形式である 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 に似ていますが、Vectra はローカル ファイルを使用して構築されます。各 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 アプリケーションの有効性が向上します。

<<:  GPT-4 の推論はより人間的です!中国科学院は「思考コミュニケーション」を提唱、類推思考はCoT、プラグアンドプレイよりも優れている

>>:  Nature の調査: AI が「必需品」になったと考える科学者はわずか 4%

ブログ    
ブログ    

推薦する

人工知能をより人間らしくする 高齢者向けにAIをもっとデジタル化すべき

人工知能は新たなインフラの一つとして、人々の社会生活のあらゆる分野に統合され、あらゆるものがつながり...

Baidu Brain OCR技術がBaimiaoアプリを強化:AIが視覚障害者の目となる

現実には、あらゆる種類の印刷されたテキストや、周囲のあらゆるものを何の障害もなく簡単に読むことができ...

3分レビュー! 2021年1月のロボット工学分野の重要な動向の概要

ポスト疫病時代において、国内ロボット市場は急速に発展しました。同時に、国際ロボット分野は前向きな発展...

...

デジタル経済における人工知能の今後の発展動向

近年、デジタル経済の継続的な発展を背景に、人工知能は急速に発展し、さまざまな応用シナリオと深く統合さ...

畳み込みニューラルネットワークに基づく画像分類アルゴリズム

翻訳者 | 朱 仙中校正:孫淑娟1. 畳み込みニューラル ネットワーク (CNN) とは何ですか?一...

...

個人信用リスク評価モデルにおける新しいビッグデータアルゴリズムの使用の有効性の評価

1980 年代に、FICO はロジスティック回帰アルゴリズムに基づく FICO クレジット スコアリ...

生成 AI、その開発は持続可能か?

シャム・ナンダン・ウパディヤイノアが編集制作:51CTO テクノロジースタック(WeChat ID:...

OpenAIの主任科学者はスーパーAIを制御する方法を見つける計画を立てている

12月15日、OpenAIは設立当初から、たとえ人工知能が開発者よりも賢くなっても、全人類に利益をも...

...

高精度地図のデータの問題についてお話ししましょう。地図以外の認識の落とし穴は何でしょうか?

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

...

テスラは大きな疑問に直面:オートパイロットは事故の1秒前に自動的に終了

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

調査によると、経営幹部はAIが職務記述書を時代遅れにしていると考えている

最近の調査によると、機械が仕事を奪っていくのを見ると、人間の従業員の士気が低下する可能性があることが...