Bản đồ ý nghĩa: Cách Embedding Models "hiểu" ngôn ngữ con người
Các mô hình nhúng đóng vai trò như một GPS cho ý nghĩa, chuyển đổi văn bản thành các điểm tọa độ trong không gian toán học. Thay vì tìm kiếm từ khóa chính xác, chúng giúp tìm kiếm các khái niệm có cùng "cảm xúc" hoặc chủ đề. Bài viết này giải thích cách hoạt động, lập trình với Python và kỹ thuật tinh chỉnh (fine-tuning) mô hình để nâng cao độ chính xác trong các ứng dụng AI như Tìm kiếm thông tin hoặc RAG.

Nếu bạn làm việc trong lĩnh vực phát triển Trí tuệ nhân tạo (AI), chắc chắn bạn đã từng gặp các mô hình nhúng (Embedding Models) trong quá trình học tập hoặc triển khai. Ở cốt lõi của chúng là một mạng nơ-ron được huấn luyện để ánh xạ các từ hoặc câu tương tự nhau vào không gian vector liên tục, nhằm mục đích xấp xỉ toán học các đối tượng có mối liên hệ ngữ cảnh hoặc khái niệm giống nhau.
Hãy tưởng tượng một thư viện nơi các cuốn sách không chỉ được phân loại theo tác giả và tên, mà còn theo nhiều chiều khác nhau như "cảm xúc", "chủ đề", hay "phong cách viết". Một cách hình dung khác là một bản đồ: nếu bạn không giỏi địa lý và không biết Tokyo và New York nằm ở đâu trên bản đồ, bạn có thể không thể sắp xếp bữa sáng ở NYC và trưa ở Tokyo. Tuy nhiên, nếu được cung cấp tọa độ, bạn sẽ thấy hai thành phố này cách nhau rất xa. Đó chính là cách mô hình nhúng hoạt động: chúng cung cấp "tọa độ" (vector) cho các từ và câu.
Minh họa không gian vector cho các từ khóa
Xây dựng Bản đồ ý nghĩa
Trước khi bạn đặt câu hỏi, mô hình nhúng đã được huấn luyện sẵn. Nó đã đọc hàng triệu câu và ghi nhận các mô hình. Ví dụ, nó nhận thấy rằng "con mèo" (cat) và "mèo con" (kitten) thường xuất hiện trong cùng một loại câu, trong khi "con mèo" và "tủ lạnh" (refrigerator) hiếm khi gặp nhau.
Dựa trên các mẫu này, mô hình gán cho mỗi từ một bộ tọa độ trong không gian toán học, như một bản đồ vô hình. Các khái niệm giống nhau (như "con mèo" và "mèo con") được đặt ngay cạnh nhau. Các khái niệm có liên quan nhưng khác nhau (như "con mèo" và "con chó") được đặt gần nhau nhưng không trùng lặp hoàn toàn. Ngược lại, các khái niệm hoàn toàn không liên quan (như "con mèo" và "vật lý lượng tử") sẽ được đặt ở các góc khác nhau hoàn toàn của bản đồ.
Vân tay kỹ thuật số (Digital Fingerprint)
Sau khi bản đồ được tạo, mô hình sẽ sử dụng nó để xử lý đầu vào. Khi bạn đưa vào một câu như "Con mèo con đang ngủ", mô hình không nhìn vào các chữ cái. Thay vào đó, nó truy cập tọa độ của từng từ trên bản đồ. Sau đó, nó tính điểm trung tâm (trung bình cộng) của tất cả các vị trí đó. Điểm trung tâm này trở thành "vân tay" (fingerprint) cho cả câu.
Khi bạn đặt câu hỏi, mô hình sẽ đặt một chấm kim vào vị trí vân tay của câu hỏi đó trên bản đồ và quan sát xem có bao nhiêu "vân tay" khác nằm trong bán kính xung quanh. Bất kỳ tài liệu nào "sống" gần câu hỏi trên bản đồ này đều được coi là trùng khớp, vì chúng chia sẻ cùng một "cảm xúc" hoặc chủ đề, dù không chia sẻ chính xác các từ ngữ giống hệt nhau.
Quy trình xử lý của mô hình nhúng
Dưới đây là các bước mà một mô hình nhúng thực hiện khi nhận một yêu cầu:
- Nhập liệu: Máy tính nhận văn bản.
- Token hóa: Văn bản được chia nhỏ thành các "mảnh" (tokens) có nghĩa, thường là từ hoặc phần của từ.
- Chunking (Phân đoạn): Văn bản đầu vào được chia thành các khối quản lý được (thường khoảng 512 token) để không bị quá tải thông tin.
- Nhúng (Embedding): Mỗi đoạn nhỏ được chuyển đổi thành một danh sách dài các số (vector) đóng vai trò như một vân tay duy nhất đại diện cho ý nghĩa của văn bản đó.
- Tìm kiếm Vector (Vector Search): Khi bạn đặt câu hỏi, mô hình chuyển câu hỏi thành một "vân tay" và nhanh chóng tính toán những đoạn nhúng nào trong kho chứa có các con số tương đồng nhất về mặt toán học.
- Kết quả: Mô hình trả về các vector tương tự nhất, được liên kết với các đoạn văn bản.
Nếu bạn thực hiện Retrieval-Augmented Generation (RAG), mô hình sẽ chuyển các đoạn văn bản "thắng cuộc" này cho một AI (như LLM) để đọc và viết câu trả lời tự nhiên dựa trên thông tin cụ thể đó.
Lập trình với Python
Hãy xem cách thực hành điều này với một ví dụ thực tế. Chúng ta sẽ sử dụng mô hình nhúng phổ biến all-MiniLM-L6-v2 và kết hợp với cơ sở dữ liệu vector Qdrant.
Đầu tiên, chúng ta tải mô hình và khởi tạo client:
from qdrant_client import QdrantClient, models
from sentence_transformers import SentenceTransformer
# 1. Tải mô hình nhúng
model = SentenceTransformer('all-MiniLM-L6-v2', device='cpu')
# 2. Khởi tạo client Qdrant
client = QdrantClient(":memory:")
Tiếp theo, chúng ta nhúng văn bản và lưu vào cơ sở dữ liệu:
docs = ["chính sách hoàn tiền", "chi tiết giá cả", "hủy tài khoản"]
vectors = model.encode(docs).tolist()
client.create_collection(
collection_name="my_collection",
vectors_config=models.VectorParams(size=384, distance=models.Distance.COSINE)
)
client.upload_collection(
collection_name="my_collection",
vectors=vectors,
payload=[{"source": docs[i]} for i in range(len(docs))]
)
Khi thực hiện truy vấn, kết quả sẽ chỉ ra tài liệu có "vân tay" gần nhất với câu hỏi của bạn. Ví dụ, câu hỏi "Làm thế nào để hủy đăng ký" sẽ liên quan đến chủ đề "hủy tài khoản" thay vì "chính sách hoàn tiền".
Tinh chỉnh mô hình (Fine-tuning)
Tinh chỉnh một mô hình nhúng khác với tinh chỉnh một LLM. Thay vì dạy mô hình cách "nói", bạn đang dạy nó cách sắp xếp lại bản đồ nội tại để các khái niệm cụ thể trong lĩnh vực của bạn được đẩy xa nhau hoặc kéo lại gần nhau.
Cách phổ biến và hiệu quả nhất là sử dụng Contrastive Learning (Học đối lập) với thư viện Sentence-Transformers. Chúng ta cần cung cấp dữ liệu huấn luyện theo cấu trúc: Anchor (điểm tham chiếu), Positive (mẫu tương đồng), và Negative (mẫu khác biệt).
Ví dụ: Cho câu hỏi "Nước ngọt Cola A".
- Positive: "Nước ngọt Cola B" (Nên được kéo lại gần).
- Negative: "Nước ngọt Cola A không đường" (Nên được đẩy ra xa).
Sử dụng hàm mất mát (Loss Function) như TripletLoss sẽ buộc khoảng cách giữa Anchor-Positive phải nhỏ hơn khoảng cách giữa Anchor-Negative.
Sau khi tinh chỉnh, kết quả cosine similarity giữa Cola và Cola thường tăng lên, trong khi Cola và Cola không đường lại giảm xuống, cho thấy mô hình đã hiểu rõ hơn về sự phân loại trong dữ liệu.
Các chỉ số đánh giá: Alignment và Uniformity
Để kiểm tra xem mô hình đã được cập nhật tốt chưa, chúng ta sử dụng hai chỉ số quan trọng:
- Alignment: Đo lường mức độ các mục liên quan (như Cola và Cola không đường) nằm gần nhau trong không gian nhúng. Điểm cao cho thấy mô hình tốt ở việc đặt các thứ giống nhau gần nhau (tốt cho tìm kiếm).
- Uniformity: Đo lường mức độ phân bố đều của các mục khác nhau trong không gian. Điểm cao cho thấy mô hình có thể phân biệt rõ ràng giữa các khái niệm khác nhau và tránh việc tất cả mọi thứ bị nhét chặt vào một góc nhỏ.
Một mô hình nhúng tốt cần cân bằng: vừa kéo các thứ giống nhau lại gần (Alignment cao), vừa đẩy các thứ khác nhau ra xa và phân bố đều (Uniformity cao).
Kết luận: Các mô hình nhúng là chìa khóa để máy tính hiểu văn bản. Chúng đóng vai trò là động cơ mạnh mẽ cho các ứng dụng RAG và tìm kiếm nhanh. Dù tinh chỉnh mô hình đòi hỏi nhiều dữ liệu và kỹ thuật, nhưng việc hiểu bản chất "bản đồ ý nghĩa" này là bước quan trọng để tối ưu hóa hiệu quả cho các dự án AI của bạn.



