このプロジェクトは非常に早く、生産の準備ができていません。
dynamodbの上にあるサーバーレス、軽量、高速ベクトルストア
Whiplashは、AWS dynamodbの上に構築された軽量のベクトルストアです。 DynamoDBテーブルのベクトルをインデックスにするために、ローカリティセンシティブハッシュ(LSH)のバリアントを使用します。これは、ミミマリスト、スケーラブル、高速のベクターストアであることを目的としており、非常に使いやすく、維持し、自己ホストすることを目的としています。
むち打ちするためのいくつかの主要なコンポーネントがあります:
pip install whiplash-client
# OR
poetry add whiplash-clientnpm install -g serverless
serverless install --url https://github.com/ericmillsio/whiplash
cd whiplash
npm install展開の準備:
cp .env.example .env
# Change AWS_PROFILE within .env to your AWS profile
# Adjust other values if you wantAWSへの展開:
serverless deploy --stage dev --region us-east-2予想される出力は以下です。使用するアクセスとエンドポイントのAPIキーに注意してください。
Running " serverless " from node_modules
Deploying whiplash to stage dev (us-east-2)
✔ Service deployed to stack whiplash-dev (64s)
api keys:
dev-api-key: < YOUR API KEY WILL BE HERE >
endpoints:
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/items
POST - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/items/batch
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/items/{itemId}
GET - https://API_ID.execute-api.us-east-2.amazonaws.com/dev/projects/{projectId}/collections/{collectionId}/search
functions:
getProject: whiplash-dev-getProject (12 kB)
createProject: whiplash-dev-createProject (12 kB)
listProjects: whiplash-dev-listProjects (12 kB)
createCollection: whiplash-dev-createCollection (12 kB)
listCollections: whiplash-dev-listCollections (12 kB)
getCollection: whiplash-dev-getCollection (12 kB)
createItem: whiplash-dev-createItem (12 kB)
createItems: whiplash-dev-createItems (12 kB)
getItem: whiplash-dev-getItem (12 kB)
searchItems: whiplash-dev-searchItems (12 kB)Whiplashを使用するには、直接クライアントとして、サーバーレスAPIとして、またはAPIをプロキシングするライブラリとして3つの方法があります。
ライブラリは、むち打ちを使用する最も柔軟な方法です。あらゆるPythonプロジェクトで使用でき、APIを展開せずにむち打ちの上にカスタムアプリケーションを構築するために使用できます。テーブルを直接管理します。ネットワークの遅延を避けるためにAWS内で使用することをお勧めしますが、テスト/評価のために屋外で使用できます。
import numpy as np
from whiplash import Vector , Whiplash
# AWS_PROFILE must be set in environment variables for boto3
whiplash = Whiplash ( "us-east-2" , "dev" )
# First time only setup
whiplash . setup ()
collection = whiplash . create_collection ( "test_collection" , n_features = 3 )
# Insert a vector
item = Vector ( "some_id" , np . ndarray ([ 1 , 2 , 3 ]))
collection . insert ( item )
# Search for the inserted vector
result = collection . search ( item . vector , limit = 1 )サーバーレスAPIは完全に機能的なマイクロサービスであり、いくつかのコマンドでAWSに展開できます。 APIは、サーバーレスとAWSラムダを使用して構築されています。
APIエンドポイント:
/projects/projects/{projectId}/projects/{projectId}/collections/projects/{projectId}/collections/{collectionId}/projects/{projectId}/collections/{collectionId}/items/projects/{projectId}/collections/{collectionId}/items/{itemId}/projects/{projectId}/collections/{collectionId}/search必須ヘッダー:
x-api-key: API_KEYContent-Type: application/jsonAPIと直接やり取りするか、Whiplashクライアントライブラリを使用することを選択できます。 API.yamlファイルは、郵便配達員または不眠症で使用するプロジェクトに含まれています。
ライブラリは、APIを紹介するために使用できます。これは、ライブラリを使用したいが、テーブルを直接管理したくない場合にお勧めします。これは、バルク挿入操作のための直接的なクライアントライブラリよりも安定しており、おそらくより速くなりますが、単一の挿入操作の場合は遅くなります(AWSリージョンの外部から電話をかけていると仮定します)。
これは、APIが展開されている場合にのみ使用できます。また、Numpyの依存関係も回避しますが、パッケージはまだ分割されていません。
import time
from whiplash . api . client import Whiplash
query = [ 0.5472 ,...]
whiplash = Whiplash (
"https://API-ID.execute-api.us-east-2.amazonaws.com/STAGE" ,
"API_KEY" ,
)
collection = whiplash . get_collection ( "example" )
assert collection is not None
start = time . time ()
results = collection . search ( query )
print ( "Search took" , time . time () - start , "seconds" )
print ( "Results:" , results )Whiplashは、DynamoDBテーブルのベクトルをインデックスするために、ローカリティセンシティブハッシュ(LSH)を使用します。これは、AWSの生産グレードインフラストラクチャの上に構築された、ミミマリスト、スケーラブルで高速なベクターストアであることを目的としています。
むち打ち症は、ハッシュキーごとに異なる数のビット数を使用するという点で、従来のLSHから異なります。これにより、バケツの数の動的かつ自動チューニングが可能になり、時間の経過とともにインデックスをスケーリングする柔軟性が得られます。最小のハッシュキーのバケツがDynamoDBアイテムの最大サイズに近い場合、ハッシュ関数/キーの新しい層が追加されます。
Whiplashはいくつかのダイナモテーブルを使用してベクターとバケツを保存します。
PROJECT_STAGE_COLLECTION_vectors - { vector_id: binary(vector) }を保存しますPROJECT_STAGE_COLLECTION_buckets - { hash: set of vector_ids }whiplash_metadata各コレクションについてメタデータを保存{ collection_id: { n_features: 256, uniform_planes: {0: [binary]} ...} }Whiplashは、ハッシュベクターにランダム投影をバケツに使用します。ベクトルはランダム平面のセットに投影され、投影の兆候はベクトルの平面のどちら側にあるかを決定します。飛行機はガウス分布を使用して生成され、ベクトルが均等に分布するようにします。
ハッシュキーは、ランダム投影のブール結果の配列をバイナリ文字列に変換し、ベース36に変換することにより生成されます。
poetry install
poetry run pytest近似最近傍(ANN)アルゴリズム検索の目的のためのむち打ち(および一般的にLSH)は、現在のベクトルストアと比較してトレードオフを持っています。
長所:
短所:
マネージドベクターストアの高コストと、他のオープンソースベクトルストアの自己ホストの複雑さに不満を感じていたため、私はこれを構築したかったのです。また、優れたサーバーレスソリューションはありません(AWSが「サーバーレス」ElasticSearch、UGHをプッシュしたとしても)。 Whiplashは非常にシンプルで、メンテナンスがほとんどない生産対応のインフラストラクチャに基づいて構築されています。
ストレージコストのみをPineconeと比較する:
Pinecone:
むち打ち:
順不同:
あなたがAmazonであり、これを使用したい場合は、私に連絡して、事前にたくさんのお金を払ってください。それ以外の場合、これはApache 2.0でライセンスされています。