Chapter 1 — LLM Foundations
Nếu bạn chỉ nhớ một thứ từ chapter này, hãy nhớ kỹ: LLM không "biết" gì cả — nó chỉ đoán token tiếp theo dựa trên pattern đã thấy trong dữ liệu huấn luyện. Tất cả những gì bạn thấy — từ trả lời thông minh đến bịa chuyện tự tin — đều là hệ quả của cơ chế đơn giản này.
1.1 — Từ NLP cũ đến LLM: chuyện gì đã xảy ra?
Bạn là dev backend, quen làm việc với JSON, SQL, gRPC — dữ liệu có cấu trúc rõ ràng. Còn ngôn ngữ tự nhiên thì hỗn loạn: từ "bank" có thể là ngân hàng, cũng có thể là bờ sông — cùng một ký tự, nghĩa hoàn toàn khác nhau tùy ngữ cảnh. Ngành NLP đã vật lộn với vấn đề này hàng chục năm.
Rồi Transformer xuất hiện và mọi thứ thay đổi mãi mãi.
Bước ngoặt: Transformer (2017)
Paper Attention Is All You Need từ Google Brain đưa ra ý tưởng đơn giản nhưng cực mạnh:
Thay vì đọc từ trái sang phải như RNN, hãy để model nhìn tất cả các từ cùng lúc và tự học xem từ nào quan trọng với từ nào — thông qua attention score.
Lấy câu: "Con mèo ngồi trên bàn, nó đang ngủ."
RNN đọc tuần tự, dễ "quên" "con mèo" khi xử lý đến chữ "nó". Transformer thì nhìn cả câu, tính attention score cao giữa "nó" và "con mèo" — nên nó hiểu "nó" đang nói về "con mèo".
Khi scale Transformer lên (hàng trăm tỷ đến nghìn tỷ parameter), những khả năng không ai lập trình sẵn bắt đầu xuất hiện: suy luận, viết code, giải toán. Đây là emergent abilities — được Paper Emergent Abilities of LLMs (Google, 2022) ghi nhận và phân tích.
| Model | Params (ước tính) | Năm | Điểm nổi bật |
|---|---|---|---|
| GPT-2 | 1.5B | 2019 | Viết text cơ bản, dễ lạc đề |
| GPT-3 | 175B | 2020 | In-context learning — cho vài ví dụ là hiểu task |
| GPT-4 / GPT-4o | ~1.8T | 2023 | Reasoning mạnh, multimodal, thi đậu bar exam |
| GPT-5.5 | Không công bố | 2026 | Reasoning & coding vượt trội |
| Claude Opus 4.7 | Không công bố | 2026 | Reasoning sâu, ít hallucination hơn |
| Gemini 3.1 Pro | Không công bố | 2026 | Context cực lớn (1M tokens) |
Giống như bạn không cần thuộc lòng TCP/IP để làm web. Nhưng nếu muốn hình dung trực quan, bài What Is ChatGPT Doing… của Stephen Wolfram vẫn là bài giải thích LLM hay nhất cho engineer.
1.2 — Token: đơn vị nhỏ nhất mà LLM "nhìn thấy"
Đây là phần gây nhầm lẫn nhiều nhất với dev mới vào AI.
LLM không đọc chữ, không đọc từ — nó đọc token.
Token có thể là một từ hoàn chỉnh (hello), một phần từ (un + happiness), hoặc thậm chí dấu cách và dấu câu. Mỗi model family có tokenizer riêng — GPT dùng tiktoken, Claude dùng tokenizer tương tự.
Tiếng Việt vẫn "đắt" hơn tiếng Anh
Tokenizer được train chủ yếu trên dữ liệu tiếng Anh, nên tiếng Việt (và nhiều ngôn ngữ không phải Latin) thường tốn gấp 1.8–2.2 lần token. Đến 2026, tình hình đã tốt hơn nhờ tokenizer cải tiến và nhiều model multilingual hơn, nhưng chênh lệch vẫn rõ rệt. Bài All Languages Are Not Created (Tokenized) Equal phân tích chi tiết.
| Text | Tokens (ước tính) | Chi phí tương đối |
|---|---|---|
| "Hello, how are you?" | ~6 | 1x |
| "Xin chào, bạn khỏe không?" | ~11–14 | ~1.8–2.2x |
Bài học thực tế: Khi build sản phẩm cho user Việt Nam, nhân hệ số 1.8–2.2 vào ước tính token budget và chi phí.
BPE — tokenizer hoạt động thế nào?
Hầu hết model dùng Byte Pair Encoding (BPE). Ý tưởng đơn giản: bắt đầu từ từng ký tự đơn lẻ, rồi dần gộp những cặp hay xuất hiện cùng nhau thành token lớn hơn. Đọc thêm tại Hugging Face Tokenizer Summary.
Tại sao token count quan trọng với bạn?
| Ảnh hưởng thực tế | Ghi chú 2026 | |
|---|---|---|
| 💰 Cost | Tính theo input + output tokens | Kiểm tra pricing mới nhất tại trang docs của từng provider |
| ⏱️ Latency | Output càng dài càng chờ lâu | Dùng max_tokens hợp lý để kiểm soát |
| 📏 Context limit | Vượt giới hạn → input bị cắt hoặc lỗi | Xem bảng context window ở mục 1.3 |
🧪 Lab 1: Tự tay đếm token
Ch ạy thử rồi quan sát: tiếng Việt tốn bao nhiêu token so với tiếng Anh? Từ nào bị tách ra nhiều mảnh nhất?
# pip install tiktoken
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")
texts = [
"Hello, how are you?",
"Xin chào, bạn khỏe không?",
"The quick brown fox jumps over the lazy dog",
"Con cáo nâu nhanh nhẹn nhảy qua con chó lười",
]
for text in texts:
tokens = enc.encode(text)
decoded = [enc.decode([t]) for t in tokens]
print(f"[{len(tokens):2d} tokens] {text}")
print(f" → {decoded}\n")
Vào OpenAI Tokenizer để thấy mỗi token được highlight bằng màu khác nhau — rất trực quan.
1.3 — Temperature, top-p, và context window
Context window: "bàn làm việc" của model
Context window là tổng số token model có thể "nhìn thấy" cùng lúc — bao gồm system prompt, lịch sử chat, input hiện tại, và cả phần output đang được sinh ra.
| Model | Context window | Tương đương khoảng |
|---|---|---|
| GPT-5.5 | 256K – 1M | Hàng trăm đến nghìn trang |
| Claude Sonnet 4.6 | 200K (1M ở một số tier) | ~500 trang sách |
| Claude Opus 4.7 | 1M | Phù hợp phân tích tài liệu lớn |
| Gemini 3.1 Pro | 1M | Vua context dài hiện nay |
Context lớn nghe hấp dẫn, nhưng có một gotcha quan trọng: paper Lost in the Middle (Stanford, 2023) chỉ ra rằng model thường nhớ tốt phần đầu và cuối, nhưng dễ bỏ sót thông tin ở giữa. Nên nếu bạn đưa tài liệu dài vào prompt, hãy đặt thông tin quan trọng nhất ở đầu hoặc cuối.
Temperature: "núm vặn" quan trọng nhất
Temperature quyết định độ ngẫu nhiên khi model chọn token tiếp theo. Đây là tham số bạn sẽ chỉnh nhiều nhất mỗi ngày.
Cheat sheet chọn temperature — theo OpenAI Best Practices:
| Bạn đang làm gì | Temperature | Tại sao |
|---|---|---|
| Extract JSON từ text | 0.0 | Cần output cố định, không "sáng tạo" |
| Viết code | 0.0 – 0.2 | Code cần chính xác |
| Viết email / marketing copy | 0.7 – 0.9 | Cần đa dạng, tránh lặp |
| Brainstorm ý tưởng | 1.0 – 1.3 | Càng bất ngờ càng tốt |
Top-p (Nucleus Sampling)
Top-p là cách khác để kiểm soát độ random, được giới thiệu trong paper The Curious Case of Neural Text Degeneration. top_p=0.9 nghĩa là model chỉ xét tập token chiếm 90% xác suất cao nhất, bỏ phần đuôi ít khả năng.
Thực tế: Bạn hầu như chỉ cần chỉnh temperature. OpenAI khuyến cáo không nên chỉnh cả hai cùng lúc.
🧪 Lab 2: Temperature ảnh hưởng output thế nào?
from openai import OpenAI
client = OpenAI()
prompt = "Viết một câu slogan cho quán cà phê Việt Nam."
for temp in [0.0, 0.5, 1.0, 1.5]:
print(f"\n{'='*50}")
print(f"Temperature = {temp}")
print('='*50)
for i in range(3):
r = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=temp,
max_tokens=50,
)
print(f" [{i+1}] {r.choices[0].message.content}")
Quan sát: Ở temp=0.0, 3 lần có ra giống nhau không? Ở temp=1.5, output còn có nghĩa không?
1.4 — Hallucination: bug mặc định của LLM
Đây là phần quan trọng nhất trong chapter này.
LLM không "biết" — nó "đoán"
Cốt lõi của mọi LLM: cho chuỗi token đầu vào, dự đoán token tiếp theo có xác suất cao nhất. Nó không tra cứu cơ sở dữ liệu. Nó không Google. Nó chỉ nhìn vào pattern trong training data rồi predict.
Câu trên đúng vì "Hà Nội" xuất hiện cực nhiều trong training data. Nhưng khi hỏi thứ ít phổ biến hơn:
Hỏi: "Ai viết cuốn 'Lịch sử AI tại Việt Nam' năm 2019?"
Model trả lời (rất tự tin): "Cuốn sách được viết bởi GS. Nguyễn Văn A, xuất bản bởi NXB Khoa học Kỹ thuật."
Sự thật: Cuốn s ách này không tồn tại. Model bịa ra tên tác giả, nhà xuất bản, và cả cuốn sách.
LLM không bao giờ nói "tôi không biết". Nó luôn generate một câu trả lời — và câu bịa trông y hệt câu thật. Không có error code, không có warning, không có stack trace. Paper A Survey on Hallucination in LLMs (2023) phân loại chi tiết các dạng và nguyên nhân.
4 loại hallucination bạn sẽ gặp
| Loại | Model bịa cái gì | Mức nguy hiểm |
|---|---|---|
| Fabrication | Sự kiện, người, tài liệu chưa từng tồn tại | 🔴 Rất cao |
| Inaccuracy | Tên đúng nhưng số liệu/ngày tháng sai | 🟠 Cao |
| Outdated | Đúng theo data cũ, nhưng thực tế đã thay đổi | 🟡 Trung bình |
| Inconsistency | Nói A ở đoạn trên, nói ngược lại ở đoạn dưới | 🟡 Trung bình |
Preview: Cách giảm hallucination
Bạn sẽ học kỹ ở các chapter sau. Đây là roadmap nhanh:
1.5 — Gọi API đầu tiên
Lý thuyết đủ rồi. Hãy code.
Setup
Cài một trong hai (hoặc cả hai). Docs chính thức: OpenAI Quickstart, Anthropic Getting Started.
pip install openai anthropic
export OPENAI_API_KEY="sk-..."
export ANTHROPIC_API_KEY="sk-ant-..."
Model khuyến nghị cho người mới (kiểm tra OpenAI Models, Anthropic Models để có tên mới nhất):
| Mục đích | Gợi ý |
|---|---|
| Học và thử nghiệm (rẻ) | Model "mini" / "flash" / "haiku" của provider bạn chọn |
| Chất lượng cân bằng | claude-sonnet-4-6, gpt-4o-mini |
| Reasoning mạnh | claude-opus-4-7, gpt-5.5 |
| Context siêu d ài | gemini-3.1-pro-preview |
3 roles bạn cần biết
Mọi LLM API đều dùng 3 roles:
- system — instruction ngầm, user không thấy. Đặt persona, constraints ở đây.
- user — tin nhắn từ người dùng.
- assistant — response model. Khi truyền history, bạn xen kẽ
user/assistant.
🧪 Lab 3: Hello, LLM!
OpenAI (API Reference):
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini", # đổi thành model bạn muốn thử
messages=[
{"role": "system", "content": "Bạn là trợ lý AI. Trả lời ngắn gọn bằng tiếng Việt."},
{"role": "user", "content": "Token trong LLM là gì? Giải thích trong 2 câu."}
],
temperature=0.3,
max_tokens=200,
)
print(response.choices[0].message.content)
print(f"\nInput: {response.usage.prompt_tokens} tokens")
print(f"Output: {response.usage.completion_tokens} tokens")
Anthropic (API Reference):
import anthropic
client = anthropic.Anthropic()
message = client.messages.create(
model="claude-sonnet-4-6", # đổi thành model bạn muốn thử
max_tokens=200,
system="Bạn là trợ lý AI. Trả lời ngắn gọn bằng tiếng Việt.",
messages=[
{"role": "user", "content": "Token trong LLM là gì? Giải thích trong 2 câu."}
],
)
print(message.content[0].text)
print(f"\nInput: {message.usage.input_tokens} tokens")
print(f"Output: {message.usage.output_tokens} tokens")
Streaming: output "chảy ra" real-time
Thay vì đợi model generate xong rồi trả hết, streaming cho bạn từng chunk ngay khi model viết — giống ChatGPT hiện chữ chạy. Chi tiết tại OpenAI Streaming Guide.
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Kể chuyện ngắn về AI"}],
stream=True,
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
Khi nào dùng streaming? Chatbot, UI cần phản hồi tức thì — dùng. API backend xử lý batch, cần parse full JSON response — không cần.
Tổng kết Chapter 1
5 điều mang về:
-
LLM đọc token, không đọc từ. Tiếng Việt tốn gấp ~1.8–2.2x tiếng Anh — nhân hệ số này vào mọi ước tính chi phí và context budget.
-
Temperature là tham số bạn dùng nhiều nhất.
0cho extraction/code,0.7+cho creative. Đừng động vàotop_ptrừ khi bạn biết tại sao. -
Context window ngày càng lớn, nhưng model vẫn "lơ đãng ở giữa". Đặt thông tin quan trọng ở đầu hoặc cuối.
-
Hallucination là bug mặc định. LLM luôn trả lời, kể cả khi bịa hoàn toàn. Không có error code. Luôn verify output quan trọng.
-
API cực kỳ đơn giản.
messagesarray + vài param. Bắt đầu với model "mini" để giảm chi phí khi học.
Checkpoint — Tự kiểm tra
- Chạy Lab 1 — "Xin chào bạn" được tokenize thành bao nhiêu token? Có khớp với hệ số 1.8–2.2x không?
- Chạy Lab 2 —
temperature=0.0có cho output giống nhau hoàn toàn qua 3 lần gọi không? - Giải thích hallucination cho một người không biết AI — không dùng thuật ngữ kỹ thuật.
- Bạn đang build một chatbot hỗ trợ khách hàng, cần trả lời về chính sách hoàn tiền. Hallucination loại nào nguy hiểm nhất ở đây? Bạn sẽ dùng kỹ thuật gì để giảm thiểu?
Đọc thêm & Học thêm
Tài liệu tham khảo
| Tài liệu | Loại | Tại sao nên đọc |
|---|---|---|
| What Is ChatGPT Doing… | Blog | Giải thích LLM trực quan nhất cho engineer |
| Attention Is All You Need | Paper | Paper gốc Transformer — đọc abstract + section 3 là đủ |
| Lost in the Middle | Paper | Giới hạn thực tế của context window dài |
| A Survey on Hallucination | Paper | Phân loại và nguyên nhân hallucination |
| OpenAI Tokenizer | Tool | Visualize token ngay trên browser |
| All Languages Are Not Created (Tokenized) Equal | Blog | Phân tích token cost giữa các ngôn ngữ |