這個項目超級早,尚未準備好生產。
DynamoDB頂部的無服務器,輕巧和快速矢量存儲
Whiplash是一家在AWS DynamoDB頂部建造的輕量級矢量商店。它使用對局部敏感的散列(LSH)的變體對DynamoDB表中的索引向量。這旨在是一種模仿,可擴展和快速的矢量存儲,旨在非常易於使用,維護和自我宿主。
有幾個主要組成部分要鞭打:
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 want部署到AWS:
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代理的庫。
該庫是使用鞭打的最靈活的方法。它可以在任何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 lambda構建的。
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/json您可以選擇直接與API進行交互或使用Whiplash客戶庫庫。項目中包含一個API.YAML文件,以與Postman或失眠症一起使用。
該庫可用於通過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使用對局部敏感的哈希(LSH)對DynamoDB表中的索引向量。這旨在是建立在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進行比較:
松果:
鞭打:
沒有特定順序:
如果您是亞馬遜,並且想使用它,請與我聯繫,並事先向我付錢。否則,這將在Apache 2.0下許可。