Dùng AI

Embedding là gì? Biến chữ thành vector để tìm theo nghĩa

Embedding là cách biến một câu, một đoạn văn thành một dãy số (vector) sao cho các câu gần nghĩa có vector gần nhau. Nhờ đó máy tìm được "máy tính xách tay giá rẻ" khi bạn hỏi "laptop nào hợp túi tiền", dù hai câu không chung chữ nào quan trọng. Bài này giải thích embedding, độ tương đồng cosin, cách chọn mô hình theo tài liệu của Anthropic và Voyage AI, kèm đoạn Python so tìm theo từ và tìm theo nghĩa.

Ý chính
  • 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ìm theo từ hay theo nghĩa Câu hỏi: laptop nào hợp túi tiền? Tìm theo từChọn câu về pinchỉ trùng chữ laptop Tìm theo nghĩaChọn máy tính rẻcosin 0,98 EmbeddingCâu thành vector256 đến 2048 số So sánhĐộ tương đồng cosingần 1 là gần nghĩa Vector trong ví dụ chọn tay để minh họa
Tìm theo từ hay theo nghĩa Tìm theo từChọn câu về pinchỉ trùng chữ laptop Tìm theo nghĩaChọn máy tính rẻcosin 0,98 EmbeddingCâu thành vector256 đến 2048 số So sánhĐộ tương đồng cosingần 1 là gần nghĩa Vector trong ví dụ chọn tay để minh họa
Hình 1. Với câu hỏi "laptop nào hợp túi tiền?", tìm theo từ chọn câu về pin laptop vì chỉ trùng chữ "laptop"; tìm theo nghĩa chọn câu "máy tính xách tay giá rẻ" với cosin 0,98. Embedding biến câu thành vector (thường 256 đến 2048 số), so bằng độ tương đồng cosin. Vector trong ví dụ chọn tay để minh họa.

Độ 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.

Cẩn thận
  • 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

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.

Muốn học bài bản cùng giảng viên?

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í.

Xem Khóa AI

Nguồn tham khảo

Chia sẻ: Facebook LinkedIn
Nhắn Zalo tư vấnZalo Gọi 0937 401 483