Этот проект очень рано, не готов к производству.
Без сервера, легкий и быстрый векторный хранилище поверх 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 построен с использованием Serverless и 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 включен в проект для использования с почтальником или бессонницей.
Библиотека может быть использована для прокси через 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.
Whiplash варьируется от традиционного 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 pytestWhiplash (и LSH в целом) с целью приблизительного алгоритмического поиска ближайшего соседа (ANN) есть компромисс по сравнению с текущими векторными магазинами:
Плюсы:
Минусы:
Я хотел построить это, потому что я был разочарован высокой стоимостью управляемых векторных магазинов и сложностью самостоятельного ведения других векторных магазинов с открытым исходным кодом. Также нет хорошего решения без сервера (даже если AWS plos «без серверов» Elasticsearch, тьфу). Whiplash настолько прост и построен на готовой к производству инфраструктуры, которая будет иметь очень мало технического обслуживания.
Сравнение стоимости хранения в одиночку с Pinecone:
Pinecone:
Книгл:
В любом конкретном порядке:
Если вы Amazon и хотите использовать это, пожалуйста, свяжитесь со мной и заранее заплатите мне кучу денег. В противном случае это лицензировано в соответствии с Apache 2.0.