هذا المشروع مبكر للغاية ، وليس جاهزًا للإنتاج.
خادم الخادم وخفيف الوزن وسريع متجه أعلى DynamoDB
Whiplash هو متجر متجه خفيف الوزن تم تصميمه على رأس DynamoDB AWS. يستخدم متغيرًا من التجزئة الحساسة للمنطقة (LSH) لفهرسة المتجهات في جدول DynamoDB. يهدف هذا إلى أن يكون متجرًا متجهًا وقابلًا للتطويرًا وسريعًا ويهدف إلى أن يكون سهلاً للغاية في الاستخدام والصيانة والمضيف الذاتي.
هناك العديد من المكونات الرئيسية لـ Whiplash:
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: كعميل مباشر ، أو كأبي واجهة برمجة تطبيقات بدون خادم ، أو كمكتبة من خلال واجهة برمجة التطبيقات.
المكتبة هي الطريقة الأكثر مرونة لاستخدام الاصابة. يمكن استخدامه في أي مشروع Python ويمكن استخدامه لبناء تطبيقات مخصصة أعلى الاصابة دون نشر واجهة برمجة التطبيقات. سوف تدير الجداول مباشرة. يوصى باستخدامه داخل 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 )واجهة برمجة تطبيقات الخوادم بدون خادم تعمل بكامل طاقتها ويمكن نشرها على 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يمكنك اختيار التفاعل مع واجهة برمجة التطبيقات مباشرة أو استخدام مكتبة عميل Whiplash. يتم تضمين ملف api.yaml في المشروع للاستخدام مع ساعي البريد أو الأرق.
يمكن استخدام المكتبة للوكيل من خلال واجهة برمجة التطبيقات. يوصى بذلك إذا كنت ترغب في استخدام مكتبة ولكن لا تريد إدارة الجداول مباشرة. هذا أكثر استقرارًا ومن المحتمل أن يكون أسرع من مكتبة العميل المباشر لعمليات الإدراج بالجملة ، ولكنه أبطأ لعمليات الإدراج الفردي (على افتراض أنك تتصل من خارج منطقة 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 العديد من طاولات Dynamo لتخزين المتجهات والدلاء:
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يحتوي Whiplash (و LSH بشكل عام) لغرض البحث عن خوارزمية أقرب جار تقريبي (ANN) على مقايضات مقارنة بمتاجر المتجهات الحالية:
الايجابيات:
سلبيات:
أردت أن أبني هذا لأنني شعرت بالإحباط من التكلفة العالية لمتاجر المتجهات المدارة ، وتعقيد متاجر ناقلات أخرى مفتوحة المصدر. لا يوجد أيضًا حل جيد بدون خادم (حتى لو دفعت AWS "Serverless" Elasticsearch ، UGH). Whiplash بسيطة للغاية ومبنية على البنية التحتية الجاهزة للإنتاج والتي سيكون لها القليل من الصيانة.
مقارنة تكلفة التخزين وحدها إلى pinecone:
كوز الصنوبر:
الاصابة:
في أي ترتيب معين:
إذا كنت أمازون وترغب في استخدام هذا ، فيرجى الاتصال بي ودفع مجموعة من المال مسبقًا. خلاف ذلك ، يتم ترخيص هذا بموجب Apache 2.0.