- Embedding biến văn bản thành vector số có độ dài cố định. Văn bản gần nghĩa cho vector gần nhau, nên máy so được nghĩa thay vì chỉ so chữ.
- Độ gần thường đo bằng độ tương đồng cosin: gần 1 là cùng hướng, gần 0 là không liên quan.
- Anthropic không có mô hình embedding riêng; tài liệu của Anthropic giới thiệu Voyage AI, nhưng khuyên so nhiều nhà cung cấp trước khi chọn.
- Embedding là nền của tìm kiếm theo nghĩa, RAG, gợi ý nội dung, gom nhóm văn bản.
Bài này dựa trên trang Embeddings trong tài liệu của Anthropic và trang tổng quan mô hình Voyage AI trong tài liệu MongoDB (đọc ngày 11/11/2026). Ý tưởng biểu diễn từ bằng vector có từ lâu; một cột mốc hay được nhắc là nhóm mô hình word2vec của Mikolov và cộng sự (2013).
Từ chữ đến vector
Máy tính chỉ làm việc với số. Cách đơn giản nhất để đổi câu thành số là đếm từ: mỗi từ trong từ điển là một vị trí, câu có từ nào thì vị trí đó bằng 1. Cách này dễ làm nhưng không biết nghĩa: "laptop" và "máy tính xách tay" là hai vị trí khác nhau hoàn toàn, nên máy coi chúng không liên quan.
Embedding giải quyết bằng cách học. Một mạng nơ-ron được huấn luyện trên lượng văn bản rất lớn để những câu dùng trong ngữ cảnh giống nhau có vector giống nhau. Kết quả là mỗi câu thành một vector, ví dụ 1024 số thực. Từng số không có nghĩa riêng mà con người đọc được, nhưng vị trí tương đối giữa các vector phản ánh quan hệ về nghĩa.
Embedding cho cả câu khác embedding cho từng từ. Mô hình hiện đại đọc cả câu nên phân biệt được cùng một từ trong hai ngữ cảnh khác nhau, điều mà các mô hình cho từng từ kiểu cũ làm kém hơn.
Độ tương đồng cosin
Hai vector được so bằng góc giữa chúng. Độ tương đồng cosin bằng tích vô hướng của hai vector chia cho tích độ dài. Nếu hai vector cùng hướng, giá trị là 1; vuông góc là 0; ngược hướng là -1. Với embedding văn bản, giá trị thực tế thường nằm trong khoảng dương, và ta quan tâm thứ hạng: tài liệu nào có cosin cao nhất với câu hỏi.
Tài liệu của Anthropic ghi rằng embedding của Voyage AI đã được chuẩn hóa về độ dài 1. Khi đó tích vô hướng bằng đúng cosin nên tính nhanh hơn, và cosin với khoảng cách Euclid cho cùng thứ hạng. Nếu dùng mô hình khác, kiểm tra xem vector đã chuẩn hóa chưa; chưa thì tự chia cho độ dài.
Ví dụ: tìm theo từ và tìm theo nghĩa
Đoạn Python dưới đây có bốn câu và một câu hỏi. Mỗi câu kèm một vector bốn chiều được chọn tay để minh họa, mỗi chiều ứng với một chủ đề (máy tính, ăn uống, học tập, giá cả). Chương trình tính hai thứ cho từng câu: độ trùng từ (số từ chung chia cho tổng số từ khác nhau) và cosin giữa vector câu hỏi với vector câu.
"""So sánh tìm theo từ trùng và tìm theo embedding (độ tương đồng cosin).
Vector ở đây có 4 chiều, CHỌN TAY để minh họa (máy tính, ăn uống, học tập, giá cả).
Embedding thật do mô hình sinh ra, thường 256 đến 2048 chiều, không chiều nào có tên rõ ràng như vậy.
"""
import math
import re
TAI_LIEU = [
("Laptop này pin dùng được 10 tiếng", [0.9, 0.0, 0.1, 0.1]),
("Quán phở gần trường bán 35 nghìn một tô", [0.0, 0.9, 0.0, 0.4]),
("Lịch thi học kỳ môn Toán đã có", [0.0, 0.0, 0.95, 0.0]),
("Máy tính xách tay giá rẻ cho học sinh", [0.8, 0.0, 0.3, 0.6]),
]
CAU_HOI = ("laptop nào hợp túi tiền?", [0.8, 0.0, 0.1, 0.7])
def tu(cau):
return set(re.findall(r"\w+", cau.lower()))
def trung_tu(a, b):
"""Độ trùng từ (Jaccard): số từ chung / số từ của cả hai câu."""
A, B = tu(a), tu(b)
return len(A & B) / len(A | B)
def cosin(u, v):
tich = sum(x * y for x, y in zip(u, v))
return tich / (math.sqrt(sum(x * x for x in u)) * math.sqrt(sum(y * y for y in v)))
def chuan_hoa(v):
do_dai = math.sqrt(sum(x * x for x in v))
return [x / do_dai for x in v]
def xep_hang(diem):
return sorted(range(len(diem)), key=lambda i: -diem[i])
def chay_thu():
cau, vec = CAU_HOI
d_tu = [trung_tu(cau, t) for t, _ in TAI_LIEU]
d_nghia = [cosin(vec, v) for _, v in TAI_LIEU]
dong = [f"Câu hỏi: {cau}"]
for i, (t, _) in enumerate(TAI_LIEU):
dong.append(f" [{i + 1}] trùng từ {d_tu[i]:.2f} | cosin {d_nghia[i]:.2f} | {t}")
dong.append(f"Tìm theo từ chọn [{xep_hang(d_tu)[0] + 1}], tìm theo nghĩa chọn [{xep_hang(d_nghia)[0] + 1}]")
u, v = chuan_hoa(vec), chuan_hoa(TAI_LIEU[3][1])
dong.append(f"Sau khi chuẩn hóa độ dài 1: tích vô hướng {sum(a * b for a, b in zip(u, v)):.2f} = cosin {d_nghia[3]:.2f}")
print("\n".join(dong))
return dong
if __name__ == "__main__":
chay_thu()
Kết quả cho thấy khác biệt rõ. Tìm theo từ chọn câu "Laptop này pin dùng được 10 tiếng", vì đó là câu duy nhất có chung chữ "laptop", dù câu không nói gì về giá. Ba câu còn lại có độ trùng từ bằng 0. Tìm theo nghĩa chọn câu "Máy tính xách tay giá rẻ cho học sinh" với cosin 0,98, vì vector của nó mạnh ở cả chiều máy tính và chiều giá cả, giống câu hỏi. Dòng cuối kiểm tra nhận xét ở trên: sau khi chuẩn hóa, tích vô hướng bằng cosin.
Ví dụ cũng cho thấy vì sao tìm theo từ vẫn còn chỗ dùng. Nếu người dùng gõ đúng một mã sản phẩm hay một tên riêng hiếm, so chữ chính xác lại tốt hơn so nghĩa. Nhiều hệ thống thực tế kết hợp cả hai: lấy kết quả từ tìm theo từ và tìm theo nghĩa, rồi gộp thứ hạng.
Cần nói rõ: vector bốn chiều chọn tay chỉ để thấy cơ chế. Embedding thật do mô hình sinh ra, có hàng trăm đến hàng nghìn chiều, và bạn không tự đặt được giá trị nào.
Lấy embedding thật
Tài liệu của Anthropic nói rõ Anthropic không có mô hình embedding riêng, và giới thiệu Voyage AI (thuộc MongoDB) như một lựa chọn. Theo trang đó, các mô hình văn bản thế hệ mới nhất gồm voyage-4-large (chất lượng cao nhất), voyage-4 (cân bằng), voyage-4-lite (nhanh và rẻ), cùng mô hình riêng cho code; độ dài ngữ cảnh 32.000 token, vector mặc định 1024 chiều và chọn được 256, 512 hoặc 2048. Có cả mô hình trọng số mở voyage-4-nano tải về chạy tự mình. Ngoài Voyage còn nhiều nhà cung cấp và mô hình mở khác.
Một chi tiết hay bị bỏ qua: khi dùng cho tìm kiếm, tài liệu khuyên ghi rõ đoạn văn bản là câu hỏi hay là tài liệu, qua tham số kiểu đầu vào. Mô hình thêm một chỉ dẫn ngắn khác nhau cho mỗi loại trước khi tạo vector, giúp tìm chính xác hơn. Nhúng tài liệu một kiểu, nhúng câu hỏi một kiểu, rồi so.
Khi chọn mô hình, tài liệu nêu ba yếu tố: dữ liệu huấn luyện có gần lĩnh vực của bạn không, tốc độ khi chạy thật, và khả năng tinh chỉnh trên dữ liệu riêng. Với văn bản tiếng Việt, nên thử vài mô hình đa ngôn ngữ trên chính dữ liệu của mình bằng một bộ câu hỏi có đáp án, giống cách đánh giá trong bài đánh giá câu trả lời AI.
Embedding dùng vào việc gì
Tìm kiếm theo nghĩa. Nhúng mọi tài liệu một lần, lưu lại. Khi có câu hỏi, nhúng câu hỏi rồi tìm các vector gần nhất. Đây là bước truy xuất trong RAG.
Gợi ý. Bài viết, khóa học có vector gần với những gì người dùng đã đọc thì được gợi ý.
Gom nhóm và tìm điểm lạ. Gom các phản hồi của học viên theo chủ đề mà không cần gán nhãn trước; câu nào nằm xa mọi nhóm có thể là trường hợp bất thường.
Phân loại ít dữ liệu. Dùng vector làm đặc trưng cho một mô hình phân loại đơn giản như hồi quy logistic.
Khi số tài liệu lên hàng trăm nghìn, so câu hỏi với từng vector một trở nên chậm. Lúc đó cần chỉ mục tìm láng giềng gần đúng, thường nằm trong một cơ sở dữ liệu vector; xem bài cơ sở dữ liệu vector.
Lưu trữ và chi phí
Mỗi vector 1024 chiều dạng số thực 32 bit chiếm khoảng 4 KB. Một triệu đoạn văn là khoảng 4 GB chỉ cho vector. Tài liệu của Anthropic mô tả hai cách giảm: chọn số chiều nhỏ hơn (Voyage hỗ trợ cắt vector theo kiểu Matryoshka rồi chuẩn hóa lại), và lượng tử hóa, đổi số thực 32 bit thành số nguyên 8 bit hoặc 1 bit, giảm dung lượng 4 lần hoặc 32 lần, đổi lại độ chính xác giảm ít nhiều. Phí tạo embedding tính theo số token, xem trang giá của nhà cung cấp.
- Nhúng câu hỏi và tài liệu bằng hai mô hình khác nhau: vector không so được với nhau.
- Đổi mô hình embedding mà không nhúng lại toàn bộ tài liệu cũ.
- Dùng tích vô hướng thay cosin khi vector chưa chuẩn hóa.
- Coi kết quả gần nhất luôn đúng: đó chỉ là điều mô hình cho là gần nghĩa, cần đánh giá bằng bộ câu hỏi có đáp án.
- Chọn mô hình chỉ vì bảng xếp hạng chung mà không thử trên dữ liệu tiếng Việt của mình.
Câu hỏi thường gặp
Embedding khác gì token?
Token là mảnh chữ mà mô hình đọc. Embedding là vector số biểu diễn nghĩa của cả một câu hay đoạn văn, thường dùng để so sánh và tìm kiếm.
Có tạo embedding bằng Claude được không?
Theo tài liệu của Anthropic, Anthropic không có mô hình embedding riêng. Bạn dùng mô hình của nhà cung cấp khác hoặc mô hình mở, rồi dùng Claude để trả lời dựa trên đoạn tìm được.
Bao nhiêu chiều là đủ?
Tùy mô hình và dữ liệu. Nhiều chiều hơn thường chính xác hơn nhưng tốn chỗ hơn. Thử vài mức trên bộ câu hỏi của bạn rồi chọn.
Embedding có hiểu tiếng Việt không?
Các mô hình đa ngôn ngữ có hỗ trợ, nhưng chất lượng khác nhau. Đánh giá trên dữ liệu tiếng Việt thật trước khi dùng.
Học tiếp
- Dùng embedding để trả lời từ tài liệu: RAG là gì.
- Lưu và tìm hàng triệu vector: cơ sở dữ liệu vector.
- Ôn đại số tuyến tính cho tích vô hướng, độ dài vector: toán cho AI.
Nếu bạn muốn học Python và AI bài bản cùng giảng viên, tham khảo khóa học AI của Big-O Coding.
Khóa AI – Introduction to Machine Learning: nền tảng Máy học từ thuật toán cơ bản đến Neural Networks và LLM, học bằng Python. Học thử buổi 1 miễn phí.


