3 điểm bởi GN⁺ 2024-05-04 | 1 bình luận | Chia sẻ qua WhatsApp

Đang phát triển một tiện ích mở rộng mới để tìm kiếm vector trên SQLite

  • sqlite-vec là một tiện ích mở rộng mới cho SQLite nhằm hỗ trợ tìm kiếm vector và dự kiến thay thế sqlite-vss hiện tại.
  • Sẽ là công cụ tìm kiếm vector nhúng "đủ nhanh" có thể chạy được trên mọi môi trường chạy SQLite (kể cả WASM).
  • Dù vẫn đang trong quá trình phát triển, bài viết khuyên nên xem repository ngay khi nó đã sẵn sàng.

Đặc điểm của sqlite-vec

  • Tiện ích mở rộng SQLite viết bằng C thuần túy và không có phụ thuộc.
  • Cung cấp hàm SQL tùy chỉnh và bảng ảo để thực hiện tìm kiếm vector nhanh.
  • Cung cấp thêm các công cụ và tiện ích cho các tác vụ vector (lượng tử hóa, chuyển đổi JSON/BLOB/numpy, phép toán vector, v.v.).
  • Có thể thực hiện tìm kiếm vector chỉ bằng SQL (sử dụng câu lệnh CREATE VIRTUAL TABLE, INSERT INTO, SELECT)

Ưu điểm của sqlite-vec

  • Viết bằng C thuần túy nên có thể chạy trên mọi nền tảng (Linux/MacOS/Windows), trình duyệt web (WebAssembly), điện thoại di động, Raspberry Pi, v.v.
  • Kích thước nhị phân chỉ ở mức vài trăm KB.
  • Kiểm soát tốt hơn việc sử dụng bộ nhớ (lưu vector theo từng chunk và đọc theo từng chunk khi tìm kiếm KNN).
  • Có thể cải thiện tốc độ in-memory bằng lệnh PRAGMA mmap_size.
  • Hỗ trợ embedding độ dài biến thiên như Matryoshka, cũng như vector int8/bit, cho phép lượng tử hóa nhị phân và lượng tử hóa vô hướng.
  • Có thể kiểm soát tốt hơn về tốc độ, độ chính xác và dung lượng đĩa.
  • Ban đầu chỉ hỗ trợ tìm kiếm vector toàn bộ (brute-force), nhưng dự kiến sẽ bổ sung IVF + HNSW sau này.

Demo

  • Có thể chạy sqlite-vec ngay trên trình duyệt (cơ sở dữ liệu SQLite movies.bit.db đã được tải).
  • Bảng articles có các cột như title, release_date, overview.
  • Bảng ảo vec_movies lưu vector nhúng của cột overview (vector nhị phân 768 chiều, 96 byte).
  • Có thể tìm 10 bộ phim có độ tương đồng cao nhất với bộ phim đã chọn bằng tìm kiếm kiểu KNN.

Vấn đề của sqlite-vss

  • Chỉ hoạt động trên Linux + MacOS (không hỗ trợ Windows, WASM, thiết bị di động, v.v.)
  • Lưu toàn bộ vector trong bộ nhớ.
  • Có nhiều lỗi và sự cố liên quan đến transaction.
  • Việc biên dịch rất khó và tốn thời gian.
  • Thiếu các phép toán vector phổ thông (lượng tử hóa vô hướng/nhị phân).
  • Các vấn đề phát sinh do việc phụ thuộc vào Faiss.

Tiến độ phát triển của sqlite-vec

  • Chức năng cốt lõi đã hoạt động, nhưng hiện tại gần như chưa có xử lý lỗi và thử nghiệm.
  • Tệp sqlite-vec.c có 246 TODO.
  • Sau khi hoàn tất toàn bộ TODO, dự kiến ra mắt sqlite-vec v0.1.0 cùng tài liệu, demo, binding, v.v. (mục tiêu khoảng một tháng).

Ý kiến của GN⁺

  • Việc là một công cụ tìm kiếm vector nhúng chạy được trên nhiều nền tảng và môi trường khác nhau rất đáng chú ý. Đặc biệt, khả năng chạy bằng WASM ngay trong trình duyệt web là rất thú vị.
  • Việc phản ánh các kỹ thuật tìm kiếm vector mới như kiểm soát bộ nhớ, embedding độ dài biến thiên, lượng tử hóa cũng là điểm mạnh; có vẻ có thể kiểm soát linh hoạt tốc độ, độ chính xác và dung lượng lưu trữ.
  • Tuy nhiên, đây chỉ là hạn chế là hiện mới hỗ trợ tìm kiếm toàn bộ. Khi dữ liệu tăng lên, có thể xuất hiện vấn đề tốc độ. Hỗ trợ các thuật toán ANN như IVF+HNSW dường như rất cấp thiết.
  • Ngoài ra, đây vẫn ở giai đoạn phát triển đầu nên chưa phù hợp để sử dụng trong môi trường production thực tế. Có vẻ còn cần thêm thời gian để ổn định.
  • Cần xem xét so sánh benchmark với các thư viện tìm kiếm vector truyền thống như Faiss. Dù có lợi thế là một tiện ích mở rộng SQLite thuần túy, hiệu năng vẫn cần được xác thực.

1 bình luận

 
GN⁺ 2024-05-04
Ý kiến trên Hacker News
  • Tác giả tham gia trực tiếp vào phần bình luận để giới thiệu dự án mới SQLite-Vec. Dự án vẫn đang trong giai đoạn phát triển, nhưng đang đặt mục tiêu phát hành v0.1.0 trong vài tuần tới; nó mang tính kế nhiệm của sqlite-vss mà tác giả đã phát triển trước đây.
  • sqlite-vec là thư viện tối ưu cho tìm kiếm vector nhúng, có thể chạy trên nhiều hệ điều hành, thiết bị di động, Raspberry Pi và các nền tảng khác. Tác giả đang thử áp dụng sqlite-vec cho ứng dụng tìm kiếm ngữ nghĩa Beepy.
  • Có câu hỏi về việc lưu vector 768 chiều trong 96 byte như thế nào. Bình thường với float64 cần tới 6.144 byte nên nhiều người tò mò về kỹ thuật nén hoặc lưu trữ gần đúng.
  • Một nhà phát triển từng dùng sqlite-vss cho biết việc này đã giúp ích cho việc phát triển mô hình RAG và gửi lời cảm ơn; anh ấy cũng nói rằng nó hoạt động tốt trong môi trường Ubuntu.
  • DuckDB cũng vừa công bố extension tìm kiếm độ tương đồng vector tương tự.
  • Một người chia sẻ kinh nghiệm phát triển ứng dụng AI RAG bằng vector DB Qdrant và thể hiện kỳ vọng về việc dùng sqlite-vec.
  • Có người thắc mắc dự án có chỉ dùng public API của SQLite hay sẽ tích hợp trực tiếp vào amalgamation hay không. Họ cũng nói về lo lắng cách phân phối dưới góc nhìn ràng buộc WebAssembly.
  • Có một bình luận thích việc một dự án OSS đáp ứng đúng nhu cầu cụ thể; người dùng đang cân nhắc các ý tưởng có thể áp dụng trong hệ sinh thái TypeScript.
  • Có phản ứng cho rằng nó có thể trở thành lời giải cho vấn đề sqlite-vss nêu ra vài tháng trước.
  • Có thắc mắc làm sao đồng nhất số chiều của tất cả feature vector. Có vẻ như đang chuyển đổi chuỗi thành float rồi lưu trữ; khi tính khoảng cách Hamming thì cần kiểm tra liệu vector có độ dài khác nhau có được xem xét không.
  • Có ý kiến cho rằng đây là cách phát triển dựa trên tài liệu README; tự hỏi liệu người ta có bắt đầu từ việc viết tài liệu hay không.