Bỏ qua để đến nội dung

🤖 Generative AI

Bạn đã bao giờ tự hỏi: “Chuyện gì xảy ra từ khi tôi gõ prompt đến lúc AI trả lời?” Bài viết này sẽ giải thích chi tiết toàn bộ quá trình đó.

📚 Bài viết liên quan:


Generative AI (GenAI) là các hệ thống AI có khả năng tạo ra nội dung mới (text, image, audio, code, video) thay vì chỉ phân loại hoặc dự đoán.

AI Truyền thống (Discriminative):
Input: "Con vật này là gì?" + [hình con mèo]
Output: "Đây là con mèo" (phân loại)
Generative AI:
Input: "Viết bài thơ về con mèo"
Output: "Chú mèo lười biếng nằm hong nắng sớm,
Đôi mắt xanh ngọc lấp lánh hồn nhiên..." (tạo mới)
Loại Mô tả Ví dụ
LLM (Large Language Model) Sinh văn bản GPT-5, Gemini 3, Claude 4.5
Image Generation Sinh hình ảnh DALL-E 3, Midjourney, Imagen 3
Audio/Voice Sinh âm thanh/giọng nói ElevenLabs, Suno
Video Generation Sinh video Sora, Runway Gen-3
Code Generation Sinh code GitHub Copilot, Cursor

GenAI học thông qua một quá trình gọi là Self-Supervised Learning (Học tự giám sát).

Mục tiêu đào tạo: Dự đoán từ tiếp theo

Phần tiêu đề “Mục tiêu đào tạo: Dự đoán từ tiếp theo”

Model được huấn luyện với hàng nghìn tỷ tokens từ internet, sách, code, Wikipedia…

Training Data: "The cat sat on the ___"
Model học:
- "mat" ← xác suất cao (câu phổ biến)
- "roof" ← xác suất trung bình (hợp lý)
- "airplane" ← xác suất thấp (ít logic)
- "xyzabc" ← xác suất ~0 (vô nghĩa)

Token là đơn vị nhỏ nhất mà model xử lý. Không phải 1 từ = 1 token!

# Tokenization ví dụ (tiếng Anh)
"Hello, world!"["Hello", ",", " world", "!"] # 4 tokens
# Tiếng Việt tốn nhiều token hơn
"Xin chào Việt Nam"["X", "in", " ch", "ào", " Việt", " Nam"] # ~6-7 tokens

💡 Quy tắc nhanh:

  • Tiếng Anh: 1 token ≈ 0.75 từ
  • Tiếng Việt: 1 từ ≈ 1.5-2 tokens
  • Code: Mỗi dấu ngoặc, space đều tính riêng
graph LR
A[Pre-training] --> B[Fine-tuning]
B --> C[RLHF]
A1["Học ngôn ngữ<br/>từ internet"] --> A
B1["Học theo dõi<br/>instruction"] --> B
C1["Học từ feedback<br/>của con người"] --> C
Giai đoạn Mục đích Dữ liệu
Pre-training Học cấu trúc ngôn ngữ, kiến thức chung Terabytes text từ internet
Fine-tuning Học làm theo hướng dẫn (instruction) Dataset Q&A được chuẩn bị
RLHF Học phản hồi an toàn, hữu ích Human feedback/ratings

Hầu hết GenAI hiện đại đều dựa trên kiến trúc Transformer (giới thiệu 2017 bởi Google).

flowchart TD
subgraph TRANSFORMER["🧠 TRANSFORMER"]
direction TB
ATT["🎯 Self-Attention Layers<br/>Từ này liên quan đến từ nào?"]
FF["⚙️ Feed-Forward Networks<br/>Xử lý thông tin đã học"]
OUT["📊 Output Probabilities<br/>Từ tiếp theo khả năng nhất?"]
ATT --> FF --> OUT
end
INPUT["📥 Input Embeddings"] --> TRANSFORMER
TRANSFORMER --> NEXT["📤 Next Token"]
style TRANSFORMER fill:#e3f2fd,stroke:#1976d2
style ATT fill:#fff3e0,stroke:#ff9800
style FF fill:#e8f5e9,stroke:#4caf50
style OUT fill:#f3e5f5,stroke:#9c27b0

Self-Attention cho phép model hiểu được mối quan hệ giữa các từ trong câu.

Câu: "Con mèo đuổi con chuột vì nó đói"
Attention tập trung:
"nó" → attention cao đến "mèo" (không phải "chuột")
Vì model học được rằng:
- "mèo đuổi" → mèo là chủ thể hành động
- "vì nó đói" → "đói" thường gắn với kẻ săn mồi

🎯 Tại sao Attention quan trọng?

Trước Transformer, các model RNN/LSTM xử lý tuần tự từng từ → Quên thông tin ở đầu câu.

Transformer với Attention có thể nhìn toàn bộ câu cùng lúc → Hiểu context tốt hơn, train nhanh hơn (parallel).


4. Inference Pipeline: Từ Prompt đến Response

Phần tiêu đề “4. Inference Pipeline: Từ Prompt đến Response”

Đây là phần quan trọng nhất! Hãy theo dõi hành trình của prompt.

Prompt của bạn được chia thành tokens.

# Input
prompt = "Giải thích đệ quy trong Python"
# Tokenization
tokens = ["Gi", "ải", " th", "ích", " đ", "", " quy", " trong", " Python"]
# → Vector IDs: [15234, 892, 1023, 456, 227, 1891, 7823, 234, 12892]

Mỗi token ID được chuyển thành vector số (embedding) trong không gian nhiều chiều.

Token "Python" → [0.23, -0.67, 0.91, ..., 0.12] (768-4096 chiều)
Các từ có nghĩa tương tự sẽ có vector gần nhau:
- "Python" ↔ "Java" ↔ "JavaScript" → Gần nhau
- "Python" ↔ "apple" → Xa nhau

Embeddings đi qua nhiều lớp Transformer (GPT-4 có ~120 layers).

flowchart TD
INPUT["📥 Input Embeddings"] --> L1
subgraph Layers["🧠 Transformer Layers"]
L1["Layer 1<br/>Attention + Processing"]
L2["Layer 2<br/>Deeper understanding"]
LN["Layer N<br/>Final representation"]
L1 --> L2 --> |"..."| LN
end
LN --> OUTPUT["📊 Output Logits"]
style Layers fill:#e3f2fd,stroke:#1976d2
style INPUT fill:#e8f5e9,stroke:#4caf50
style OUTPUT fill:#f3e5f5,stroke:#9c27b0

Model sinh từng token một, mỗi lần chọn token có xác suất cao nhất.

Prompt: "Đệ quy là"
Bước 1: "Đệ quy là" → P(kỹ)=0.7, P(một)=0.2 → Chọn "kỹ"
Bước 2: "Đệ quy là kỹ" → P(thuật)=0.9 → Chọn "thuật"
Bước 3: "Đệ quy là kỹ thuật" → P(lập)=0.6 → Chọn "lập"
...
Cho đến khi: Token <END> hoặc max_tokens
graph TD
A["💬 Prompt<br/>'Giải thích đệ quy'"] --> B["🔤 Tokenizer<br/>Chia text → tokens"]
B --> C["🔢 Embedding<br/>Tokens → vectors"]
C --> D["🧠 Transformer<br/>120+ layers xử lý"]
D --> E["📊 Logits<br/>Xác suất từng token"]
E --> F["🎲 Sampling<br/>Chọn token tiếp theo"]
F --> G{"Token = END?"}
G -->|No| D
G -->|Yes| H["✅ Response hoàn chỉnh"]

5. Non-Determinism: Tại sao câu trả lời không giống nhau?

Phần tiêu đề “5. Non-Determinism: Tại sao câu trả lời không giống nhau?”

Nếu chạy cùng 1 prompt 10 lần, bạn có thể nhận được 10 câu trả lời khác nhau. Tại sao?

Temperature điều chỉnh độ “sáng tạo” của model.

Temperature = 0 (Deterministic)
→ Luôn chọn token xác suất CAO NHẤT
→ Câu trả lời giống nhau mọi lần
→ Dùng cho: Coding, Math, Facts
Temperature = 1 (Creative)
→ Chọn ngẫu nhiên theo phân phối xác suất
→ Câu trả lời đa dạng
→ Dùng cho: Creative writing, Brainstorming

Ví dụ trực quan:

Prompt: "Viết một từ mô tả bầu trời"
Token probabilities:
"xanh" = 40%
"trong" = 25%
"đẹp" = 15%
"cao" = 10%
"rộng" = 10%
Temperature=0: Luôn chọn "xanh" (40%)
Temperature=0.7: Thường "xanh", đôi khi "trong" hoặc "đẹp"
Temperature=1.5: Có thể chọn bất kỳ từ nào

Top-P giới hạn pool các tokens được xem xét.

Top-P = 0.9 nghĩa là:
→ Chỉ xem xét các token có tổng xác suất = 90%
→ Loại bỏ các tokens "đuôi" ít khả năng
Ví dụ:
Tokens: xanh(40%) + trong(25%) + đẹp(15%) + cao(10%) = 90%
→ Loại bỏ: "rộng" (10% còn lại)
→ Giảm khả năng sinh text "lạ"

Top-K giới hạn số lượng tokens được xem xét.

Top-K = 3 nghĩa là:
→ Chỉ xem xét 3 tokens có xác suất cao nhất
→ Đơn giản hơn Top-P
Ví dụ: Chỉ chọn trong ["xanh", "trong", "đẹp"]
Tham số Giá trị thấp Giá trị cao Dùng khi
Temperature 0-0.3: Chính xác, lặp lại 0.7-1.5: Sáng tạo, đa dạng Code → thấp; Story → cao
Top-P 0.1: Rất hạn chế 0.9-1.0: Linh hoạt Thường dùng 0.9-0.95
Top-K 1-10: Ít lựa chọn 50-100: Nhiều lựa chọn Thường dùng 40-50

Đây là câu hỏi hay nhất! Tại sao GPT/Gemini/Claude thường đưa ra câu trả lời “có vẻ đúng”?

Lý do 1: Học từ lượng dữ liệu khổng lồ

Phần tiêu đề “Lý do 1: Học từ lượng dữ liệu khổng lồ”
GPT-4 pre-training: ~13 trillion tokens
≈ 10 triệu cuốn sách
≈ Toàn bộ Wikipedia x1000
≈ Hàng triệu code repositories

Model đã “đọc” hầu hết những gì con người viết!

Transformer với Self-Attention cực kỳ giỏi nhận diện patterns.

Pattern học được:
"X là Y vì Z" → Cấu trúc giải thích
"Bước 1... Bước 2..." → Cấu trúc hướng dẫn
"def function_name(params):" → Cấu trúc Python
→ Khi bạn hỏi "Giải thích X", model tự động dùng pattern giải thích!

Một giả thuyết thú vị: Nén hiệu quả = Hiểu sâu

Để dự đoán từ tiếp theo chính xác, model PHẢI hiểu:
- Grammar (ngữ pháp)
- Facts (kiến thức)
- Logic (suy luận)
- Context (ngữ cảnh)
→ "Nén" terabytes text vào model GB = Phải "hiểu" để nén!

Lý do 4: RLHF - Học từ phản hồi con người

Phần tiêu đề “Lý do 4: RLHF - Học từ phản hồi con người”
Giai đoạn RLHF:
Human: "Câu trả lời A tốt hơn B"
Model: Cập nhật weights để ưu tiên kiểu A
→ Model học được style trả lời "thuyết phục"
→ Câu văn mạch lạc, có cấu trúc, giải thích từng bước

⚠️ Cảnh báo: “Thuyết phục” ≠ “Đúng”

Phần tiêu đề “⚠️ Cảnh báo: “Thuyết phục” ≠ “Đúng””
Model có thể tự tin nói sai!
Ví dụ:
Q: "Ai phát minh ra điện thoại?"
A: "Thomas Edison phát minh ra điện thoại vào năm 1876."
→ Câu trả lời rất tự tin
→ Nhưng SAI! (Alexander Graham Bell mới đúng)
Đây gọi là "Hallucination"

⚠️ Luôn verify thông tin quan trọng! GenAI giỏi tổng hợp và trình bày, nhưng có thể “bịa” sự thật.


Prompt tốt = Output tốt. Đây là một số kỹ thuật cơ bản.

Không cần ví dụ, chỉ cần instruction rõ ràng.

❌ "Phân loại sentiment"
✅ "Phân loại sentiment của câu sau thành 'positive', 'negative', hoặc 'neutral':
'Sản phẩm này tuyệt vời!'"

Cho vài ví dụ trước khi hỏi.

Ví dụ 1: "Tôi yêu món này!" → positive
Ví dụ 2: "Chất lượng tệ quá" → negative
Ví dụ 3: "Giao hàng bình thường" → neutral
Bây giờ phân loại: "Sẽ mua lại lần nữa!"
→ positive

Yêu cầu model giải thích từng bước.

❌ "25 x 17 = ?"
✅ "Tính 25 x 17. Giải thích từng bước."
Output:
"Bước 1: 25 x 10 = 250
Bước 2: 25 x 7 = 175
Bước 3: 250 + 175 = 425
Đáp án: 425"

Đặt vai trò và quy tắc cho model.

system = """Bạn là trợ lý lập trình Python.
Quy tắc:
- Luôn thêm type hints
- Viết docstring theo Google style
- Giải thích logic trước khi code"""
user = "Viết hàm tính giai thừa"

  1. Truy cập Google AI Studio
  2. Dùng prompt: “Viết 1 câu mô tả buổi sáng”
  3. Thử với Temperature: 0, 0.5, 1.0, 1.5
  4. Quan sát sự khác biệt
  1. Truy cập OpenAI Tokenizer
  2. So sánh số tokens:
    • “Hello world” vs “Xin chào thế giới”
    • def calculate(x): vs function calculate(x) { }

Hỏi model 1 câu logic phức tạp với và không có CoT:

❌ "A có 5 quả táo, cho B 2 quả, B cho lại A 1 quả. Hỏi A có mấy quả?"
✅ "A có 5 quả táo, cho B 2 quả, B cho lại A 1 quả.
Hãy tính từng bước và cho biết A có mấy quả?"

Khái niệm Ý nghĩa
Generative AI AI tạo nội dung mới (text, image, code…)
Transformer Kiến trúc với Self-Attention, nền tảng của LLM
Token Đơn vị nhỏ nhất model xử lý
Inference Quá trình từ prompt → response
Temperature Điều chỉnh độ sáng tạo (0 = chính xác, 1+ = sáng tạo)
Top-P/Top-K Giới hạn pool tokens được xem xét
Prompting Nghệ thuật viết instruction hiệu quả

Bài tiếp theo: Context Window - Hiểu về giới hạn tokens và cách tối ưu.