21 điểm bởi GN⁺ 2024-10-25 | 1 bình luận | Chia sẻ qua WhatsApp
  • Có thể tạo "tìm kiếm lai" trong ứng dụng bằng cách dùng tiện ích mở rộng full-text search (FTS5) mặc định của SQLite cùng với tìm kiếm ngữ nghĩa sqlite-vec
    • Có thể kết hợp kết quả bằng nhiều cách như ưu tiên từ khóa, xếp hạng lại theo "semantic", hoặc hợp nhất thứ hạng đối ứng
    • Quan trọng nhất là mọi thứ đều nằm trong SQLite, nên có thể thử nghiệm và tạo prototype với chi phí thấp, dễ dàng và không cần dịch vụ bên ngoài
  • Trường hợp sử dụng chính của sqlite-vec và các công cụ vector search khác là cung cấp "tìm kiếm ngữ nghĩa" cho dữ liệu văn bản
    • Chỉ full-text search (tìm kiếm từ khóa) không phải lúc nào cũng cho kết quả tốt
      • Khi tìm "climate change", nó sẽ không trả về các tài liệu như "global warming"
      • Dùng tìm kiếm ngữ nghĩa có thể truy vấn theo "sắc thái ý nghĩa" để trả về kết quả phong phú hơn, chứa nhiều ngữ nghĩa hơn
    • Nhưng nếu chỉ dùng riêng "tìm kiếm ngữ nghĩa" thì có thể gây hại cho ứng dụng

Demo: tiêu đề tin tức NBC

  • Sử dụng bộ dữ liệu gồm hơn 14.500 tiêu đề từ tháng 1 đến tháng 8 năm 2024
  • Tổng cộng 4,3MB dữ liệu văn bản, là một bộ dữ liệu rất nhỏ

Tạo bảng FTS5

  • Tạo bảng ảo full-text search fts_headlines
  • Khai báo cột headline
  • Cấu hình các tùy chọn content=content_rowid=
  • INSERT INTO trực tiếp từ bảng articles gốc
  • Để truy vấn bảng FTS5 chỉ cần một câu lệnh SELECT duy nhất

Xây dựng vector search với sqlite-vec

  • sqlite-vec cung cấp lưu trữ vector và so sánh vector, nhưng không tạo embedding
  • Trong ví dụ này sử dụng tiện ích mở rộng sqlite-lembed và mô hình Snowflake Artic Embed 1.5
  • Nhúng văn bản bằng lembed() và lưu vào bảng ảo vec0
  • Để truy vấn KNN chỉ cần một câu lệnh SELECT duy nhất

Cách tiếp cận lai 1: "ưu tiên từ khóa"

  • Trả về kết quả full-text search trước, sau đó bổ sung phần còn lại bằng vector search
  • Có thể triển khai bằng CTE
  • Kết hợp kết quả bằng UNION ALL

Cách tiếp cận lai 2: hợp nhất thứ hạng đối ứng (RRF)

  • Gán thứ hạng cho kết quả khớp từ FTS5 và vector
  • Có thể triển khai bằng một truy vấn SELECT duy nhất và CTE
  • Có thể thay đổi :weight_fts hoặc :weight_vec để xếp hạng kết quả FTS5/vector khác nhau

Cách tiếp cận lai 3: xếp hạng lại theo ngữ nghĩa

  • Chỉ thực hiện tìm kiếm FTS5 nhưng sắp xếp lại kết quả theo khoảng cách vector
  • Chỉ nhận được các kết quả khớp từ khóa, nhưng các kết quả khớp ngữ nghĩa tốt hơn sẽ được đưa lên đầu
  • Giúp khắc phục nhược điểm của BM25

Nên chọn cách tiếp cận nào?

  • Tùy vào ứng dụng và trường hợp sử dụng
  • Nếu xây dựng công cụ tìm kiếm cho hộp thư email, ưu tiên từ khóa sẽ phù hợp hơn
  • Nếu xây dựng RAG cho tài liệu nội bộ của công ty, RRF là một lựa chọn tốt
  • Nếu xây dựng tính năng "bài đăng trùng lặp" cho web app, xếp hạng lại theo ngữ nghĩa hoạt động tốt

Các cải tiến trong tương lai

  • Truy vấn FTS5 có thể dùng "highlight" để hiển thị phần khớp trong tài liệu, nhưng sqlite-vec chỉ trả về khoảng cách L2/cosine giữa vector truy vấn và tài liệu
  • Truy vấn FTS5 có các tính năng khác như cụm từ, truy vấn NEAR và toán tử Boolean, nhưng khi dùng chúng với vector search thì khá gượng ép
  • Việc mở rộng tìm kiếm lai với FTS5 + sqlite-vec có thể còn chưa thật tự nhiên
  • Bảng FTS5 mỗi lần đều thực hiện tìm kiếm trên toàn bộ tập dữ liệu nên không hỗ trợ lọc metadata hoặc một chỉ mục FTS5 đơn lẻ
  • sqlite-vec cũng tương tự, nhưng hỗ trợ partitioning và lọc metadata sẽ sớm được cung cấp

Ý kiến của GN⁺

  • Tìm kiếm lai dùng SQLite có vẻ hữu ích cho nhiều ứng dụng nhờ dễ thử nghiệm và tạo prototype. Ưu điểm là dữ liệu được lưu trong một file duy nhất, có thể thử nhiều truy vấn bằng một câu lệnh SELECT, không tốn chi phí, chạy được với mọi ngôn ngữ lập trình và dễ triển khai chỉ với vài dòng mã
  • Tuy vậy, giữa FTS5 và sqlite-vec vẫn còn những điểm cần cải thiện. FTS5 có thể làm nổi bật phần khớp trong tài liệu, nhưng sqlite-vec chỉ trả về khoảng cách giữa vector truy vấn và tài liệu. Ngoài ra, khi dùng các tính năng nâng cao của FTS5 thì việc kết hợp với vector search có thể trở nên gượng ép
  • Dù có những hạn chế này, tìm kiếm lai với SQLite vẫn là một giải pháp mạnh mẽ có thể tận dụng cả ưu điểm của tìm kiếm từ khóa và tìm kiếm ngữ nghĩa, bất kể kích thước dữ liệu hay loại ứng dụng
  • Trong bối cảnh việc trích xuất thông tin từ dữ liệu phi cấu trúc và biến nó thành dạng có thể tìm kiếm ngày càng quan trọng, việc kết hợp tìm kiếm từ khóa như FTS5 với vector search như sqlite-vec cho phép tìm kiếm tinh vi hơn, cân nhắc cả sự khớp từ khóa lẫn mức độ liên quan theo ngữ cảnh
  • Khi bổ sung sqlite-vec vào hệ thống tìm kiếm hiện có hoặc phát triển ứng dụng tìm kiếm mới, rất đáng cân nhắc cách tiếp cận tìm kiếm lai dựa trên SQLite. Đặc biệt, khả năng tùy biến chính mô hình embedding là một lợi thế lớn

1 bình luận

 
halfenif 2024-10-27

Trong dự án, tôi đã thực hiện công việc đưa hơn 1 triệu bản ghi vào sqlite và xử lý chúng.

Nếu lượng dữ liệu lớn thì có lẽ cần một SSD tốt. (Vì tôi dùng SATA SSD nên cảm giác thời gian xử lý đã bị kéo dài thêm đôi chút)