Embedding là gì và vì sao nó quan trọng
(simonwillison.net)- Embedding là cách chuyển nội dung như văn bản, hình ảnh, mã nguồn thành một mảng số thực dấu phẩy động có độ dài cố định, giúp tìm các mục gần nhau về mặt ngữ nghĩa bằng phép tính khoảng cách
- Trong không gian vector do cùng một mô hình tạo ra, dù không cần biết ý nghĩa của từng con số riêng lẻ, ta vẫn có thể dùng độ tương đồng cosine để so sánh tài liệu liên quan, hình ảnh tương tự và các đoạn mã
- Trong một ví dụ lưu 472 bài TIL bằng OpenAI
text-embedding-ada-002dưới dạng vector 1.536 chiều, truy vấn tìm bài liên quan mất khoảng 400ms và tổng chi phí embedding cho 402.500 token là khoảng $0.04 - Chỉ với mô hình chạy cục bộ và vài công cụ nhỏ ghép lại, có thể triển khai tìm kiếm README, tìm kiếm mã nguồn, tìm kiếm hình ảnh, phân cụm và RAG; các ví dụ dùng
LLM,llm-sentence-transformers,Symbex,CLIP,E5-large-v2 - Tìm kiếm ngữ nghĩa dựa trên embedding không phụ thuộc vào việc khớp chính xác từ ngữ, nên trở thành cách cốt lõi để đưa các đoạn trích liên quan vào prompt của LLM trong RAG như hỏi đáp tài liệu nội bộ
Khái niệm cơ bản về embedding
- Embedding là phương pháp biến một mẩu nội dung thành một mảng số thực dấu phẩy động
- Dù độ dài nội dung thế nào, độ dài mảng luôn giữ nguyên
- Độ dài mảng do mô hình embedding quyết định; ví dụ có thể là 300, 1.000 hoặc 1.536 số
- Có thể xem mảng này như tọa độ trong một không gian đa chiều
- Vị trí trong không gian thể hiện ý nghĩa của nội dung theo cách mô hình embedding hiểu
- Có thể phản ánh các đặc tính nội dung như màu sắc, hình dạng hay khái niệm
- Dù không hiểu trọn vẹn ý nghĩa của từng con số riêng lẻ, ta vẫn có thể dùng quan hệ vị trí để làm các tác vụ hữu ích như tìm những mục ở gần nhau
Gợi ý nội dung liên quan: ví dụ blog TIL
- Trên một trang TIL có 472 bài, mô hình OpenAI
text-embedding-ada-002được dùng để tính vector embedding 1.536 chiều cho từng bài- Các vector được lưu trong cơ sở dữ liệu SQLite của trang
- Bài liên quan được tìm bằng cách tính độ tương đồng cosine giữa vector của bài hiện tại với vector của mọi bài khác rồi trả về 10 bài gần nhất
- Với bài ví dụ “Geospatial SQL queries in SQLite using TG, sqlite-tg and datasette-sqlite-tg”, các kết quả liên quan hàng đầu là những bài về SQLite, SpatiaLite, GDAL và truy vấn SQL không gian
- Độ tương đồng với chính nó là 1.0
sqlite_geopoly.mdlà 0.8817322855676049spatialite_viewing-geopackage-data-with-spatialite-and-datasette.mdlà 0.8813094978399854
- Truy vấn tính bài liên quan mất khoảng 400ms, nên độ tương đồng top 10 cho mọi bài được tính sẵn và lưu vào bảng
similarities - Chi phí API embedding của OpenAI cho trang TIL là khoảng $0.04, với mức giá $0.0001/1.000 token cho khoảng 402.500 token
- Mô hình độc quyền cần được vận hành cẩn trọng
- OpenAI từng ngừng một số mô hình embedding cũ
- Nếu đã lưu nhiều embedding bằng mô hình cũ, có thể phải tính lại theo mô hình còn được hỗ trợ để embedding nội dung mới
- OpenAI từng hứa sẽ chịu chi phí tái embedding sang mô hình mới, nhưng rủi ro phụ thuộc vào mô hình độc quyền vẫn còn
- Các mô hình giấy phép mở có thể chạy trên phần cứng tự quản, giúp tránh rủi ro mô hình bị ngừng hỗ trợ
Không gian vector qua Word2Vec
- Efficient Estimation of Word Representations in Vector Space của Google Research là bài báo Word2Vec được công bố ngày 16/1/2013
- Word2Vec là một mô hình embedding ban đầu, biến mỗi từ thành một mảng 300 số
- turbomaze.github.io/word2vecjson là bản demo cho phép khám phá 10.000 từ cùng mảng 300 số của mỗi từ
- Các từ gần “france” gồm
french,belgium,paris,germany,italy,spain
- Các từ gần “france” gồm
- Quan hệ còn bộc lộ qua phép toán vector
- Nếu cộng vector “paris” vào vector “germany” rồi trừ vector “france”, vector kết quả gần “berlin” nhất
- Điều này cho thấy mô hình đã nắm bắt quan hệ quốc tịch và địa lý trong không gian vector
- Word2Vec được huấn luyện trên 1,6 tỷ từ; các mô hình embedding hiện nay được huấn luyện trên tập dữ liệu lớn hơn nhiều nên nắm bắt quan hệ phong phú hơn
Tính embedding bằng công cụ LLM
- LLM là công cụ dòng lệnh và thư viện Python để làm việc với mô hình ngôn ngữ lớn
- Có thể cài bằng
pip install llmhoặcbrew install llm - Mặc định có thể dùng cùng OpenAI API
- Có thể cài bằng
- Khi cài plugin, có thể bổ sung thêm mô hình ngôn ngữ hoặc mô hình embedding mới
- Plugin
llm-sentence-transformerslà lớp bọc cho thư viện SentenceTransformers- Có thể tải mô hình
all-MiniLM-L6-v2từ Hugging Face và dùng cục bộ - Lệnh
llm embedxuất embedding của một câu dưới dạng mảng số JSON
- Có thể tải mô hình
- Một embedding đứng riêng lẻ không có nhiều ý nghĩa; nó chỉ hữu ích khi được lưu lại và đem so sánh
llm embed-multicó thể embedding nhiều nội dung cùng lúc và lưu chúng vào một bảng SQLite gọi là collection- Lệnh ví dụ tìm toàn bộ tệp
README.mddưới thư mục home và lưu vào collectionreadmes - Tùy chọn
--storelưu cả văn bản gốc trong bảng SQLite - Kết quả là 16.796 tệp
README.mdđược lưu, mất khoảng 30 phút trên máy cục bộ
- Lệnh ví dụ tìm toàn bộ tệp
Tìm kiếm ngữ nghĩa và “vibes-based search”
- Lệnh
llm similartìm các mục giống với câu đầu vào trong collection embedding đã lưu - Khi tìm trong collection
readmesbằng câusqlite backup tools, các README nhưsqlite-diffable,sqlite-dump,sqlite-generate,sqlite-history,sqlite-utilssẽ xuất hiện ở đầu kết quả - Không có gì đảm bảo tài liệu kết quả phải chứa trực tiếp từ “backups”
- Nếu nội dung gần về ngữ nghĩa với truy vấn, nó vẫn có thể được trả về
- Cách làm này là tìm kiếm ngữ nghĩa; bài gốc gọi nó là vibes-based search
- Vì chỉ khớp văn bản chính xác không phải lúc nào cũng tìm ra đúng thứ người dùng cần, cách này hữu ích cho nhiều loại công cụ tìm kiếm nội dung
Embedding mã nguồn: Symbex và Datasette
- Symbex là công cụ khám phá symbol trong codebase Python
- Nó được tạo ra để nhanh chóng tìm hàm và lớp Python rồi chuyển cho LLM
- Sau đó nó còn có thể dùng để tính embedding cho mọi hàm trong codebase và tạo công cụ tìm kiếm mã nguồn
- Symbex có thể xuất symbol tìm được thành JSON hoặc CSV; các định dạng này dùng làm đầu vào cho
llm embed-multi - Ví dụ embedding mọi hàm và phương thức lớp của dự án Datasette dùng mô hình gte-tiny
gte-tinylà tệp 60MBsymbex '*' '*:*' --nlxuất các hàm và phương thức lớp trong thư mục hiện tại dưới dạng JSON mỗi dòng một bản ghillm embed-multi ... --format nlcó thể nhận trực tiếp đầu ra đó để tạo embedding
- Sau đó có thể dùng Datasette cùng plugin datasette-llm-embed để chạy tìm kiếm ngữ nghĩa mã nguồn bằng SQL
- SQLite được dùng như một điểm tích hợp để kết nối nhiều công cụ
- Trích xuất hàm từ mã nguồn
- Đưa qua mô hình embedding
- Ghi kết quả vào SQLite
- Tìm kiếm bằng SQL
Embedding văn bản và hình ảnh vào cùng một không gian với CLIP
- CLIP là mô hình do OpenAI công bố vào tháng 1/2021, có thể embedding cả văn bản lẫn hình ảnh
- Điểm cốt lõi là nó đặt văn bản và hình ảnh vào cùng một không gian vector
- Vị trí embedding của chuỗi “dog” và ảnh một con chó sẽ ở gần nhau trong cùng không gian
- Có thể dùng văn bản để tìm ảnh liên quan, hoặc dùng ảnh để tìm văn bản liên quan
- Bản demo CLIP chạy trong trình duyệt được viết bằng Observable notebook và chạy mô hình CLIP ngay trong trình duyệt
- Trang này tải 158MB tài nguyên
- Mô hình văn bản CLIP là 64,6MB, mô hình hình ảnh là 87,6MB
- Có ví dụ tính điểm tương đồng của nhiều chuỗi văn bản với một bức ảnh bãi biển
beach: 26.946%city: 19.839%sunshine: 24.146%california beach: 27.427%
- Điều quan trọng không chỉ là hỏi độ tương đồng giữa một ảnh bất kỳ và một từ, mà là xây dựng giao diện tìm kiếm phía trên nó
Faucet Finder: tìm kiếm hình ảnh bằng CLIP
- Faucet Finder là công cụ tìm kiếm tùy chỉnh để tìm ảnh vòi nước phòng tắm
- Drew Breunig đã thu thập 20.000 ảnh vòi nước từ nhà cung cấp và tính embedding CLIP cho chúng
- Việc triển khai dùng LLM và plugin llm-clip
- Công cụ được triển khai bằng Datasette
- Công cụ này cho phép tìm những vòi nước khác có vẻ ngoài tương tự một vòi cụ thể
- Nếu bạn thích một vòi đắt tiền, bạn có thể tìm lựa chọn rẻ hơn nhưng nhìn tương tự
- Bản demo của Drew dùng embedding đã tính sẵn để hiển thị kết quả tương tự mà không phải chạy mô hình CLIP trên máy chủ
- Sau đó, mô hình CLIP phía máy chủ được triển khai lên Fly.io, và một bản demo Observable notebook được tạo bằng cách kết hợp API embedding chuỗi văn bản với API bảng embedding vòi nước
- Có thể tìm ảnh vòi nước theo ngữ nghĩa bằng truy vấn như “gold purple”
Phân cụm và trực quan hóa 2D
- Ngoài gợi ý nội dung liên quan và tìm kiếm ngữ nghĩa, embedding còn có thể dùng cho phân cụm
- llm-cluster là plugin triển khai phân cụm bằng sklearn.cluster của scikit-learn
- Có thể dùng GitHub issues API và paginate-json để tạo collection
llm-issuestừ tiêu đề issue của khosimonw/llm, rồi sinh 10 cụm - Tùy chọn
llm cluster llm-issues 10 --summarysẽ gửi văn bản của từng cụm cho LLM để tạo tên mô tả- Ví dụ các tên như “Log Management and Interactive Prompt Tracking”, “Continuing Conversation Mechanism and Management”
- Không gian nhiều chiều rất khó trực quan hóa nên có thể giảm chiều bằng phân tích thành phần chính (PCA)
- Matt Webb đã tạo embedding OpenAI cho mô tả các tập podcast BBC
In Our Timerồi sinh trực quan hóa 2D bằng PCA - Dù giảm từ 1.536 chiều xuống 2 chiều, các tập về chiến tranh trong lịch sử hay các khám phá khoa học hiện đại vẫn nằm gần nhau
- Matt Webb đã tạo embedding OpenAI cho mô tả các tập podcast BBC
Phân loại câu bằng vị trí trung bình
- Embedding cũng có thể dùng để phân loại
- Trước hết tính vị trí trung bình của từng nhóm embedding đã được gán nhãn theo một cách nào đó
- Sau đó so sánh embedding của nội dung mới xem nó gần vị trí nào hơn để gán danh mục
- Getting creative with embeddings của Amelia Wattenberger minh họa cách chấm điểm một câu là cụ thể hay trừu tượng
- Tạo các mẫu câu cụ thể và trừu tượng, rồi tính vị trí trung bình của từng nhóm
- Câu mới nhận điểm dựa trên việc nó nằm gần vị trí trung bình nào hơn
- Điểm này còn có thể được chuyển thành màu sắc để thể hiện lỏng mức độ trừu tượng hay cụ thể của câu
RAG: hỏi đáp trên tài liệu cá nhân và tài liệu nội bộ
- Những ai từng dùng ChatGPT thường muốn biết cách để nó trả lời dựa trên ghi chú cá nhân hoặc tài liệu nội bộ công ty
- Câu trả lời có thể không phải là huấn luyện mô hình tùy chỉnh tốn kém, mà là kết hợp LLM sẵn có với RAG (retrieval-augmented generation)
- Quy trình cơ bản của RAG khá đơn giản
- Người dùng đặt câu hỏi
- Tìm trong tài liệu cá nhân nội dung có vẻ liên quan đến câu hỏi
- Đưa các đoạn trích liên quan cùng câu hỏi gốc vào prompt, trong giới hạn dung lượng của LLM
- LLM trả lời dựa trên nội dung bổ sung đã được cung cấp
- Giới hạn kích thước phổ biến vào khoảng 3.000–6.000 từ
- Phần khó của RAG là tìm ra những đoạn trích tốt nhất để đưa vào prompt
- Tìm kiếm ngữ nghĩa dựa trên embedding rất phù hợp để gom những nội dung có khả năng liên quan cao
Triển khai Hỏi & Đáp ngoại tuyến dựa trên blog với E5-large-v2
- Một ví dụ RAG dựa trên nội dung blog dùng E5-large-v2
- Câu hỏi và câu trả lời khác nhau về ngữ pháp, nên câu hỏi không phải lúc nào cũng gần về ngữ nghĩa với tài liệu chứa câu trả lời
- E5-large-v2 hỗ trợ hai kiểu nội dung
- factual sentence được embedding dưới dạng phrase
- question được embedding dưới dạng query
- Điều này tương tự cách CLIP đặt ảnh và văn bản vào cùng một không gian
- 19.000 đoạn văn của blog được embedding dưới dạng phrase, còn câu hỏi được embedding dưới dạng query để tìm ra các đoạn gần với câu trả lời nhất
- Ví dụ triển khai RAG bằng một dòng lệnh Bash
- Dùng
llm similarđể tìm các đoạn liên quan - Dùng
jqđể trích xuất nội dung - Chuyển câu hỏi và các đoạn văn cho mô hình Llama 2 Chat 7B chạy trên laptop cục bộ
- Dùng
- Với câu hỏi
What is shot-scraper?, hệ thống tạo ra câu trả lời rằngshot-scraperlà tiện ích Python bọc Playwright, tự động hóa chụp ảnh màn hình trang web và scraping dựa trên JavaScript thông qua giao diện dòng lệnh và luồng cấu hình dựa trên YAML - Câu trả lời tạo ra không phải là câu khớp nguyên văn chính xác từ nội dung blog gốc
Các lựa chọn có thể tinh chỉnh trong thực tế
- LangChain là framework để xây dựng tính năng trên LLM, và RAG là một trong những chức năng cốt lõi của LangChain
- Có thể xây dựng cùng chức năng trên LangChain, nhưng cần đầu tư đáng kể để hiểu LangChain
- Ở đây, tác giả chuộng một bộ công cụ nhỏ có thể ghép nối với nhau hơn là một framework đơn lẻ giải quyết mọi thứ
- Hàm khoảng cách mặc định được dùng là độ tương đồng cosine
- Các hàm khoảng cách khác vẫn chưa được thử
- RAG có nhiều yếu tố có thể điều chỉnh như hàm khoảng cách, mô hình embedding, chiến lược prompt và LLM
- Các ví dụ có quy mô tối đa khoảng 20.000 embedding; ở mức này, việc tính độ tương đồng cosine brute force trên toàn bộ tập vẫn cho kết quả trong thời gian hợp lý
- Với dữ liệu lớn hơn như 1 tỷ đối tượng, có thể chọn cơ sở dữ liệu vector hoặc phần mở rộng cho cơ sở dữ liệu sẵn có
- SQLite có sqlite-vss
- PostgreSQL có pgvector
- FAISS của Facebook cũng đã được dùng trong thử nghiệm, cùng plugin Datasette datasette-faiss sử dụng nó
- Xu hướng đáng chờ đợi trong tương lai là mô hình đa phương thức và các mô hình nhỏ hơn
- ImageBind của Facebook học embedding chung cho 6 modality: hình ảnh, văn bản, âm thanh, độ sâu, nhiệt và dữ liệu IMU
- Những mô hình nhỏ như
gte-tinychỉ 60MB làm tăng khả năng chạy trên thiết bị hạn chế hoặc ngay trong trình duyệt
Đọc thêm
- What are embeddings? by Vicki Boykis
- Text Embeddings Visually Explained by Meor Amer for Cohere
- The Tensorflow Embedding Projector: công cụ tương tác để khám phá không gian embedding
- Learn to Love Working with Vector Embeddings: tuyển tập hướng dẫn về vector embedding của Pinecone
1 bình luận
Các ý kiến trên Hacker News
Sau khi đăng bài này, tôi đã tìm thêm được vài tài liệu hữu ích để hiểu embedding ở mức thấp hơn
Bài của tôi cố ý viết ở mức rất cao, chủ yếu tập trung vào ứng dụng
Text Embeddings Visually Explained của Cohere: https://txt.cohere.com/text-embeddings/
Công cụ Tensorflow Embedding Projector: https://projector.tensorflow.org/
What are embeddings? của Vicki Boykis cũng đáng xem: https://vickiboykis.com/what_are_embeddings/
Tôi dự định sẽ thêm chúng vào phần “further reading” ở cuối trang
Dùng embedding đã giúp tăng mức độ tương tác với các bài liên quan, và cá nhân tôi cho rằng embedding là một công cụ mạnh nhưng bị đánh giá thấp
Có thể dùng để khám phá giữa các tài liệu hoặc đoạn trích theo độ tương đồng, hoặc ngược lại để tìm nội dung độc đáo; hơn nữa khá “an toàn” vì không phải lo về ảo giác
Cách embedding được tạo ra cũng có thể rất thú vị. Ví dụ như cách cắt bỏ tầng phân loại sau khi huấn luyện, hoặc các hướng tiếp cận như EfficientNet
Nó đang dần trở thành một nền tảng cốt lõi của machine learning
Trong thị giác máy tính và các thuật toán visual SLAM, embedding đã trở thành phương pháp gần như tiêu chuẩn thực tế cho nhận diện địa điểm, và rất giống với nội dung bài này
Người ta gọi nó là “bag-of-word place recognition”, và hiện nay gần như mọi thư viện mã nguồn mở đều dùng
Cốt lõi là đưa từng ảnh qua pipeline trích xuất đặc trưng và descriptor để “embedding” thành một vector chứa N đặc trưng hàng đầu
Khi camera di chuyển, hệ thống tạo một cơ sở dữ liệu ảnh gọi là keyframe, và ảnh được lưu dưới dạng các vector có số chiều thấp hơn nhiều
Sau đó dùng mọi ảnh để truy vấn cơ sở dữ liệu và tìm kết quả khớp tối ưu trong cơ sở dữ liệu vector bằng những cách như độ tương đồng cosine
Nếu có kết quả khớp, có thể tính các ràng buộc stereo giữa ảnh truy vấn và ảnh khớp để cập nhật bản đồ
Bài báo gốc là [1], và hiện thực nổi tiếng nhất là https://github.com/dorian3d/DBoW2
[1]: https://www.google.com/search?client=firefox-b-d&q=Bags+of+B...
Đây là tài liệu tham khảo nhập môn rất hay
Trước đây tôi tự làm một ứng dụng ghi chú iOS, và việc thêm embedding vào tìm kiếm toàn văn hiện có 1) dễ đến ngạc nhiên và 2) mạnh hơn tôi dự đoán ban đầu rất nhiều
Tôi biết rằng tìm “dog” thì các ghi chú có “canine” cũng sẽ xuất hiện, nhưng chỉ khi tự thử những truy vấn như “thú cưng mà tôi có thể thích” và thấy nó bắt được nhiều ghi chú liên quan đến động vật với cảm xúc tích cực, tôi mới thực sự nhận ra
Đó là khoảnh khắc “à ha” lớn đầu tiên của tôi
Khi đó PR DocsGPT của Supabase rất hữu ích làm mã ví dụ: https://github.com/supabase/supabase/pull/12056
Nhiều ứng dụng phụ thuộc rất nhiều vào tên hoặc danh từ riêng, và thường thiếu ngữ cảnh
Nếu bạn chỉ gọi chó cưng bằng tên mà không mô tả, một số mô hình embedding nhất định có thể không bắt được
Các danh từ riêng như người, địa điểm, tên đường có thể rất quan trọng để neo tìm kiếm cá nhân hóa hoặc chuyên biệt theo miền, nhưng mô hình ngôn ngữ đa dụng không biết những thứ đó
Tôi tò mò liệu có cách cụ thể nào để xử lý vấn đề này không
Câu hỏi lớn nhất hiện nay là nên biến bao nhiêu văn bản thành một embedding
Tôi đang phân vân giữa làm theo từng câu, hay gộp toàn bộ các block câu thuộc một trang trong ứng dụng ghi chú thành một embedding
Ví dụ tiêu biểu về embedding từ là công thức nổi tiếng King - Man + Woman = Queen
Nó hoạt động tốt trong không gian vector, nhưng khi chiếu xuống 2 chiều thì về mặt trực quan lại không dễ cảm nhận
Theo trải nghiệm của tôi, PCA, MDS, t-SNE đều như vậy: https://bhugueney.gitlab.io/test-notebooks-org-publish/jupyt...
Đây là JupyterLite Notebook thực hiện embedding từ trong trình duyệt, và tốt nhất không nên chạy trên smartphone
Tôi tò mò liệu có ai biết cách trực quan hóa cho đẹp các ví dụ tiêu biểu về embedding từ không
Nếu thật sự muốn tính trực giao thì có thể dùng Gram-Schmidt
Trong 3 chiều, có thể thêm một trục nữa là trục Z với “king”-“queen”, và phiên bản đã trực giao hóa sẽ gần hơn với khái niệm khoảng cách mà mô hình nhìn thấy
Trong 2 chiều, khi tính “king”-“man”+“woman” thì không thể cho thấy nó lệch khỏi “queen” bao nhiêu, nhưng vẫn có thể lấy chính xác phần khoảng cách còn lại
Trong 3 chiều thì có lẽ có thể đưa ra khoảng cách chính xác
“queen” thường được chọn vì đó là từ có embedding gần nhất với X="king"-"man"+"woman"
Trên biểu đồ 2 chiều cũng có thể hiển thị thêm vài từ gần nhất tiếp theo, và gắn cho mỗi từ khoảng cách trực giao của nó tới mặt phẳng 2 chiều
Khi đó “queen” phải là từ có tổng bình phương khoảng cách tới X và bình phương khoảng cách trực giao tới mặt phẳng nhỏ nhất, nên cũng có thể phần nào kiểm chứng bằng mắt
Đại loại là “Không thể trực quan hóa 4 chiều… ít nhất là tôi thì không. Vì tôi chỉ có ba brane”, một kiểu chơi chữ giữa branes và brains
Sau đó ChatGPT thừa nhận đó là do nó bịa ra và xin lỗi
Tiếp đó nó còn đưa ra các trích dẫn của John von Neumann, H. G. Wells, Ian Stewart, và cuối cùng trả lời kiểu “Muốn trực quan hóa 4 chiều thì hãy trực quan hóa 3 chiều rồi nói ‘n+1’”; câu này giống nhất với câu đùa trong trí nhớ của tôi nhưng kém buồn cười hơn
Vì vậy tôi bảo nó thử tạo các trích dẫn ảo giác theo phong cách Deepak Chopra về việc trực quan hóa không gian nhiều chiều, và nó tuôn ra một loạt trích dẫn giả nghe có vẻ hợp lý, trộn các cụm như septillion-dimensional embeddings, Hilbert space, Poincaré conjecture, Heisenberg uncertainty principle, Shannon entropy
Một lỗi thường gặp trong lượng giác thực dụng là thực hiện phép tính căn bậc hai không cần thiết
Trong mã ví dụ,
magnitude_a = sum(x * x for x in a) * 0.5vàmagnitude_b = sum(x * x for x in b) * 0.5không cần*0.5Nếu định so sánh cosine thì có thể so sánh các giá trị bình phương, nhờ đó tránh phép tính căn tốn kém
Tương tự, trong mật mã đường cong elliptic, các phép toán đắt đỏ như tính nghịch đảo cũng thường được trì hoãn hết mức có thể, hoặc khi chỉ cần so sánh hai điểm thì thậm chí tránh luôn việc tính giá trị chuẩn
Nếu không thì đã thay bằng mã SIMD cấp thấp rồi
dot_product = sum(x * y for x, y in zip(a, b))ư, tôi thắc mắc tại sao lại làm vậy mà không dùng phép toán numpy đã vector hóaĐọc đến đoạn “đã để ChatGPT viết nhiều phiên bản mã cosine similarity” thì tôi hiểu ra
Thứ nhất, khi giải thích cho mọi người, tôi cảm thấy cú pháp numpy lại gây cản trở
Thứ hai, numpy không phải là dependency nhẹ nhất
Khi cần hiệu năng thì tôi dùng, nhưng không muốn coi nó là lựa chọn mặc định
Nếu muốn xem các bài Show HN, startup trên ProductHunt, công ty YC, repository Github liên quan đến LLM embedding, bạn có thể nhanh chóng tìm thấy bằng MVP LLM-Embeddings-Based Search Engine vừa ra mắt
https://payperrun.com/%3E/search?displayParams={%22q%22:%22L...
Tôi đã nghĩ rằng khi bấm các nút lọc khác nhau thì kết quả tìm kiếm sẽ được cập nhật ngay, không ngờ là phải tìm kiếm lại
Tôi hiểu vì sao bạn làm như vậy
Đây là thứ thú vị nhất tôi đọc được trong vài tháng gần đây liên quan đến “AI”
Mỗi lần thấy mô hình embedding trong danh sách, tôi đều tò mò không biết đó là gì, và cũng thắc mắc vì sao ai cũng nói về vector DB
Tôi lập tức nghĩ ra cách áp dụng nó cho một side project đã làm từ lâu
Nếu mọi tài liệu đều có embedding, có lẽ việc phân cụm hữu ích dữ liệu người dùng sẽ trở nên khả thi
Tôi tò mò liệu thực tế có ai từng dùng embedding cho việc gì khác ngoài xấp xỉ láng giềng gần nhất và phân cụm không
Những khả năng tôi nghĩ tới là chiếu, lập chỉ mục và sắp xếp theo các trục tùy ý. Ví dụ như các trục “nóng-lạnh”, “hạnh phúc-buồn bã”, “SF-hiện thực”, “tính văn học-tính thương mại”
Ngoài việc phân loại kiểu SVM trong không gian embedding, suy luận kiểu word2vec như woman-man+king=queen, hay tách lấy một tầng của LLM, hẳn cũng có cách huấn luyện trực tiếp embedding
Tôi biết contrastive learning có được dùng, nhưng những cách khác như học embedding cùng với mạng nơ-ron hàm, sinh ra phương trình hàm rồi tính loss sai số bình phương trung bình cũng có vẻ đáng khám phá
Tôi ngạc nhiên vì mọi thứ dường như quá tập trung vào tìm kiếm ngữ nghĩa, và chắc chắn phải còn những ứng dụng thú vị khác
Ví dụ thứ nhất và thứ ba về cơ bản là giống nhau
Trong thị giác máy tính, bạn có thể muốn thay đổi ảnh về mặt ngữ nghĩa, chẳng hạn thêm kính vào ảnh; những tác vụ thấy trong quảng cáo của Google là ví dụ như vậy
Các tác vụ này được thực hiện trong không gian tiềm ẩn
Với normalizing flows thì điều này đặc biệt rõ, vì chúng biến không gian thành Gaussian
Các mô hình khuếch tán cũng làm việc tương tự bằng phương pháp xấp xỉ, nhưng không khả nghịch, dù vẫn có thể đảo ngược lại
Ta chiếu ảnh, câu hoặc dữ liệu muốn thao tác, chỉnh sửa trong không gian Gaussian rồi đưa trở lại không gian đích
Tuy nhiên có thể từ embedding là một thuật ngữ bị quá tải, mang quá nhiều nghĩa, nên chúng ta đang nhầm lẫn với nhau
Có thể bạn chỉ đang nghĩ đến khối đầu tiên chuyển các token số nguyên rời rạc thành số thực dấu phẩy động liên tục
Nhưng embedding đó cũng được học, nên dù trông như bảng tra cứu thì nó vẫn là một quá trình của mạng nơ-ron
Cũng có trường hợp dùng SVM trong không gian này
Tôi xem nó giống không gian tiềm ẩn nhưng trừu tượng hơn một chút
Ít nhất embedding phải là đơn ánh. Về mặt toán học là vậy, nhưng…
Huấn luyện trực tiếp embedding, nói đúng nghĩa, chính là mô hình embedding nguyên thủy Word2Vec
Nó tìm được rất nhiều biến thể như cách viết có dấu gạch nối, không gạch nối, có khoảng trắng của tên hóa học/sinh hóa, cùng các chữ viết tắt
Có lẽ cũng có thể dùng để tạo một từ điển thuật ngữ kỹ thuật
Không rõ có thể đi xa tới mức định nghĩa hay không, nhưng dù chỉ vector thì vẫn là một điểm khởi đầu
Rất có khả năng những người khác cũng đã xây dựng từ điển theo cách này
Tôi đã thử làm việc với embedding và cũng xây dựng vài use case production; đây là một công cụ tuyệt vời, cho phép rất nhiều ứng dụng hay
Nhưng khi làm trong một domain cụ thể, bạn sẽ gặp giới hạn của các mô hình embedding có sẵn
Mô hình có sẵn có nhiều chiều, nhưng trong đó có chiều quan trọng cho phân loại, độ tương đồng nội dung, phân cụm... của ứng dụng của tôi, còn có chiều thì không quan trọng
Nói cách khác, hai vector có thể trông gần nhau vì chúng gần ở những chiều mà tôi không quan tâm
Tôi mong sẽ có công cụ và tài liệu tốt hơn cho fine-tune mô hình embedding
Những công cụ kiểu này đã có từ lâu; ví dụ, chỉ cần gán nhãn một ít dữ liệu rồi huấn luyện SVM phân loại trên không gian embedding