3 คะแนน โดย GN⁺ 2024-05-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การพัฒนา SQLite extension ใหม่สำหรับการค้นหาเวกเตอร์

  • sqlite-vec เป็นส่วนขยายใหม่สำหรับการค้นหาเวกเตอร์ใน SQLite และมีแผนจะมาแทนที่ sqlite-vss เดิม
  • จะเป็นเครื่องมือค้นหาเวกเตอร์แบบฝังที่ทำงานได้ในทุกสภาพแวดล้อมที่รัน SQLite (รวมถึง WASM) และถูกออกแบบให้ "เร็วพอใช้"
  • แม้ยังอยู่ระหว่างการพัฒนา แต่แนะนำให้เช็ก repository เมื่อพร้อมใช้งานแล้ว

ลักษณะของ sqlite-vec

  • ส่วนขยายของ SQLite ที่เขียนด้วยภาษา C ล้วนและไม่มี dependency
  • มี SQL function แบบ custom และ virtual table สำหรับการค้นหาเวกเตอร์ที่เร็ว
  • มีเครื่องมือและยูทิลิตีอื่น ๆ สำหรับการทำงานกับเวกเตอร์ (quantization, การแปลง JSON/BLOB/numpy, การคำนวณเวกเตอร์ ฯลฯ)
  • ค้นหาเวกเตอร์ได้ด้วย SQL อย่างเดียว (โดยใช้ CREATE VIRTUAL TABLE, INSERT INTO, SELECT)

จุดเด่นของ sqlite-vec

  • เขียนด้วย C ล้วน ทำให้รันได้บนทุกแพลตฟอร์ม (Linux/MacOS/Windows), เว็บเบราว์เซอร์ (WebAssembly), มือถือ และ Raspberry Pi
  • ขนาดไบนารีเล็ก อยู่ในระดับเพียงไม่กี่ร้อย KB
  • ควบคุมการใช้หน่วยความจำได้ดีกว่า (เก็บเวกเตอร์เป็นชิ้นย่อย แล้วอ่านเป็นทีละชิ้นในระหว่างการค้นหา KNN)
  • ใช้คำสั่ง PRAGMA mmap_size เพื่อเพิ่มความเร็วแบบ in-memory ได้
  • รองรับ Matryoshka embeddings และการเข้ารหัสเวกเตอร์ความยาวแปรผัน รวมถึง int8/bit vectors เพื่อทำ binary และ scalar quantization ได้
  • ควบคุมความเร็ว ความแม่นยำ และพื้นที่ดิสก์ได้มากขึ้น
  • เริ่มต้นรองรับเฉพาะการค้นหาแบบ full scan เท่านั้น แต่มีแผนจะเพิ่ม IVF + HNSW ในอนาคต

สาธิต

  • รัน sqlite-vec ได้โดยตรงในเบราว์เซอร์ (โหลดฐานข้อมูล movies.bit.db ของ SQLite)
  • ตาราง articles มีคอลัมน์เช่น title, release_date, overview
  • ตารางเสมือน vec_movies เก็บเวกเตอร์ฝังของคอลัมน์ overview (เวกเตอร์ไบนารี 768 มิติ ขนาด 96 ไบต์)
  • สามารถค้นหาภาพยนตร์ที่คล้ายกับภาพยนตร์ที่เลือกได้ 10 เรื่องด้วยการค้นหาแบบ KNN

ปัญหาของ sqlite-vss

  • ใช้งานได้เฉพาะบน Linux + MacOS (ไม่รองรับ Windows, WASM, และอุปกรณ์มือถือ)
  • เก็บเวกเตอร์ทั้งหมดไว้ในหน่วยความจำ
  • มีบักและปัญหาหลายอย่างเกี่ยวกับ transaction
  • คอมไพล์ยากมากและใช้เวลานาน
  • ขาดการทำงานเวกเตอร์พื้นฐานทั่วไป (scalar/binary quantization)
  • เกิดปัญหาจากการพึ่งพา Faiss

สถานะการพัฒนา sqlite-vec

  • ฟังก์ชันหลักทำงานได้ แต่ยังแทบไม่มีระบบจัดการข้อผิดพลาดและการทดสอบ
  • ไฟล์ sqlite-vec.c มี TODO อยู่ 246 รายการ
  • หลังจากแก้ TODO ทั้งหมดเสร็จพร้อมเอกสาร เดโม บันเดิง และองค์ประกอบประกอบอื่น ๆ จะปล่อย sqlite-vec v0.1.0 (เป้าหมายประมาณหนึ่งเดือน)

ความคิดเห็นของ GN⁺

  • เสน่ห์ของโครงการคือเป็นเครื่องมือค้นหาเวกเตอร์แบบฝังที่รันได้บนหลายแพลตฟอร์มและสภาพแวดล้อม โดยเฉพาะที่สามารถรันด้วย WASM ในเว็บเบราว์เซอร์ได้ ซึ่งน่าสนใจมาก
  • จุดเด่นอีกอย่างคือการควบคุมหน่วยความจำ, เวกเตอร์ความยาวแปรผัน และ quantization ที่สะท้อนเทคโนโลยีการค้นหาเวกเตอร์ล่าสุด ทำให้ดูเป็นการควบคุมความเร็ว ความแม่นยำ และพื้นที่เก็บข้อมูลได้อย่างยืดหยุ่น
  • อย่างไรก็ตาม การรองรับเฉพาะการค้นหาแบบ full scan ถือเป็นข้อจำกัด หากข้อมูลมีขนาดใหญ่ขึ้นความเร็วในการค้นหาอาจลดลง จึงจำเป็นที่ต้องรองรับอัลกอริทึม ANN อย่าง IVF+HNSW โดยเร่งด่วน
  • แม้ว่าโครงการยังอยู่ในช่วงต้น จึงดูว่ายังไม่เหมาะสมสำหรับใช้ใน production จริง ต้องใช้เวลาเพิ่มเพื่อให้เสถียรขึ้น
  • นอกจากนี้ยังควรมีการเปรียบเทียบ benchmark กับไลบรารีค้นหาเวกเตอร์แบบเดิม เช่น Faiss ด้วย เพราะแม้ข้อดีคือเป็น SQLite extension แบบ pure SQLite ก็ยังต้องยืนยันด้านประสิทธิภาพ

1 ความคิดเห็น

 
GN⁺ 2024-05-04
ความคิดเห็นบน Hacker News
  • ผู้เขียนเข้ามาแสดงความคิดเห็นด้วยตัวเองและแนะนำโปรเจกต์ใหม่ชื่อ sqlite-vec ว่ายังอยู่ในขั้นตอนการพัฒนา โดยตั้งเป้าออกเวอร์ชัน v0.1.0 ภายในไม่กี่สัปดาห์ และมีลักษณะเป็นโครงการต่อยอดจาก sqlite-vss ที่เคยพัฒนามาก่อน
  • sqlite-vec เป็นไลบรารีที่ได้รับการปรับให้เหมาะกับการค้นหาเวกเตอร์แบบฝังตัว ทำงานได้กับระบบปฏิบัติการหลากหลาย รวมถึงมือถือและ Raspberry Pi; ผู้เขียนกำลังลองนำ sqlite-vec ไปใช้กับแอป semantic search ที่ชื่อ Beepy
  • มีคำถามว่าพวกเขาเก็บเวกเตอร์ 768 มิติในเพียง 96 ไบต์ได้อย่างไร โดยปกติแล้วถ้าใช้ float64 จะต้องใช้ถึง 6,144 ไบต์ จึงเกิดความสงสัยเกี่ยวกับเทคนิคการบีบอัดหรือการเก็บค่าประมาณ
  • นักพัฒนาที่เคยใช้ sqlite-vss แสดงความขอบคุณว่าเป็นประโยชน์ต่อการพัฒนาโมเดล RAG และบอกว่าใช้งานได้ดีบน Ubuntu
  • DuckDB ก็เพิ่งเปิดตัวส่วนขยายสำหรับการค้นหาความคล้ายของเวกเตอร์ที่คล้ายกัน
  • มีการเล่าประสบการณ์สร้างแอป AI RAG โดยใช้ฐานข้อมูลเวกเตอร์ Qdrant และแสดงความคาดหวังว่าจะนำ sqlite-vec ไปใช้ประโยชน์ได้
  • มีข้อสงสัยว่าจะใช้เฉพาะ Public API ของ SQLite หรือจะฝังตัวรวมเข้ากับ amalgamation โดยตรง และยกประเด็นเรื่องรูปแบบการจัดจำหน่ายเมื่อมองจากมุม WebAssembly bindings
  • มีความคิดเห็นว่าชอบ OSS project ที่ตอบโจทย์ความต้องการเฉพาะ และกำลังคิดแนวทางที่สามารถใช้กับ ecosystem ของ TypeScript ได้
  • มีคนมองว่าอาจเป็นคำตอบสำหรับปัญหาที่ค้างคาใน sqlite-vss ตั้งแต่หลายเดือนก่อน
  • มีข้อสงสัยว่าจะทำให้มิติของ feature vector ทั้งหมดตรงกันอย่างไร เห็นเหมือนมีการแปลงสตริงเป็น float แล้วเก็บไว้ จึงต้องเช็คว่าในการคำนวณ Hamming distance จะนับเวกเตอร์ที่ความยาวต่างกันหรือไม่
  • มีความเห็นว่าดูเหมือนโครงการนี้พัฒนาตามแนวทางที่เริ่มจากเอกสาร README และสงสัยว่าพวกเขาเริ่มต้นจากการเขียนเอกสารก่อนโค้ดหรือไม่