AI 5 — NLP, Embeddings & Transformers
Mở đầu: Vì sao máy tính khó hiểu ngôn ngữ?
Với con người, ngôn ngữ là thứ tự nhiên đến mức ta hiếm khi nghĩ tới độ phức tạp của nó. Nhưng với máy tính, ngôn ngữ là một trong những loại dữ liệu khó xử lý nhất. Máy tính chỉ làm việc với con số, trong khi văn bản lại đầy mơ hồ: một từ có nhiều nghĩa ("đá" có thể là hòn đá hoặc hành động đá bóng), thứ tự từ làm thay đổi ý nghĩa ("chó cắn người" khác "người cắn chó"), và ngữ cảnh quyết định tất cả.
Xử lý ngôn ngữ tự nhiên (Natural Language Processing - NLP) là lĩnh vực giúp máy tính hiểu, diễn giải và sinh ra ngôn ngữ con người. Đây chính là nền tảng đằng sau Google Dịch, trợ lý ảo, chatbot, và đặc biệt là các mô hình ngôn ngữ lớn (LLM) như ChatGPT hay Claude mà ta sẽ học ở bài tiếp theo.
Trong bài này, chúng ta sẽ đi từ những kỹ thuật cổ điển (đếm từ) đến các ý tưởng đột phá hiện đại (embeddings, attention, Transformer). Mục tiêu là hiểu trực giác — bạn không cần biết toán nặng, chỉ cần nắm được "tại sao" và "như thế nào".
NLP là gì và các bài toán cốt lõi
NLP không phải một bài toán duy nhất, mà là một họ các nhiệm vụ. Hiểu được các bài toán này giúp bạn nhận ra rằng phần lớn ứng dụng AI ngôn ngữ ngày nay đều là biến thể hoặc kết hợp của chúng.
Các bài toán phổ biến
- Phân loại văn bản (Text Classification): Gán nhãn cho một đoạn văn bản. Ví dụ: phân loại email là "spam" hay "không spam", phân tích cảm xúc (sentiment) của một bình luận là tích cực/tiêu cực/trung lập.
- Nhận dạng thực thể có tên (Named Entity Recognition - NER): Tìm và phân loại các "thực thể" trong văn bản — tên người, tổ chức, địa điểm, ngày tháng, số tiền. Ví dụ: trong câu "Apple ra mắt iPhone tại California năm 2007", NER sẽ nhận ra Apple (tổ chức), California (địa điểm), 2007 (thời gian).
- Dịch máy (Machine Translation): Chuyển văn bản từ ngôn ngữ này sang ngôn ngữ khác. Đây là bài toán đã thúc đẩy nhiều đột phá kiến trúc, trong đó có Transformer.
- Tóm tắt văn bản (Summarization): Rút gọn một văn bản dài thành bản ngắn giữ ý chính.
- Hỏi đáp (Question Answering): Trả lời câu hỏi dựa trên một đoạn văn bản hoặc kho kiến thức.
Điểm chung của mọi bài toán này: trước khi máy tính "làm" được gì, ta phải biến văn bản thành con số. Đó là hành trình chính của bài học này.
Tiền xử lý văn bản và Tokenization
Tiền xử lý cơ bản
Văn bản thô thường "bẩn": có chữ hoa/thường lẫn lộn, dấu câu, khoảng trắng thừa, ký tự đặc biệt. Các bước tiền xử lý cổ điển bao gồm:
- Chuẩn hóa chữ thường (lowercasing): "Hello" và "hello" được coi là một.
- Loại bỏ stop words: Các từ quá phổ biến như "là", "và", "của" đôi khi bị bỏ đi vì ít mang thông tin phân biệt (lưu ý: kỹ thuật hiện đại thường giữ lại chúng vì ngữ cảnh quan trọng).
- Stemming/Lemmatization: Đưa từ về dạng gốc ("running", "ran", "runs" → "run").
Tokenization — chia văn bản thành đơn vị
Tokenization là bước biến một chuỗi văn bản thành các "token" — những mảnh nhỏ mà mô hình xử lý. Có ba cấp độ chính:
1. Word-level (theo từ): Tách theo từ, ví dụ "Tôi yêu AI" → ["Tôi", "yêu", "AI"]. Đơn giản nhưng có vấn đề: từ vựng rất lớn, và gặp từ lạ (out-of-vocabulary) thì bó tay. Tiếng Việt còn khó hơn vì ranh giới từ không rõ ("học sinh" là một từ hay hai từ?).
2. Character-level (theo ký tự): Tách thành từng ký tự. Từ vựng nhỏ gọn, không bao giờ gặp từ lạ, nhưng chuỗi trở nên rất dài và mất ý nghĩa cấp từ.
3. Subword-level (theo từ con): Đây là cách hiện đại nhất, dung hòa hai cách trên. Thuật toán phổ biến là Byte Pair Encoding (BPE).
BPE — ý tưởng cốt lõi
BPE bắt đầu từ các ký tự đơn lẻ, rồi gộp dần các cặp ký tự/từ con xuất hiện thường xuyên nhất thành một token mới. Lặp lại nhiều lần, ta được một bộ từ vựng gồm cả từ phổ biến nguyên vẹn lẫn các mảnh từ con.
Ví dụ trực giác: từ "tokenization" có thể được tách thành ["token", "ization"]. Từ phổ biến như "the" giữ nguyên một token, còn từ hiếm như "antidisestablishmentarianism" được chia thành nhiều mảnh nhỏ quen thuộc. Nhờ vậy:
- Từ vựng có kích thước hợp lý (thường vài chục nghìn token).
- Không bao giờ gặp "từ lạ" hoàn toàn — từ mới vẫn ghép được từ các mảnh.
- Cân bằng giữa độ dài chuỗi và lượng thông tin mỗi token.
Đây chính là lý do khi dùng API của các LLM, bạn nghe nói về "token" chứ không phải "từ" — và tại sao chi phí được tính theo token.
Biểu diễn văn bản: từ đếm từ đến vector ngữ nghĩa
Sau khi có token, ta cần biến chúng thành con số. Đây là phần "linh hồn" của NLP hiện đại.
Bag-of-Words và TF-IDF — cách cổ điển
Bag-of-Words (BoW) coi mỗi văn bản như một "túi từ" — đếm xem mỗi từ xuất hiện bao nhiêu lần, bỏ qua thứ tự. Một câu trở thành một vector dài bằng kích thước từ vựng, mỗi vị trí là số lần xuất hiện của một từ.
Vấn đề: những từ phổ biến (như "là", "của") xuất hiện nhiều nhưng không đặc trưng. TF-IDF (Term Frequency - Inverse Document Frequency) khắc phục bằng cách cân nhắc: một từ quan trọng nếu nó xuất hiện nhiều trong văn bản này (TF cao) nhưng hiếm trong toàn bộ tập văn bản (IDF cao). Nhờ vậy từ "blockchain" trong một bài về tiền điện tử có trọng số cao hơn từ "và".
Nhược điểm chí mạng của cả hai: chúng không hiểu ý nghĩa. Với BoW, "tốt" và "tuyệt vời" là hai từ hoàn toàn khác nhau, không liên quan gì. Vector cũng cực kỳ thưa (sparse) và lớn.
Word Embeddings — bước nhảy vọt
Ý tưởng đột phá: thay vì biểu diễn mỗi từ bằng một vị trí rời rạc, hãy biểu diễn nó bằng một vector dày đặc (dense vector) gồm vài trăm số thực, sao cho các từ có ý nghĩa gần nhau thì vector gần nhau.
Đây là word embeddings. Mô hình nổi tiếng nhất là Word2Vec (Google, 2013). Trực giác của nó dựa trên một câu nói kinh điển trong ngôn ngữ học: "Bạn sẽ biết một từ qua những từ đi cùng nó". Word2Vec học vector cho mỗi từ bằng cách dự đoán các từ xung quanh nó trong câu. Những từ thường xuất hiện trong ngữ cảnh giống nhau (như "vua", "hoàng đế", "quân vương") sẽ có vector tương tự.
Kết quả kỳ diệu: các vector này nắm bắt được quan hệ ngữ nghĩa dưới dạng phép toán. Ví dụ kinh điển:
vector("king") - vector("man") + vector("woman") ≈ vector("queen")
Nghĩa là: lấy vector "vua", trừ đi "thành phần đàn ông", cộng vào "thành phần phụ nữ", ta gần như được vector "nữ hoàng". Tương tự Paris - France + Italy ≈ Rome. Máy tính đã học được khái niệm "giới tính", "thủ đô" mà không ai dạy trực tiếp — chỉ từ việc quan sát cách từ được dùng.
Hạn chế: một từ, một vector
Word2Vec có một điểm yếu: mỗi từ chỉ có một vector cố định, bất kể ngữ cảnh. Từ "đá" trong "hòn đá" và "đá bóng" dùng chung một vector, dù nghĩa khác hẳn. Đây là vấn đề đa nghĩa (polysemy).
Embeddings theo ngữ cảnh (Contextual Embeddings)
Các mô hình hiện đại (BERT, GPT và họ Transformer) sinh ra embeddings theo ngữ cảnh: vector của một từ thay đổi tùy theo câu chứa nó. Trong "Tôi ngồi bên bờ sông", từ "bờ" sẽ có vector khác với "Tôi gửi tiền vào ngân hàng" (trong tiếng Anh: "bank" — bờ sông vs. nhà băng). Mô hình nhìn toàn bộ câu rồi mới quyết định ý nghĩa.
Đây là một trong những lý do quan trọng nhất khiến NLP hiện đại mạnh hơn hẳn các phương pháp cũ.
Vector và độ tương đồng Cosine
Khi mọi văn bản đều là vector, làm sao đo "hai văn bản giống nhau đến mức nào"? Câu trả lời phổ biến nhất là độ tương đồng cosine (cosine similarity).
Thay vì đo khoảng cách thẳng giữa hai vector, cosine đo góc giữa chúng:
- Hai vector cùng hướng (góc 0°) → cosine = 1 → rất giống nhau.
- Hai vector vuông góc (90°) → cosine = 0 → không liên quan.
- Hai vector ngược hướng (180°) → cosine = -1 → đối lập.
Trực giác: ta quan tâm đến hướng của vector (nó "trỏ về khái niệm nào") chứ không phải độ dài. Một bài viết dài và một bài ngắn cùng nói về AI vẫn nên được coi là giống nhau, dù vector có độ lớn khác nhau. Cosine bỏ qua độ lớn, chỉ xét hướng — nên rất phù hợp để so sánh ý nghĩa.
Đây là nền tảng của tìm kiếm ngữ nghĩa mà ta sẽ bàn ở cuối bài.
Vì sao RNN hạn chế với chuỗi dài
Trước Transformer, kiến trúc thống trị NLP là Mạng nơ-ron hồi quy (Recurrent Neural Network - RNN) cùng các biến thể như LSTM, GRU.
RNN xử lý văn bản tuần tự — đọc từng token một, từ trái sang phải, và duy trì một "trạng thái ẩn" (hidden state) như một dạng trí nhớ ngắn hạn, cập nhật sau mỗi từ. Nghe hợp lý vì ngôn ngữ vốn tuần tự. Nhưng RNN có ba vấn đề lớn:
1. Quên thông tin xa (vanishing gradient): Khi câu dài, thông tin từ đầu câu bị "pha loãng" dần qua nhiều bước. Đến cuối một đoạn văn dài, mô hình gần như quên mất chủ ngữ ở đầu. Trong câu "Người phụ nữ mà tôi gặp ở hội nghị hôm qua, sau khi nói chuyện rất lâu về nhiều chủ đề khác nhau, đã đồng ý..." — mô hình phải nhớ "người phụ nữ" (số ít) để chia động từ đúng, nhưng khoảng cách quá xa.
2. Không song song hóa được: Vì phải xử lý token này xong mới sang token kế, RNN không tận dụng được sức mạnh tính toán song song của GPU. Huấn luyện chậm, khó scale lên dữ liệu khổng lồ.
3. Đường truyền thông tin dài: Để liên kết từ đầu câu với từ cuối câu, thông tin phải đi qua tất cả các bước trung gian.
Những hạn chế này đặt ra câu hỏi: liệu có cách nào để mỗi từ nhìn trực tiếp mọi từ khác, song song và không bị quên? Câu trả lời là attention.
Cơ chế Attention — trực giác
Attention (sự chú ý) là ý tưởng đơn giản nhưng mang tính cách mạng: khi xử lý một từ, hãy để mô hình tự quyết định nên "chú ý" vào những từ nào khác trong câu, và chú ý bao nhiêu.
Hãy nghĩ về cách bạn đọc câu: "Con mèo không ăn thức ăn vì nó quá no." Khi gặp từ "nó", não bạn lập tức liên hệ "nó" = "con mèo" (không phải "thức ăn"). Bạn "chú ý" mạnh vào "con mèo". Đổi câu thành "...vì nó quá cũ" thì "nó" lại trỏ về "thức ăn". Attention cho phép mô hình làm chính xác điều này.
Cách hoạt động (mức trực giác)
Với mỗi từ, mô hình tính một trọng số chú ý với mọi từ khác — như một bảng "mức độ liên quan". Từ nào liên quan nhiều thì trọng số cao. Sau đó, biểu diễn của từ hiện tại được "trộn lại" từ các từ liên quan theo trọng số đó.
Điểm mạnh vượt trội:
- Khoảng cách không còn là vấn đề: từ đầu câu và cuối câu liên hệ trực tiếp với nhau, không qua trung gian.
- Song song hóa hoàn toàn: mọi cặp từ được tính cùng lúc — hợp với GPU.
- Diễn giải được: ta có thể nhìn vào trọng số attention để hiểu mô hình đang "nhìn" vào đâu.
Kiến trúc Transformer
Năm 2017, bài báo "Attention Is All You Need" giới thiệu Transformer — kiến trúc loại bỏ hoàn toàn RNN và chỉ dựa trên attention. Đây là nền móng của hầu hết mọi LLM hiện đại, bao gồm các mô hình của Anthropic (Claude), OpenAI (GPT), Google (Gemini) và nhiều mô hình khác.
Self-Attention
Self-attention là attention áp dụng cho chính câu đầu vào: mỗi từ chú ý đến mọi từ khác trong cùng câu (kể cả chính nó). Đây là cơ chế tạo nên embeddings theo ngữ cảnh — mỗi từ "hấp thụ" thông tin từ các từ liên quan để hiểu nghĩa của mình trong ngữ cảnh cụ thể.
Transformer còn dùng multi-head attention — chạy nhiều "đầu chú ý" song song, mỗi đầu học một kiểu quan hệ khác nhau (một đầu lo về ngữ pháp, một đầu lo về quan hệ chủ-vị, v.v.).
Positional Encoding
Có một vấn đề: attention xử lý mọi từ cùng lúc nên mất thông tin thứ tự. Nhưng "chó cắn người" khác "người cắn chó"! Giải pháp là positional encoding — thêm vào mỗi token một tín hiệu mã hóa vị trí của nó trong câu. Nhờ vậy mô hình vẫn biết từ nào đứng trước, từ nào đứng sau, dù xử lý song song.
Encoder và Decoder
Transformer gốc có hai phần:
- Encoder: đọc và "hiểu" toàn bộ câu đầu vào, tạo ra biểu diễn ngữ cảnh giàu thông tin. Phù hợp cho các bài toán hiểu văn bản (phân loại, NER). Mô hình tiêu biểu: BERT.
- Decoder: sinh văn bản đầu ra từng token một, mỗi token mới dựa trên những token đã sinh. Phù hợp cho sinh văn bản. Các LLM hội thoại như GPT, Claude thuộc dòng "decoder-only".
Kết hợp cả hai (encoder-decoder) phù hợp cho dịch máy: encoder hiểu câu nguồn, decoder sinh câu đích.
Sơ đồ luồng xử lý
Vì sao Transformer thắng
Tóm lại, Transformer giải quyết cả ba điểm yếu của RNN: nắm bắt quan hệ xa tốt, song song hóa được (huấn luyện cực nhanh trên GPU), và mở rộng được lên dữ liệu khổng lồ. Chính khả năng scale này mở đường cho kỷ nguyên các mô hình ngôn ngữ lớn.
Embeddings cho tìm kiếm ngữ nghĩa và Vector Database
Giờ ta nối các mảnh lại để thấy ứng dụng thực tế quan trọng nhất hiện nay.
Tìm kiếm ngữ nghĩa (Semantic Search)
Tìm kiếm truyền thống dựa trên từ khóa: gõ "ô tô" thì không tìm được tài liệu chỉ chứa từ "xe hơi", dù cùng nghĩa. Tìm kiếm ngữ nghĩa khắc phục: ta biến cả câu truy vấn lẫn mọi tài liệu thành embeddings, rồi tìm những tài liệu có vector gần nhất (theo cosine similarity) với truy vấn. Vì "ô tô" và "xe hơi" có vector gần nhau, kết quả đúng vẫn xuất hiện.
Quy trình:
- Chia kho tài liệu thành các đoạn nhỏ (chunks).
- Dùng mô hình embedding biến mỗi đoạn thành vector, lưu lại.
- Khi có truy vấn, biến truy vấn thành vector.
- Tìm các vector tài liệu gần nhất với vector truy vấn.
Vector Database
Khi có hàng triệu vector, việc so sánh truy vấn với từng vector một sẽ quá chậm. Vector database (như Pinecone, Weaviate, Milvus, FAISS, Chroma) là cơ sở dữ liệu chuyên lưu trữ và tìm kiếm vector cực nhanh, dùng các thuật toán tìm "hàng xóm gần đúng" (Approximate Nearest Neighbor - ANN) để trả về kết quả trong mili-giây.
Bắc cầu sang RAG
Đây chính là viên gạch nền cho RAG (Retrieval-Augmented Generation) — kỹ thuật cho phép LLM "tra cứu" kiến thức bên ngoài trước khi trả lời. Quy trình RAG cơ bản: người dùng hỏi → biến câu hỏi thành embedding → tìm các tài liệu liên quan trong vector database → đưa các tài liệu đó vào ngữ cảnh của LLM → LLM trả lời dựa trên thông tin tìm được. Nhờ vậy LLM có thể trả lời dựa trên dữ liệu riêng, dữ liệu mới, mà không cần huấn luyện lại. Chúng ta sẽ tìm hiểu sâu RAG ở các bài sau.
Tóm tắt
- NLP giúp máy tính hiểu và sinh ngôn ngữ; các bài toán cốt lõi gồm phân loại, NER, dịch, tóm tắt, hỏi đáp. Bước đầu tiên luôn là biến văn bản thành con số.
- Tokenization chia văn bản thành token; BPE (subword) là chuẩn hiện đại, cân bằng giữa kích thước từ vựng và xử lý từ lạ.
- Biểu diễn văn bản tiến hóa từ Bag-of-Words/TF-IDF (đếm từ, không hiểu nghĩa) đến word embeddings (Word2Vec, vector ngữ nghĩa,
king - man + woman ≈ queen) rồi embeddings theo ngữ cảnh (vector thay đổi theo câu). - Cosine similarity đo độ giống nhau qua góc giữa vector, là nền tảng của tìm kiếm ngữ nghĩa.
- RNN xử lý tuần tự nên quên thông tin xa và không song song hóa được. Attention cho phép mỗi từ nhìn trực tiếp mọi từ khác.
- Transformer (self-attention + positional encoding + encoder/decoder) là nền móng của mọi LLM hiện đại nhờ khả năng scale.
- Embeddings + vector database tạo nên tìm kiếm ngữ nghĩa và bắc cầu sang RAG.
Tự kiểm tra
- Vì sao tokenization theo subword (BPE) được ưa chuộng hơn so với tokenization theo từ hoặc theo ký tự?
- Giải thích trực giác đằng sau phép tính
vector("king") - vector("man") + vector("woman") ≈ vector("queen"). Word embeddings đã học được điều gì? - Sự khác biệt cốt lõi giữa word embeddings cố định (như Word2Vec) và embeddings theo ngữ cảnh là gì? Cho ví dụ.
- Tại sao cosine similarity đo góc thay vì khoảng cách lại phù hợp để so sánh ý nghĩa văn bản?
- Nêu hai hạn chế của RNN khi xử lý chuỗi dài, và attention giải quyết chúng ra sao.
- Positional encoding trong Transformer giải quyết vấn đề gì mà self-attention không tự xử lý được?
Đọc tiếp
Bài viết liên quan
Phân biệt AI/ML/DL, các kiểu học máy, quy trình ML end-to-end và thuật ngữ nền tảng.
Chất lượng dữ liệu, xử lý thiếu/ngoại lai, mã hoá, chuẩn hoá, tạo đặc trưng và tránh data leakage.
Mô hình ngôn ngữ lớn hoạt động ra sao, token, context window, tham số sinh, và kỹ thuật viết prompt.
Retrieval-Augmented Generation, vector database, tool calling, agent và MCP để xây ứng dụng LLM thực tế.