Proyek ini sangat awal, tidak siap untuk diproduksi.
Toko vektor tanpa server, ringan, dan cepat di atas DynamoDB
Whiplash adalah toko vektor ringan yang dibangun di atas AWS DynamoDB. Ini menggunakan varian hashing sensitif lokalitas (LSH) untuk mengindeks vektor dalam tabel DynamoDB. Ini dimaksudkan untuk menjadi toko vektor mimimalis, scalable, dan cepat dan dimaksudkan untuk menjadi sangat mudah digunakan, dipelihara, dan menjadi tuan rumah sendiri.
Ada beberapa komponen utama untuk whiplash:
pip install whiplash-client
# OR
poetry add whiplash-clientnpm install -g serverless
serverless install --url https://github.com/ericmillsio/whiplash
cd whiplash
npm installBersiap untuk penempatan:
cp .env.example .env
# Change AWS_PROFILE within .env to your AWS profile
# Adjust other values if you wantDigerikan ke AWS:
serverless deploy --stage dev --region us-east-2Output yang diharapkan ada di bawah. Perhatikan tombol API untuk digunakan dan titik akhir untuk digunakan.
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)Ada tiga cara untuk menggunakan whiplash: sebagai klien langsung, sebagai API tanpa server, atau sebagai perpustakaan proksi melalui API.
Perpustakaan adalah cara paling fleksibel untuk menggunakan whiplash. Ini dapat digunakan dalam proyek Python apa pun dan dapat digunakan untuk membangun aplikasi khusus di atas whiplash tanpa menggunakan API. Ini akan mengelola tabel secara langsung. Disarankan untuk digunakan di dalam AWS untuk menghindari latensi jaringan, tetapi dapat digunakan di luar untuk pengujian/evaluasi.
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 tanpa server adalah layanan mikro yang berfungsi penuh dan dapat digunakan ke AWS dengan beberapa perintah. API dibangun menggunakan serverless dan AWS Lambda.
API Endpoints:
/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}/searchHeader yang diperlukan:
x-api-key: API_KEYContent-Type: application/jsonAnda dapat memilih untuk berinteraksi dengan API secara langsung atau menggunakan Perpustakaan Klien Whiplash. File API.YAML termasuk dalam proyek untuk digunakan dengan tukang pos atau insomnia.
Perpustakaan dapat digunakan untuk proxy melalui API. Ini disarankan jika Anda ingin menggunakan perpustakaan tetapi tidak ingin mengelola tabel secara langsung. Ini lebih stabil dan kemungkinan lebih cepat daripada perpustakaan klien langsung untuk operasi masak massal, tetapi lebih lambat untuk operasi insert tunggal (dengan asumsi Anda menelepon dari luar wilayah AWS).
Ini hanya dapat digunakan jika API digunakan. Ini juga menghindari ketergantungan yang tidak bagus, tetapi saya belum mengeluarkan paket.
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 menggunakan hashing sensitif lokalitas (LSH) untuk mengindeks vektor dalam tabel DynamoDB. Ini dimaksudkan untuk menjadi toko vektor mimimalis, scalable, dan cepat yang dibangun di atas infrastruktur tingkat produksi AWS.
Whiplash bervariasi dari LSH tradisional karena menggunakan jumlah bit yang berbeda untuk setiap kunci hash. Hal ini memungkinkan penyetelan dinamis dan otomatis dari jumlah ember, yang memberikan flexiblity untuk menskalakan indeks dari waktu ke waktu. Ketika ember pada kunci hash terkecil mendekati ukuran maksimum item DynamoDB, lapisan baru fungsi hash ditambahkan.
Whiplash menggunakan beberapa tabel dinamo untuk menyimpan vektor dan ember:
PROJECT_STAGE_COLLECTION_vectors - Menyimpan { vector_id: binary(vector) }PROJECT_STAGE_COLLECTION_buckets - Menyimpan { hash: set of vector_ids }whiplash_metadata - menyimpan metadata tentang setiap koleksi { collection_id: { n_features: 256, uniform_planes: {0: [binary]} ...} }Whiplash menggunakan proyeksi acak untuk vektor hash ke dalam ember. Vektor diproyeksikan ke serangkaian bidang acak, dan tanda proyeksi menentukan sisi mana dari pesawat vektor. Pesawat -pesawat tersebut dihasilkan menggunakan distribusi Gaussian untuk memastikan bahwa vektor didistribusikan secara merata.
Kunci hash dihasilkan dengan mengonversi array hasil boolean dari proyeksi acak ke string biner, dan kemudian dikonversi menjadi basis 36.
poetry install
poetry run pytestWhiplash (dan LSH pada umumnya) untuk tujuan pencarian algoritmik tetangga terdekat (JST) memiliki tradeoff dibandingkan dengan toko vektor saat ini:
Pro:
Kontra:
Saya ingin membangun ini karena saya frustrasi dengan tingginya biaya toko vektor yang dikelola, dan kompleksitas tuan rumah sendiri toko vektor open-source lainnya. Juga tidak ada solusi tanpa server yang baik (bahkan jika AWS mendorong Elasticsearch, ugh). Whiplash sangat sederhana dan dibangun di atas infrastruktur siap-produksi yang akan memiliki perawatan yang sangat sedikit.
Membandingkan biaya penyimpanan saja dengan Pinecone:
Pinecone:
Pukulan cemeti:
Tanpa urutan tertentu:
Jika Anda Amazon dan ingin menggunakan ini, silakan hubungi saya dan bayar banyak uang sebelumnya. Kalau tidak, ini dilisensikan di bawah Apache 2.0.