- Ternlight cho phép thực hiện embedding văn bản và tìm kiếm độ tương đồng ngay trong trình duyệt mà không cần gọi máy chủ, giúp nhanh chóng xây dựng tìm kiếm ngữ nghĩa nhỏ gọn phía client
- Gói mặc định có tổng dung lượng 7MB gồm engine và trọng số; biến thể mini là 5MB và chạy trên CPU mà không cần GPU
- Sau khi cài
@ternlight/base, chỉ cần import embed, similar là có thể tạo luồng tìm kiếm dựa trên ngữ nghĩa ở mức khoảng 3 dòng
- Ví dụ gọi hàm sắp xếp 3 kết quả hàng đầu trong danh sách công thức nấu ăn, nhấn mạnh thời gian khoảng 5ms và không có cuộc gọi mạng
- Demo tìm kiếm tài liệu React thực hiện tìm kiếm trong trình duyệt khi người dùng nhập câu hỏi, được vận hành bởi tier @ternlight/mini dung lượng 5MB
Embedding hoàn tất ngay trong trình duyệt
- Ternlight quảng bá là “mô hình embedding 7MB”, embedding văn bản ở mức mili giây và không gọi máy chủ
-
Đặc tính thực thi
- Không gọi API
- Engine + trọng số: 7MB
- Biến thể mini: 5MB
- Embedding nhanh: khoảng 5ms
- Chỉ dùng CPU, không cần GPU
Cài đặt và ví dụ sử dụng
- Được cung cấp dưới dạng một gói npm, có thể dùng mà không cần bước tải model riêng hay máy chủ
- Lệnh cài đặt như sau
npm install @ternlight/base
- Import
embed, similar từ @ternlight/base để chạy tìm kiếm dựa trên ngữ nghĩa
import { embed, similar } from '@ternlight/base';
similar('easy weeknight dinner ideas', recipes, { topK: 3 });
// → ranked matches · ~5 ms · zero network
- Demo tìm kiếm tài liệu React thực hiện tìm kiếm trong trình duyệt khi người dùng nhập câu hỏi, được vận hành bằng tier 5MB @ternlight/mini
1 bình luận
Ý kiến trên Hacker News
Tôi làm một dự án sở thích để thử chạy một mô hình hữu ích ngay trong trình duyệt, nên đã chưng cất một bộ mã hóa câu nhỏ từ MiniLM và áp dụng huấn luyện nhận biết lượng tử hóa tam phân
Tôi cũng tự viết engine suy luận rồi phát hành bằng Rust → WASM SIMD
Vì đây là mô hình embedding chứ không phải LLM, khi đưa văn bản vào sẽ nhận được vector 384 chiều, và dùng độ tương đồng cosine giữa hai vector để đánh giá mức liên quan của văn bản. Ví dụ, "reset my password" và "I forgot my password" cho ra khoảng 0.88
Có thể dùng cho tìm kiếm ngữ nghĩa, khớp FAQ/ý định, phân cụm, và vì chạy trên thiết bị nên có thể tìm kiếm ngữ nghĩa rất nhanh ngay khi nhập mà không phụ thuộc API
Demo tìm kiếm 2.000 tài liệu React hoàn toàn trên thiết bị: https://ternlight-demo.vercel.app
Trên npm có hai mức: @ternlight/base (7MB, khoảng 5ms mỗi embedding, embedding chất lượng tốt hơn) và @ternlight/mini (truyền tải 5MB, khoảng 2.5ms mỗi embedding), được đóng gói cho Node và trình duyệt
Kho lưu trữ có chi tiết kỹ thuật, giấy phép MIT và pipeline huấn luyện: https://github.com/soycaporal/ternlight
Tôi muốn biết liệu embedding trên thiết bị có thực sự hữu ích không, và có những trường hợp sử dụng nào
Tôi muốn biết liệu nó có thể giúp tìm ra crêpe khi người dùng nhập "pancake" mà không cần một mục từ điển tường minh kiểu "pancake = crêpe" hay không
Nếu tôi hiểu đúng thì thư viện sẽ tải một lần 5MB ban đầu, rồi sau đó dùng theo kiểu giống như hiện tôi đang dùng Fuse.js, đúng không
Tôi cũng muốn biết nó xử lý các ngôn ngữ ngoài tiếng Anh tốt đến đâu, và liệu có thể huấn luyện bằng wiki thẻ OpenStreetMap hay không
Tôi muốn biết có so sánh nào với các mô hình embedding siêu nhỏ khác không. Thật khó đánh giá liệu lý do bắt đầu từ MiniLM-L6 có phải vì đó là mô hình đặc biệt tốt trong cùng phân khúc hay không, vì chỉ số được cung cấp chỉ có "Retrieval (SciFact NDCG@10)"
Tuy vậy, hiệu năng thực tế chênh khá nhiều so với tuyên bố: trên Firefox chạy i5-4570, tôi chỉ đạt 35 embedding mỗi giây chứ không phải 400. Tôi nghi có vấn đề rơi xuống đường chạy không SIMD, và cũng định thử binary Rust native
Rất hay, nhưng sẽ tốt hơn nếu trang đích có nút bắt đầu demo. Ngay lúc mở trang web thì quạt quay như điên làm tôi khá giật mình
Sẽ hay nếu làm thành plugin cho Astro hay một meta framework phổ thông, để tự động phân tích tất cả các file HTML được tạo ra và xây dựng một cơ sở dữ liệu embedding nhỏ
Ở frontend có thể lazy-load nó, và có lẽ cả HNSW cũng có thể được lưu theo từng chunk để chỉ tải phần cần cho truy vấn tìm kiếm
Ví dụ như https://pagefind.app/ nhưng cung cấp tìm kiếm vector hoàn toàn tĩnh
Nếu sau nhiều tháng, nhiều năm mà vẫn vậy thì khá thất vọng, vì trông như dấu hiệu dự án không có đủ năng lực để hoàn thành cho ra hồn. Tôi thậm chí còn đề xuất dự án đó như một ứng viên ổn trong khoản tài trợ mà tôi nộp, và bên họ được chọn còn tôi thì trượt
Nếu ai biết giải pháp tốt trong mảng này, hoặc nếu tôi đã hiểu sai về SQLite-vec, thì rất mong được chỉ ra. Với SSG của chúng tôi, hiện gần như đã chốt là sẽ làm hạ tầng khác vài tháng rồi nếu khi đó vẫn chưa xong thì tự xây
Đây có thể là một phần bổ sung rất hay cho dự án tìm kiếm DuckDB HNSW mà tôi từng thấy ở đây: https://github.com/jasonjmcghee/portable-hnsw
Điểm rất thú vị là nó tìm kiếm trên các file Parquet được host tĩnh bằng HTTP range requests
Tôi nghĩ những thứ như vậy có thể phát triển thành một hệ sinh thái tìm kiếm tương đối mở và phân tán, không bị các tập đoàn lớn kiểm soát
https://news.ycombinator.com/item?id=27016630
Cái này thực sự rất hay, và có thể là mảnh ghép còn thiếu cho thứ tôi từng muốn làm
Với https://github.com/npiesco/absurder-sql, bạn có thể lưu bền toàn bộ corpus gốc trong IndexedDB/SQLite ngay trong trình duyệt
Sau đó, thay vì lập chỉ mục trước mọi thứ như https://weaviate.io/blog/chunking-strategies-for-rag, bạn có thể dùng Ternlight để tạo embedding và cache khi cần
Khi đó cũng có thể làm tìm kiếm lai bằng Reciprocal Rank Fusion, tức là kết hợp FTS5/BM25 của SQLite native với tìm kiếm ngữ nghĩa của Ternlight
Làm tốt lắm
Dù được quảng bá là 7MB, nhưng cũng có bản mini 5MB
Có vẻ mini nội bộ dùng vector 256 phần tử thay vì 384 để tiết kiệm không gian, rồi cuối cùng chiếu lên 384 để tương thích
Kích thước giảm còn một phần ba nhưng tổn thất không tuyến tính, nên ngay cả khi dùng đường dữ liệu nhỏ hơn thì lượng mất mát thông tin có vẻ vẫn ít hơn một phần ba
Dự án hay đấy
Trước đây tôi từng thử thứ tương tự: http://sol.quipu-strands.com/
Tôi muốn tải một mô hình embedding trong trình duyệt để sắp xếp văn bản theo ngữ nghĩa
Tôi lấy trọng số ONNX (MPNet, MiniLM) từ HuggingFace, tạo embedding bằng Transformers.js, rồi dùng bộ phân cụm của scikit-learn chạy bằng pyodide ngay trong trang. Tất cả đều chạy phía client, và tôi đã ngạc nhiên vì nó hoạt động hoàn hảo
Demo hoạt động khá kỳ lạ. Ví dụ, khi tìm "how to use typescript with createContext" thì các kết quả đầu toàn là mục typescript, trông như tìm kiếm tương đồng đã thất bại
Cảm ơn. Mô hình cục bộ rồi sẽ mang lại quyền riêng tư, và tôi đã biết một trường hợp sử dụng rất phù hợp cho các mô hình embedding nhỏ như thế này: tìm kiếm rẻ và nhanh trên cơ sở dữ liệu sản phẩm
Trong trường hợp của tôi, việc nó phụ thuộc vào CPU cũng là một lợi thế
Có thể tạo trước embedding mất 30 giây rồi gửi sang trình duyệt không?
Sau đó suy luận sẽ nhanh và ổn