Periplusは現在アルファにあり、生産対応ではありません。このプロジェクトは積極的な開発中であり、生産システムでの使用をまだお勧めしていません。
Periplusは、メタのベクトル類似性検索ライブラリFAISSに基づいて構築されたオープンソース内のメモリベクトルデータベースキャッシュです。このプロジェクトは、「ベクターデータベースのRedis」と考えることができます。クエリ時に他のノードと対話することなくクエリを提供しながら、大きなベクトルコレクションの動的に更新されたサブセットを完全にメモリに保存するように設計されています。 Periplusがクエリを受け取ると、最初にインデックス内のインデックスの関連部分があるかどうかを評価します。もしそうなら、適切な応答でクエリを解決します。そうでない場合は、キャッシュミスを返し、データベースからデータを取得するためにクエリエを残します。 Periplusは、単独で機能するようには設計されていません。代わりに、持続層を形成する別のベクトルデータベースのモジュラーで柔軟なキャッシュ層を形成することを目的としています。これの目的は、スループットを増やすために、より低いレイテンシと簡単な水平スケーリングを可能にすることです。 Periplusの背後にあるインスピレーションとその仕組みのより詳細な説明については、発表ブログを読むことができます。Periplusの紹介:Vectorデータベースキャッシングへの新しいアプローチ。
Periplusは、キャッシュ管理の基礎として逆ファイルインデックス(IVF)を使用します。逆ファイルインデックスは、ベクトル空間を、各セルが他の重心よりも重心に近い領域として定義される一連の重心ベクターによって定義された隣接するセルに分割されます。次に、クエリベクトルから重心までの距離を最初に計算し、 N_Probe (検索ハイパーパラメーター)で最も近い重心によって定義されたセルのみを検索することにより、クエリが解決されます。 Periplusは、これらのセルのサブセットをいつでも居住していることで、このサブセットに関連するクエリのみを解決することで、これを利用します。 Periplusは、インデックスの完全性を維持し、標準のIVFインデックスに同等のリコール(キャッシュヒット)を確保するために、一度にIVFセル全体を負荷および排除します。 IVFセルは、Periplusがどのベクターをどのセルを占有するかを追跡するために維持するベクトルのIDのリストを備えたプロキシを介してベクトルデータベースをクエリすることによりロードされます。これらの操作は、コマンドを使用して、コマンドを排除することを使用してユーザーが呼び出すことができます。詳細については、以下のPeriplusコマンドセクションを参照してください。
Periplusは、Dockerコンテナとして実行するか、ソースから構築して実行可能ファイルとして実行できます。現在、公式のバイナリは利用できません。コンテナとしてペリプラスを実行することが推奨されるアプローチですが、どちらも実行可能なオプションです。
現在、Docker画像はAMD64アーキテクチャのみをサポートしています。この制約はベース画像に由来しますが、近い将来、より多くのアーキテクチャがサポートされます。コンテナとしてPeriplusを実行するには2つの方法があります。DockerHub(推奨)から公式のDocker画像をダウンロードするか、自分で画像を作成します。どちらの場合でも最初のステップは、まだDockerをインストールしていない場合があります。そうするための指示はここにあります。
docker image pull qdl123/periplus:latest 。docker run -p 3000:3000 qdl123/periplus:latest git clone https://github.com/QDL123/Periplus.gitcd <path-to-periplus-repo>/Periplusdocker build -t periplus-image .docker run -p 3000:3000 periplus-image .Periplusは、Build SystemにCmakeを使用しています。すべての依存関係が、事前にコンパイルされたバイナリをHomeBrewを介してインストールすることを期待しています。 HomeBrewは、Windowsにいる場合はMacOS、Ubuntu、およびWSLによってサポートされています。 Periplusは、MacOS/ARM64およびUbuntu/AMD64に構築されています。他のすべてのオペレーティングシステムとアーキテクチャの組み合わせはテストされていません。ソースからペリプラスを構築するには、次の手順に従ってください。
brew install faiss curl cpr rapidjson libomp catch2 cmakegit clone https://github.com/QDL123/Periplus.gitcd <path-to-periplus-repo>/Peripluscmake -S . -B buildcmake --build build./build/periplus -p 3000 Periplusを使用するシステムは、4つのコンポーネントで構成されます。ベクトルデータベース、Periplusがデータベースからデータをロードできるデータベースプロキシ、Periplusインスタンス、クライアントアプリケーションです。

Periplusを使用したアプリケーションのアーキテクチャの例。
一意の識別子(ほぼすべて)によってデータを検索できるベクトルデータベースは機能します。 Periplusは、RAMとは対照的に、インデックスがファイルシステムに住む必要がある非常に大きなベクターコレクタン(10億スケール)を使用する場合、最も有益であるように設計されていますが、それは要件ではありません。
Vectorデータベースプロキシの目的は、PeriplusがVectorデータベースを介して相互作用するための一貫したインターフェイスを提供することです。プロキシは、次のフォームの投稿要求を受け入れるRESTインターフェイスを実装する必要があります。
URL:これは柔軟で、Periplusクライアントが指定できます。
ヘッダー: "Content-Type": "application/json
体:
{
"ids" : [ " id-1 " , " id-2 " , " id-3 " ]
}応答:
{
"results" : [
{
"id" : " String " ,
"embedding" : [ 0.1 , 0.2 , 0.3 ],
"document" : " String " ,
"metdata" : " String "
}
]
}このエンドポイントの実装を簡単にするために、Fastapiを使用してすべてをセットアップするPeriprus-Proxy Pythonパッケージを使用できます。ユーザーがしなければならないことは、次の関数を実装し、引数として渡すことです。
async def fetch_ids(request: Query) -> QueryResult
これを行う方法の詳細については、Periplus-Proxyパッケージreadme.mdをご覧ください。
上記の指示に従って、Periplusインスタンスを起動します。
Periplusインスタンスと対話するには、Periplusクライアントライブラリを使用します。現在、Pythonのみがサポートされています。クライアントライブラリの詳細については、readme.mdであると表示できます。
from periplus_client import Periplus
# host, port
client = Periplus ( "localhost" , 13 )
# vector dimensionality, database proxy url, options: (nTotal)
await client . initialize ( d = d , db_url = url , options = { "nTotal" : 50000 })
training_data = [[ 0.43456 , ..., 0.38759 ], ...]
await client . train ( training_data )
ids = [ "0" , ..., "n" ]
embeddings = [[ 0.43456 , ..., 0.38759 ], ...]
await client . add ( ids = ids , embeddings = embeddings )
load_options = { "n_load" : 2 }
# query_vector, optional: options object
await client . load ([ embeddings [ 0 ]] load_options )
# k, query_vector
response = await client . search ( 5 , [ embeddings [ 0 ]])
print ( response )
'''
[ // Results for each of the n query vectors in xq
[ // K nearest neighbors to this corresponding index in the xq list
(
id="n",
embedding=[0.43456, ..., 0.38759],
document="",
metadata="{}"
),
...
],
...
]
'''
# query_vector
await client . evict ( embeddings [ 0 ])ペリプラスへの貢献を歓迎します!開始方法を学ぶには、貢献ガイドをご覧ください。
このプロジェクトは、MITライセンスに基づいてライセンスされています。詳細については、ライセンスファイルを参照してください。