Embedding là gì? Vector embedding và cosine similarity

Trả lời nhanh: Embedding là cách biến một từ, câu, đoạn văn, hình ảnh hay sản phẩm thành một vectơ, tức một dãy vài trăm đến vài nghìn con số. Mô hình được huấn luyện để những thứ gần nghĩa có vectơ nằm gần nhau. Nhờ vậy máy tính đo được “độ giống nghĩa” bằng phép tính như cosine similarity.

Điểm chính

  • Embedding không lưu “định nghĩa” của từ. Nó lưu vị trí của dữ liệu trong một không gian nhiều chiều, nơi khoảng cách phản ánh mức độ giống nhau về nghĩa.
  • Word embedding (Word2Vec 2013, GloVe 2014, FastText 2016) gán mỗi từ một vectơ cố định. Embedding model hiện đại dựa trên Transformer tạo vectơ cho cả câu, đoạn văn và hiểu ngữ cảnh.
  • Cosine similarity đo góc giữa hai vectơ: càng gần 1 càng giống nghĩa. Ngưỡng “bao nhiêu là giống” khác nhau theo từng mô hình, phải tự kiểm thử.
  • Embedding là nền của tìm kiếm ngữ nghĩa, RAG, phân cụm, gợi ý sản phẩm và phát hiện trùng lặp.
  • Với tiếng Việt, cần chú ý tách từ, chuẩn hoá Unicode, câu không dấu và chọn mô hình đã được đánh giá trên tiếng Việt. Vectơ tạo từ dữ liệu cá nhân cũng cần được bảo vệ như dữ liệu gốc.
Mục lục
  1. Embedding là gì?
  2. Vector embedding là gì? Hiểu vectơ, số chiều và không gian
  3. Vì sao embedding “hiểu” được nghĩa?
  4. Word embedding: từ Word2Vec, GloVe đến FastText
  5. Từ word embedding đến embedding câu: vai trò của Transformer
  6. Embedding model là gì và hoạt động ra sao?
  7. Cosine similarity là gì? Cách đo độ giống nhau giữa hai vectơ
  8. Embedding dùng để làm gì? Các ứng dụng phổ biến
  9. Embedding và vector database liên quan thế nào?
  10. Embedding cho tiếng Việt: cần lưu ý gì?
  11. Chọn embedding model thế nào?
  12. Hạn chế và rủi ro của embedding
  13. Câu hỏi thường gặp

Embedding là gì?

Embedding (tiếng Việt thường gọi là “nhúng” hoặc “biểu diễn nhúng”) là một biểu diễn dạng số của dữ liệu. Một đoạn văn, một bức ảnh hay một sản phẩm được chuyển thành một vectơ có độ dài cố định, chẳng hạn 384, 768 hoặc 1.024 con số. Chữ “nhúng” nói lên ý tưởng: dữ liệu được đặt (nhúng) vào một không gian toán học, nơi mỗi đối tượng là một điểm.

Điều làm embedding hữu ích là cách các điểm được sắp xếp. Mô hình tạo embedding được huấn luyện để những đối tượng giống nhau về nghĩa nằm gần nhau, đối tượng khác nghĩa nằm xa nhau. Câu “tôi muốn xin nghỉ phép” và “cho tôi đăng ký ngày nghỉ” gần như không chung chữ nào quan trọng, nhưng vectơ của chúng lại nằm rất gần nhau. Ngược lại, “đường” trong “đường phố” và “đường” trong “đường cát” cùng chữ nhưng một mô hình hiểu ngữ cảnh sẽ đặt hai câu chứa chúng ở hai vùng khác nhau.

Máy tính chỉ tính được với số; embedding là cây cầu giữa ngôn ngữ và phép tính. Đây là lý do embedding xuất hiện ở gần như mọi hệ thống xử lý ngôn ngữ tự nhiên hiện đại, từ ô tìm kiếm trên website đến chatbot trả lời theo tài liệu nội bộ.

Một cách hình dung dễ nhớ: toạ độ trên bản đồ

Mỗi tỉnh thành trên bản đồ có hai con số: vĩ độ và kinh độ. Chỉ cần hai số đó, bạn tính được Hà Nội gần Hải Phòng hơn Cần Thơ mà không cần biết gì về văn hoá hay kinh tế của từng nơi. Embedding làm điều tương tự với nghĩa của dữ liệu. Khác biệt là bản đồ có 2 chiều, còn embedding có hàng trăm đến hàng nghìn chiều, vì nghĩa của ngôn ngữ phức tạp hơn vị trí địa lý rất nhiều.

Ví dụ minh hoạ: các câu được chiếu xuống mặt phẳng 2 chiều chiều 1 chiều 2 Cụm 1: nghỉ phép xin nghỉ phép đăng ký ngày nghỉ số ngày phép còn lại Cụm 2: thanh toán hoá đơn VAT đối soát công nợ chuyển khoản NCC Câu hỏi: tôi muốn nghỉ 2 ngày câu hỏi của người dùng câu trong tài liệu Gần nhau = nghĩa gần nhau
Ví dụ minh hoạ: embedding thật có hàng trăm đến hàng nghìn chiều, ở đây được thu gọn còn 2 chiều để dễ nhìn. Câu hỏi không chứa chữ “phép” nhưng vẫn rơi gần cụm nghỉ phép.

Vector embedding là gì? Hiểu vectơ, số chiều và không gian

Vector embedding chính là kết quả đầu ra của quá trình embedding: một danh sách số thực, ví dụ [0,12; −0,08; 0,33; …]. Ba khái niệm cần nắm:

  • Vectơ (vector): dãy số có thứ tự. Mỗi số là một toạ độ.
  • Số chiều (dimension): độ dài của dãy. Một mô hình luôn trả ra vectơ cùng số chiều, dù đầu vào là một từ hay một trang văn bản.
  • Không gian vectơ (vector space): tập hợp mọi điểm có thể có. Mọi embedding của cùng một mô hình nằm trong cùng một không gian, nên mới so sánh được với nhau.

Một hiểu lầm phổ biến là mỗi chiều mang một ý nghĩa rõ ràng, kiểu chiều 1 là “mức độ tích cực”, chiều 2 là “có liên quan tới tiền”. Thực tế, các chiều do mô hình tự học và thường không đọc được bằng mắt người. Ý nghĩa nằm ở vị trí tương đối giữa các điểm, không nằm ở từng con số riêng lẻ.

Embedding khác one-hot encoding thế nào?

Trước embedding, cách đơn giản nhất để biến từ thành số là one-hot encoding: với bộ từ vựng 50.000 từ, mỗi từ là một vectơ 50.000 chiều, chỉ có một vị trí bằng 1, còn lại bằng 0. Cách này có hai nhược điểm lớn: vectơ rất dài và thưa (hầu hết là số 0), và mọi cặp từ đều “cách đều” nhau, nên “mèo” không gần “chó” hơn “hoá đơn”.

Tiêu chíOne-hot / đếm từ (bag of words)Embedding (dense vector)
Độ dài vectơBằng kích thước bộ từ vựng, có thể hàng chục nghìnCố định, thường vài trăm đến vài nghìn
Kiểu dữ liệuThưa, đa số là 0Dày, hầu hết các vị trí đều có giá trị
Thể hiện nghĩaKhông. Từ đồng nghĩa vẫn là hai vectơ không liên quanCó. Từ, câu gần nghĩa nằm gần nhau
Bắt từ khoá chính xác (mã, số hiệu)TốtKém hơn, có thể nhầm mã gần giống
Cách tạoQuy tắc cố định, không cần huấn luyệnHọc từ dữ liệu bằng mạng nơ-ron

Bảng trên cũng giải thích vì sao các hệ thống tìm kiếm tốt thường kết hợp cả hai: embedding để hiểu ý, tìm kiếm từ khoá để bắt đúng mã hàng, số hợp đồng hay số hiệu văn bản.

Vì sao embedding “hiểu” được nghĩa?

Ý tưởng nền tảng rất đời thường: những từ xuất hiện trong ngữ cảnh giống nhau thường có nghĩa giống nhau. Nếu “hoá đơn” và “chứng từ” liên tục đi cùng các từ như “xuất”, “kế toán”, “thuế”, “mẫu số”, thì mô hình sẽ đẩy hai từ này lại gần nhau trong không gian vectơ.

Quá trình học diễn ra như sau. Mô hình đọc một lượng văn bản rất lớn và được giao một nhiệm vụ, ví dụ đoán từ bị che, hoặc phân biệt cặp câu cùng nghĩa với cặp câu khác nghĩa. Mỗi lần đoán sai, các con số trong vectơ được điều chỉnh một chút. Sau hàng triệu lần điều chỉnh, vị trí của các điểm phản ánh quan hệ nghĩa trong dữ liệu. Đây là cơ chế học của mạng nơ-ron nhân tạo, nên embedding cũng thừa hưởng cả điểm mạnh lẫn điểm yếu của dữ liệu huấn luyện.

Với embedding cho câu, cách huấn luyện phổ biến là học tương phản (contrastive learning): kéo vectơ của cặp câu hỏi – câu trả lời đúng lại gần, đẩy các cặp sai ra xa. Vì vậy mô hình giỏi nhất ở đúng loại dữ liệu nó đã được luyện.

Word embedding: từ Word2Vec, GloVe đến FastText

Word embedding là embedding ở cấp độ từ: mỗi từ trong bộ từ vựng có một vectơ cố định. Đây là thế hệ đầu tiên phổ biến rộng rãi, và vẫn là cách tốt nhất để hiểu trực giác của embedding.

Word2Vec (2013)

Word2Vec do nhóm của Tomas Mikolov tại Google công bố, bài báo nộp lên arXiv ngày 16/01/2013. Theo bài báo, phương pháp này học được vectơ từ chất lượng cao từ bộ dữ liệu 1,6 tỷ từ trong chưa đầy một ngày. Word2Vec có hai biến thể: CBOW (đoán một từ từ các từ xung quanh) và Skip-gram (đoán các từ xung quanh từ một từ).

Ví dụ nổi tiếng nhất được nêu trong chính bài báo: lấy vectơ “King” trừ vectơ “Man” rồi cộng vectơ “Woman”, kết quả gần nhất với vectơ “Queen”. Nói cách khác, quan hệ “vua – nữ hoàng” được mã hoá thành một hướng trong không gian, tương tự quan hệ “đàn ông – phụ nữ”. Bài báo cũng nêu ví dụ quan hệ ngữ pháp như big – biggest và small – smallest.

GloVe (2014)

GloVe (Global Vectors) do Jeffrey Pennington, Richard Socher và Christopher D. Manning tại Đại học Stanford công bố năm 2014. Thay vì đọc từng cửa sổ ngữ cảnh nhỏ, GloVe học từ ma trận đồng xuất hiện toàn cục: đếm xem mỗi cặp từ xuất hiện gần nhau bao nhiêu lần trong cả kho văn bản.

FastText (2016)

Bài báo “Enriching Word Vectors with Subword Information” của Piotr Bojanowski, Edouard Grave, Armand Joulin và Tomas Mikolov, nộp ngày 15/07/2016, mở rộng Skip-gram bằng cách biểu diễn mỗi từ như tập các cụm ký tự (character n-gram). Lợi ích chính: tạo được vectơ cho cả những từ chưa từng xuất hiện khi huấn luyện, hữu ích cho từ hiếm, lỗi chính tả và ngôn ngữ có nhiều biến thể hình thái.

Giới hạn của word embedding

Mỗi từ chỉ có một vectơ, bất kể ngữ cảnh. Tiếng Việt có rất nhiều từ đa nghĩa: “bàn” (cái bàn, bàn bạc, bàn thắng), “đường” (con đường, đường ăn), “lãi” (lãi suất, có lãi). Word embedding gộp mọi nghĩa đó vào một điểm duy nhất. Ngoài ra, để có vectơ cho cả câu, người ta thường lấy trung bình vectơ các từ, làm mất thông tin về trật tự và phủ định: “không đồng ý” và “đồng ý” có trung bình khá giống nhau.

Từ word embedding đến embedding câu: vai trò của Transformer

Bước ngoặt đến từ kiến trúc Transformer và các mô hình như BERT (bài báo nộp ngày 11/10/2018). BERT đọc cả ngữ cảnh bên trái lẫn bên phải của mỗi từ, nên vectơ của “bàn” trong “bàn thắng” khác vectơ của “bàn” trong “bàn làm việc”. Đây gọi là embedding theo ngữ cảnh (contextual embedding).

Tuy nhiên, BERT nguyên bản không được thiết kế để so sánh nhanh hai câu. Bài báo Sentence-BERT của Nils Reimers và Iryna Gurevych (EMNLP 2019) chỉ ra: để tìm cặp câu giống nhau nhất trong 10.000 câu, BERT cần khoảng 50 triệu lần suy luận, mất chừng 65 giờ. Sentence-BERT tạo sẵn một vectơ cho mỗi câu rồi so sánh bằng cosine, rút thời gian xuống còn khoảng 5 giây mà vẫn giữ được độ chính xác. Hầu hết embedding model dùng cho tìm kiếm ngày nay đi theo hướng này.

Embedding cũng không chỉ dành cho văn bản. Mô hình CLIP (bài báo nộp ngày 26/02/2021) được huấn luyện trên khoảng 400 triệu cặp ảnh và chú thích thu thập từ internet, đưa ảnh và chữ vào cùng một không gian vectơ. Nhờ vậy bạn có thể gõ “áo sơ mi trắng tay dài” để tìm ảnh sản phẩm phù hợp mà không cần ai gắn nhãn thủ công cho từng ảnh.

Thế hệVí dụ tiêu biểuĐơn vị được nhúngHiểu ngữ cảnhDùng tốt cho
Word embedding tĩnhWord2Vec, GloVe, FastTextTừKhông, mỗi từ một vectơPhân tích từ vựng, đặc trưng cho mô hình nhỏ, gợi ý từ đồng nghĩa
Embedding theo ngữ cảnhBERT, PhoBERTTừ (token) trong câuCóPhân loại, nhận dạng thực thể, làm nền để tinh chỉnh
Embedding câu, đoạnSentence-BERT, BGE-M3, các embedding model thương mạiCâu, đoạn, tài liệuCóTìm kiếm ngữ nghĩa, RAG, phân cụm, phát hiện trùng lặp
Embedding đa phương thứcCLIPẢnh và văn bảnCóTìm ảnh bằng chữ, gắn thẻ ảnh, gợi ý sản phẩm theo hình

Embedding model là gì và hoạt động ra sao?

Embedding model là mô hình chuyên nhận dữ liệu đầu vào và trả ra vectơ. Khác với mô hình ngôn ngữ lớn sinh ra câu chữ, embedding model chỉ trả ra một dãy số. Với văn bản, quy trình bên trong thường gồm năm bước:

  1. Tách token: câu được cắt thành các đơn vị nhỏ (token) mà mô hình hiểu.
  2. Tra vectơ ban đầu: mỗi token được đổi thành một vectơ khởi đầu.
  3. Đi qua các lớp Transformer: cơ chế attention cho mỗi token “nhìn” các token khác để hiểu ngữ cảnh.
  4. Gộp (pooling): vectơ của các token được gộp thành một vectơ duy nhất cho cả câu, ví dụ lấy trung bình.
  5. Chuẩn hoá: nhiều mô hình chuẩn hoá vectơ về độ dài bằng 1 để việc so sánh bằng cosine nhanh và ổn định.

Trong thực tế, embedding model chạy theo hai luồng: lập chỉ mục (nhúng tài liệu một lần, lưu lại) và truy vấn (nhúng câu hỏi lúc hỏi, so với kho vectơ).

Lập chỉ mục (làm một lần, cập nhật khi tài liệu đổi) Đoạn tài liệu “Mỗi năm được 12 ngày phép” Embedding model (mô hình A) Vectơ tài liệu [0,12; −0,08; …] ví dụ 1.024 chiều Kho vectơ (vector database) Truy vấn (mỗi câu hỏi) Câu hỏi “Tôi được nghỉ bao nhiêu ngày?” Embedding model (cùng mô hình A) Vectơ câu hỏi [0,10; −0,05; …] Cosine similarity lấy top-k đoạn gần nghĩa nhất Quy tắc bắt buộc: tài liệu và câu hỏi phải đi qua cùng một embedding model, cùng phiên bản.
Embedding trong một hệ thống tìm kiếm ngữ nghĩa: tài liệu được mã hoá thành vectơ trước, câu hỏi được mã hoá lúc truy vấn, rồi so sánh độ tương đồng.

Lưu ý: vectơ của mô hình A và mô hình B nằm ở hai không gian khác nhau, không so sánh được với nhau. Khi đổi embedding model, kể cả nâng lên phiên bản mới của cùng nhà cung cấp, bạn phải tạo lại vectơ cho toàn bộ kho dữ liệu. Hãy luôn ghi lại tên và phiên bản mô hình cạnh mỗi vectơ.

Bi-encoder và cross-encoder

Embedding model kiểu trên là bi-encoder: câu hỏi và tài liệu được mã hoá riêng, nên tính trước được vectơ tài liệu và tìm rất nhanh. Cross-encoder đưa cả hai vào mô hình cùng lúc để chấm điểm, chính xác hơn nhưng chậm. Hệ thống thường dùng bi-encoder lọc vài chục ứng viên, rồi cross-encoder (bộ rerank) xếp hạng lại.

Cosine similarity là gì? Cách đo độ giống nhau giữa hai vectơ

Cosine similarity (độ tương đồng cosine) đo góc giữa hai vectơ, không quan tâm độ dài của chúng. Hai vectơ cùng hướng có cosine bằng 1, vuông góc bằng 0, ngược hướng bằng −1. Công thức:

cos(θ) = (A · B) / (‖A‖ × ‖B‖)

Trong đó A · B là tích vô hướng (nhân từng cặp toạ độ rồi cộng lại), ‖A‖ là độ dài vectơ A (căn bậc hai của tổng bình phương các toạ độ).

Ví dụ tính tay với vectơ 3 chiều

Ví dụ minh hoạ với ba vectơ đơn giản: A = (1; 2; 2), B = (2; 1; 2), C = (−1; 0; 1).

  • A · B = 1×2 + 2×1 + 2×2 = 8. Độ dài ‖A‖ = √(1 + 4 + 4) = 3, ‖B‖ = 3. Vậy cos(A, B) = 8 / 9 ≈ 0,89: rất giống nhau.
  • A · C = 1×(−1) + 2×0 + 2×1 = 1. ‖C‖ = √2 ≈ 1,41. Vậy cos(A, C) = 1 / (3 × 1,41) ≈ 0,24: ít liên quan.

Với embedding thật, phép tính giống hệt, chỉ là có 768 hoặc 1.024 toạ độ thay vì 3.

Cosine, tích vô hướng và khoảng cách Euclid

Thước đoĐo cái gìGiá trị càng… thì càng giốngKhi nào dùng
Cosine similarityGóc giữa hai vectơCàng gần 1Mặc định cho văn bản, vì độ dài vectơ ít mang nghĩa
Tích vô hướng (dot product)Góc và độ dàiCàng lớnKhi vectơ đã chuẩn hoá về độ dài 1 thì cho kết quả xếp hạng giống cosine, tính nhanh hơn
Khoảng cách Euclid (L2)Đường thẳng giữa hai điểmCàng nhỏPhân cụm, một số chỉ mục; với vectơ đã chuẩn hoá, xếp hạng tương đương cosine

Quy tắc thực hành: dùng đúng thước đo mà nhà phát triển mô hình khuyến nghị trong tài liệu kỹ thuật.

Đừng chép ngưỡng của người khác: điểm cosine 0,8 với mô hình này có thể là “rất giống”, nhưng với mô hình khác chỉ là “hơi liên quan”, vì mỗi mô hình phân bố vectơ khác nhau. Muốn đặt ngưỡng (ví dụ để báo trùng lặp hay để chatbot từ chối trả lời), hãy lấy vài trăm cặp câu thật của bạn, gắn nhãn giống/không giống rồi chọn ngưỡng dựa trên dữ liệu đó.

Embedding dùng để làm gì? Các ứng dụng phổ biến

Tìm kiếm ngữ nghĩa (semantic search)

Tìm kiếm từ khoá chỉ trả về tài liệu chứa đúng chữ bạn gõ. Tìm kiếm ngữ nghĩa so sánh vectơ, nên trả về tài liệu đúng ý dù khác chữ. Ví dụ minh hoạ: nhân viên gõ “công ty hỗ trợ tiền gửi xe không”, hệ thống vẫn tìm được mục “Phụ cấp đi lại và gửi xe” trong quy chế lương. Điểm yếu là các truy vấn cần khớp chính xác như mã sản phẩm “SP-10234” hay “Điều 9”. Vì vậy cách làm phổ biến là tìm kiếm lai (hybrid search): chạy song song tìm kiếm từ khoá và tìm kiếm vectơ, rồi trộn kết quả.

RAG: cho chatbot trả lời theo tài liệu của bạn

Embedding là bước truy xuất trong RAG (Retrieval-Augmented Generation). Câu hỏi được đổi thành vectơ, hệ thống lấy các đoạn tài liệu gần nghĩa nhất, rồi đưa cho mô hình ngôn ngữ để soạn câu trả lời có căn cứ. Chất lượng embedding quyết định chatbot có tìm đúng đoạn cần thiết hay không. Toàn bộ pipeline, cách chia đoạn và đánh giá được trình bày trong bài RAG là gì và cách triển khai cho doanh nghiệp.

Phân cụm và phân loại văn bản

Khi có vectơ, bạn có thể gom các văn bản giống nhau thành cụm bằng thuật toán như K-means, không cần gắn nhãn trước. Ví dụ minh hoạ: một tổng đài nhận 20.000 phiếu phản ánh mỗi tháng; phân cụm embedding giúp phát hiện nhanh các nhóm vấn đề nổi lên như “giao hàng trễ khu vực X” hay “lỗi đăng nhập sau khi cập nhật ứng dụng”. Embedding cũng là đầu vào rất tốt cho mô hình phân loại: chỉ cần vài trăm mẫu có nhãn, một mô hình đơn giản đặt trên embedding đã có thể phân loại email, ticket theo chủ đề. Đây là một dạng học có giám sát tận dụng tri thức có sẵn của embedding model.

Gợi ý sản phẩm, phát hiện trùng lặp và bất thường

Sản phẩm, bài viết cũng có thể được nhúng thành vectơ; sản phẩm có vectơ gần nhau được gợi ý cùng nhau, kể cả gợi ý theo hình ảnh nhờ embedding đa phương thức. Hai hồ sơ, hai câu hỏi trên diễn đàn hay hai mô tả sản phẩm có cosine rất cao thường là bản trùng hoặc gần trùng. Ngược lại, một giao dịch hay một bản ghi có vectơ nằm xa mọi cụm quen thuộc có thể là bất thường đáng kiểm tra. Embedding không tự kết luận gian lận, nhưng giúp khoanh vùng để con người xem xét.

Embedding và vector database liên quan thế nào?

Embedding tạo ra vectơ; vector database là nơi lưu trữ và tìm kiếm vectơ đó ở quy mô lớn. Khi kho chỉ có vài nghìn vectơ, bạn có thể so sánh câu hỏi với từng vectơ một. Khi có hàng triệu vectơ, cần chỉ mục tìm kiếm gần đúng (ANN) để trả kết quả trong vài mili giây, kèm lọc theo quyền truy cập và siêu dữ liệu. Cách các chỉ mục này hoạt động và tiêu chí chọn hệ thống được phân tích riêng trong bài vector database là gì.

Embedding cho tiếng Việt: cần lưu ý gì?

Âm tiết khác với từ

Tiếng Việt viết cách theo âm tiết, nhưng một từ có thể gồm nhiều âm tiết: “học sinh”, “máy tính”, “hợp đồng lao động”. Một số mô hình tiếng Việt yêu cầu tách từ trước. Ví dụ, trang chính thức của PhoBERT (VinAI, công bố tại Findings of EMNLP 2020) ghi rõ văn bản đầu vào phải được tách từ sẵn, và khuyến nghị dùng RDRSegmenter của VnCoreNLP, công cụ đã dùng khi tiền huấn luyện. Mô hình vietnamese-bi-encoder của BKAI xây trên PhoBERT-base-v2 cũng yêu cầu tách từ (có thể dùng pyvi hoặc underthesea), tạo vectơ 768 chiều và nhận tối đa 256 token mỗi đầu vào, theo thẻ mô hình trên Hugging Face. Nếu quên tách từ, mô hình vẫn chạy nhưng kết quả kém đi mà không báo lỗi.

Mô hình đa ngôn ngữ

Các mô hình đa ngôn ngữ không cần tách từ riêng và thường xử lý được văn bản dài hơn. Ví dụ, BGE-M3 (bài báo nộp ngày 05/02/2024) hỗ trợ hơn 100 ngôn ngữ, nhận đầu vào tới 8.192 token và hỗ trợ cả ba kiểu truy xuất: vectơ dày (dense), vectơ thưa (sparse) và đa vectơ (multi-vector). Ưu điểm là một mô hình dùng chung cho tài liệu Việt lẫn Anh; nhược điểm là có thể kém tinh tế hơn mô hình chuyên tiếng Việt ở một số lĩnh vực hẹp như pháp lý.

Chuẩn hoá văn bản trước khi nhúng

  • Unicode: cùng chữ “hoá” có thể được lưu bằng ký tự dựng sẵn hoặc tổ hợp (chữ cái cộng dấu riêng). Mắt thường không phân biệt được nhưng máy coi là khác nhau. Hãy chuẩn hoá toàn bộ về một dạng, thường là NFC.
  • Kiểu bỏ dấu: “hoá” và “hóa”, “thuỷ” và “thủy” đều phổ biến. Thống nhất một kiểu cho kho tài liệu và áp dụng cùng quy tắc cho câu hỏi.
  • Không dấu, viết tắt, teencode: người dùng hay gõ “hd ld”, “ko”, “bhxh”. Hãy đưa các câu hỏi kiểu này vào bộ kiểm thử, và cân nhắc bảng mở rộng viết tắt thường gặp trong ngành của bạn.
  • Văn bản scan: tài liệu giấy cần OCR đúng dấu trước khi nhúng. Lỗi dấu ở bước OCR sẽ đi thẳng vào vectơ.

Đã có bộ đánh giá embedding tiếng Việt

Nhóm tác giả Loc Pham và cộng sự công bố VN-MTEB trên arXiv ngày 29/07/2025, gồm 41 bộ dữ liệu thuộc 6 loại nhiệm vụ: truy xuất, phân loại, phân loại cặp câu, phân cụm, xếp hạng lại và đo tương đồng ngữ nghĩa. Bộ dữ liệu được tạo bằng cách dịch các mẫu tiếng Anh từ MTEB sang tiếng Việt, có lọc bằng mô hình ngôn ngữ. Theo nhóm tác giả, các mô hình lớn, phức tạp hơn dùng Rotary Positional Embedding cho kết quả tốt hơn mô hình dùng Absolute Positional Embedding. Đây là điểm tham khảo hữu ích, nhưng vì là dữ liệu dịch, bạn vẫn cần kiểm thử thêm trên văn bản tiếng Việt gốc của mình.

Chọn embedding model thế nào?

Bảng xếp hạng phổ biến nhất là MTEB (Massive Text Embedding Benchmark), do Niklas Muennighoff và cộng sự công bố tháng 10/2022, gồm 8 loại nhiệm vụ, 58 bộ dữ liệu và 112 ngôn ngữ. Kết luận quan trọng của chính bài báo: không có phương pháp embedding nào dẫn đầu ở mọi nhiệm vụ. Vì vậy, đừng chọn mô hình chỉ vì đứng đầu bảng tổng; hãy xem điểm ở đúng nhiệm vụ và ngôn ngữ bạn cần.

Tiêu chíCâu hỏi nên đặtGợi ý
Ngôn ngữDữ liệu chủ yếu tiếng Việt, hay trộn Việt – Anh?Ưu tiên mô hình có điểm trên VN-MTEB hoặc phần tiếng Việt của MTEB, rồi tự kiểm thử
Nhiệm vụTìm kiếm, phân cụm, phân loại hay phát hiện trùng?Xem điểm theo đúng loại nhiệm vụ, không chỉ điểm trung bình
Độ dài đầu vàoĐoạn văn dài bao nhiêu token?Phần vượt giới hạn thường bị cắt bỏ âm thầm; chia đoạn cho vừa
Số chiềuKho có bao nhiêu vectơ, ngân sách lưu trữ ra sao?Nhiều chiều hơn chưa chắc tốt hơn; cân nhắc mô hình cho phép rút gọn chiều
Cách triển khaiGọi API bên ngoài hay tự chạy trên máy chủ riêng?Dữ liệu nhạy cảm nên cân nhắc tự host hoặc hợp đồng xử lý dữ liệu rõ ràng
Giấy phépCó được dùng thương mại không?Đọc kỹ giấy phép từng phiên bản; ví dụ PhoBERT base và large dùng MIT, còn base-v2 dùng AGPL v3
Tốc độ và chi phíBao nhiêu câu hỏi mỗi giây, ngân sách mỗi tháng?Mô hình nhỏ hơn thường nhanh và rẻ hơn; đo trên phần cứng thật

Số chiều bao nhiêu là đủ?

Số chiều ảnh hưởng trực tiếp đến dung lượng. Mỗi số thường lưu dạng float32, chiếm 4 byte. Một triệu vectơ 1.024 chiều cần khoảng 1.000.000 × 1.024 × 4 ≈ 4,1 tỷ byte, tức khoảng 4 GB, chưa tính chỉ mục và dữ liệu đi kèm. Gấp đôi số chiều là gấp đôi dung lượng và thời gian so sánh.

Một hướng giảm chi phí là kỹ thuật Matryoshka Representation Learning (bài báo nộp ngày 26/05/2022): huấn luyện sao cho phần đầu của vectơ đã chứa nhiều thông tin nhất, nên có thể cắt bớt chiều mà ít mất chất lượng. Ví dụ, trong thông báo ngày 25/01/2024, OpenAI cho biết mô hình text-embedding-3-large tạo vectơ tối đa 3.072 chiều, cho phép rút gọn bằng tham số dimensions, và bản rút gọn còn 256 chiều vẫn đạt điểm MTEB cao hơn mô hình thế hệ trước ở 1.536 chiều. Đây là số liệu do nhà cung cấp tự công bố; hãy kiểm thử lại trên dữ liệu của bạn.

Đánh giá trên dữ liệu của chính bạn

Bảng xếp hạng chỉ là bước lọc ban đầu. Cách làm thực tế:

  1. Thu 100–300 câu hỏi thật từ nhân viên hoặc khách hàng, gồm cả câu không dấu, viết tắt.
  2. Với mỗi câu, ghi lại đoạn tài liệu đúng (nên nhờ người am hiểu nghiệp vụ gắn nhãn).
  3. Chạy 2–3 mô hình ứng viên, đo Recall@k: tỷ lệ câu hỏi mà đoạn đúng nằm trong k kết quả đầu (thường k = 5 hoặc 10).
  4. Đo thêm MRR (Mean Reciprocal Rank): đoạn đúng đứng thứ 1 được 1 điểm, thứ 2 được 1/2, thứ 3 được 1/3, rồi lấy trung bình.
  5. Xem kỹ các câu sai: sai do mô hình, do chia đoạn hay do tài liệu thiếu thông tin.

Hạn chế và rủi ro của embedding

Giới hạn về chất lượng

  • Phủ định và số liệu: “được hoàn tiền” và “không được hoàn tiền”, “hạn 30 ngày” và “hạn 60 ngày” có thể cho vectơ rất gần nhau, vì phần lớn nội dung trùng. Với nội dung mà một chữ “không” hay một con số làm đổi nghĩa, cần thêm bước rerank hoặc kiểm tra bằng quy tắc.
  • Thuật ngữ chuyên ngành hẹp: mô hình chung có thể không hiểu từ lóng nội bộ, tên viết tắt của sản phẩm. Khi kiểm thử thấy kém, có thể cân nhắc tinh chỉnh mô hình trên cặp câu hỏi – tài liệu của chính doanh nghiệp.
  • Thiên kiến từ dữ liệu huấn luyện: embedding học từ văn bản trên internet nên có thể mang định kiến về giới, vùng miền, nghề nghiệp. Cần thận trọng khi dùng embedding trong các quyết định ảnh hưởng tới con người như tuyển dụng hay chấm điểm tín dụng.

Rủi ro bảo mật và dữ liệu cá nhân

Nhiều người nghĩ vectơ chỉ là dãy số vô nghĩa nên không cần bảo vệ. Điều này không đúng. Nghiên cứu “Text Embeddings Reveal (Almost) As Much As Text” của John X. Morris và cộng sự (EMNLP 2023) cho thấy phương pháp của nhóm khôi phục chính xác 92% các đoạn văn bản 32 token từ embedding của chúng, và có thể khôi phục họ tên đầy đủ từ một bộ ghi chú lâm sàng.

Danh sách 10 rủi ro bảo mật cho ứng dụng mô hình ngôn ngữ lớn năm 2025 của OWASP có riêng mục LLM08:2025 về điểm yếu của vectơ và embedding, gồm truy cập trái phép và rò rỉ dữ liệu, rò rỉ chéo giữa nhiều nhóm người dùng dùng chung kho vectơ, tấn công đảo ngược embedding và đầu độc dữ liệu. Biện pháp OWASP khuyến nghị gồm kiểm soát truy cập chi tiết với kho vectơ có nhận biết quyền, tách dữ liệu theo nhóm người dùng, chỉ nạp dữ liệu từ nguồn tin cậy và ghi nhật ký truy xuất.

Tại Việt Nam, Luật Bảo vệ dữ liệu cá nhân số 91/2025/QH15 được Quốc hội thông qua ngày 26/06/2025, có hiệu lực từ 01/01/2026. Luật không nhắc riêng tới embedding, nhưng vì vectơ có thể bị đảo ngược để lộ nội dung gốc, cách làm thận trọng là đối xử với vectơ tạo từ dữ liệu cá nhân như chính dữ liệu đó: chỉ nhúng dữ liệu cần thiết cho mục đích đã xác định, kiểm soát quyền truy cập, xoá vectơ khi xoá dữ liệu gốc, và xem xét điều khoản xử lý dữ liệu khi gửi văn bản tới dịch vụ embedding bên ngoài.

Kiểm tra nhanh trước khi đưa vào vận hành: (1) vectơ có được mã hoá khi lưu không; (2) kết quả tìm kiếm có lọc theo quyền của người hỏi không; (3) khi một khách hàng yêu cầu xoá dữ liệu, vectơ tương ứng có bị xoá theo không; (4) văn bản gửi tới API embedding bên ngoài có chứa số căn cước, số tài khoản hay thông tin sức khoẻ không; (5) mỗi vectơ có ghi tên và phiên bản mô hình đã tạo ra nó không.

Câu hỏi thường gặp

Embedding và token khác nhau thế nào?

Token là đơn vị chữ mà mô hình cắt ra từ văn bản, ví dụ một âm tiết hay một phần của từ. Embedding là vectơ số biểu diễn token đó, hoặc cả câu, cả đoạn. Có thể hiểu token là “mảnh chữ”, còn embedding là “toạ độ nghĩa” của mảnh chữ hay đoạn văn.

Embedding có phải là mã hoá (encryption) không?

Không. Mã hoá được thiết kế để giữ bí mật và giải mã được bằng khoá. Embedding được thiết kế để giữ nghĩa và so sánh được, không có khoá bảo vệ. Như nghiên cứu năm 2023 đã cho thấy, nội dung gốc có thể được khôi phục đáng kể từ embedding, nên vectơ vẫn cần được bảo vệ.

Vector embedding có bao nhiêu chiều?

Tuỳ mô hình. Các mô hình nhỏ thường cho 384 chiều, mô hình cỡ BERT-base cho 768 chiều, nhiều mô hình tìm kiếm hiện đại cho 1.024 chiều trở lên, có mô hình tới 3.072 chiều. Số chiều cao hơn không đảm bảo chất lượng tốt hơn cho bài toán của bạn.

Cosine similarity bao nhiêu thì coi là giống nhau?

Không có con số chung. Mỗi mô hình phân bố vectơ khác nhau, nên ngưỡng phải được chọn dựa trên một bộ cặp câu có nhãn của chính bạn. Với tìm kiếm, thường không cần ngưỡng: chỉ cần lấy k kết quả có điểm cao nhất.

Đổi embedding model thì có phải làm lại từ đầu không?

Phải tạo lại toàn bộ vectơ, vì vectơ của hai mô hình không so sánh được với nhau. Dữ liệu gốc, cách chia đoạn và siêu dữ liệu thì giữ nguyên. Vì vậy hãy lưu văn bản gốc của từng đoạn cạnh vectơ, đừng chỉ lưu vectơ.