โครงการนี้เร็วสุด ๆ ไม่พร้อมสำหรับการผลิต
Serverless, Lightweight และ Fast Vector ที่ด้านบนของ DynamoDB
Whiplash เป็นร้านค้าเวกเตอร์ที่มีน้ำหนักเบาที่สร้างขึ้นบน AWS DynamoDB มันใช้ตัวแปรของการแฮชที่ไวต่อท้องถิ่น (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: ในฐานะไคลเอนต์โดยตรงในฐานะ API ที่ไม่มีเซิร์ฟเวอร์หรือเป็นพร็อกซ์ไลบรารีผ่าน API
ห้องสมุดเป็นวิธีที่ยืดหยุ่นที่สุดในการใช้ Whiplash สามารถใช้ในโครงการ Python ใด ๆ และสามารถใช้ในการสร้างแอปพลิเคชันที่กำหนดเองบน Whiplash โดยไม่ต้องปรับใช้ 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 )Serverless API เป็น microservice ที่ใช้งานได้อย่างสมบูรณ์และสามารถนำไปใช้กับ 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 ใช้ Hashing-sensitive locality (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 จะผลักดัน "Serverless" Elasticsearch, Ugh) Whiplash นั้นง่ายมากและสร้างขึ้นบนโครงสร้างพื้นฐานพร้อมการผลิตซึ่งจะมีการบำรุงรักษาน้อยมาก
การเปรียบเทียบต้นทุนการจัดเก็บเพียงอย่างเดียวกับ Pinecone:
Pinecone:
Whiplash:
ในลำดับที่ไม่เฉพาะเจาะจง:
หากคุณเป็น Amazon และต้องการใช้สิ่งนี้โปรดติดต่อฉันและจ่ายเงินให้ฉันหลาย ๆ อย่างก่อน มิฉะนั้นจะได้รับใบอนุญาตภายใต้ Apache 2.0