Este proyecto es muy temprano, no está listo para la producción.
Store vectorial sin servidor, liviano y rápido en la parte superior de Dynamodb
Whiplash es una tienda vectorial liviana construida sobre AWS Dynamodb. Utiliza una variante de hashing sensible a la localidad (LSH) para indexar vectores en una tabla DynamodB. Se pretende ser una tienda vectorial mimimalista, escalable y rápida y está destinado a ser extremadamente fácil de usar, mantener y autohost.
Hay varios componentes principales para latiguarios:
pip install whiplash-client
# OR
poetry add whiplash-clientnpm install -g serverless
serverless install --url https://github.com/ericmillsio/whiplash
cd whiplash
npm installPrepárese para la implementación:
cp .env.example .env
# Change AWS_PROFILE within .env to your AWS profile
# Adjust other values if you wantDesplegar en AWS:
serverless deploy --stage dev --region us-east-2La salida esperada está a continuación. Tenga en cuenta la tecla API para el acceso y los puntos finales para usar.
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)Hay tres formas de usar Whiplash: como cliente directo, como una API sin servidor, o como una biblioteca proxy en la API.
La biblioteca es la forma más flexible de usar latigazo cervical. Se puede usar en cualquier proyecto de Python y se puede usar para crear aplicaciones personalizadas sobre Whiplash sin implementar la API. Administrará las tablas directamente. Se recomienda utilizar dentro de AWS para evitar la latencia de la red, pero se puede usar afuera para la prueba/evaluación.
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 )La API sin servidor es un microservicio completamente funcional y se puede implementar en AWS con algunos comandos. La API está construida con servidor sin servidor y AWS Lambda.
Puntos finales de la 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}/searchEncabezados requeridos:
x-api-key: API_KEYContent-Type: application/jsonPuede optar por interactuar con la API directamente o usar la biblioteca del cliente Whiplash. Se incluye un archivo API.yaml en el proyecto para su uso con Postman o Insomnia.
La biblioteca se puede usar para proxy a través de la API. Esto se recomienda si desea usar una biblioteca pero no desea administrar las tablas directamente. Esto es más estable y probablemente más rápido que la biblioteca de cliente directo para las operaciones de inserción a granel, pero más lento para operaciones de inserción única (suponiendo que esté llamando desde fuera de la región de AWS).
Esto solo se puede usar si se implementa la API. También evita la dependencia numpy, pero aún no he desglosado los paquetes.
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 utiliza hashing sensible a la localidad (LSH) para indexar vectores en una tabla DynamodB. Se pretende ser una tienda vectorial mimimalista, escalable y rápida construida sobre la infraestructura de grado de producción de AWS.
El latigazo cervical varía de LSH tradicional, ya que utiliza un número diferente de bits para cada tecla hash. Esto permite un ajuste dinámico y automático de la cantidad de cubos, lo que proporciona flexible para escalar el índice con el tiempo. Cuando los cubos en la tecla hash más pequeña están cerca del tamaño máximo de un elemento DynamodB, se agrega una nueva capa de función hash/teclas.
Whiplash utiliza varias tablas Dynamo para almacenar los vectores y cubos:
PROJECT_STAGE_COLLECTION_vectors - almacena { vector_id: binary(vector) }PROJECT_STAGE_COLLECTION_buckets - almacena el { hash: set of vector_ids }whiplash_metadata - almacena metadatos sobre cada colección { collection_id: { n_features: 256, uniform_planes: {0: [binary]} ...} }Whiplash utiliza proyección aleatoria a los vectores hash en cubos. Los vectores se proyectan en un conjunto de planos aleatorios, y el signo de la proyección determina en qué lado del plano está el vector. Los aviones se generan utilizando la distribución gaussiana para garantizar que los vectores se distribuyan uniformemente.
Las claves hash se generan convirtiendo la matriz de resultados booleanos de proyección aleatoria a una cadena binaria, y luego se convierten a la base 36.
poetry install
poetry run pytestWhiplash (y LSH en general) con el propósito de la búsqueda algorítmica del vecino más cercano (ANN) de aproximación tiene compensaciones en comparación con las tiendas vectoriales actuales:
Pros:
Contras:
Quería construir esto porque estaba frustrado con el alto costo de las tiendas de vectores administrados y la complejidad de las autohufes de otras tiendas de vectores de código abierto. Tampoco hay una buena solución sin servidor (incluso si AWS presiona ElasticseSearch "sin servidor", UGH). Whiplash es tan simple y se basa en la infraestructura lista para la producción que tendrá muy poco mantenimiento.
Comparando el costo de almacenamiento solo con Pinecone:
Piña:
Latigazo:
En ningún orden particular:
Si eres Amazon y quieres usar esto, contácteme y pague un montón de dinero de antemano. De lo contrario, esto tiene licencia bajo Apache 2.0.