这个项目超级早,尚未准备好生产。
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下许可。