Chuyển tới nội dung chính

Chapter 1 — LLM Foundations

Phase 1

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, đ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ó""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.

ModelParams (ước tính)NămĐiểm nổi bật
GPT-21.5B2019Viết text cơ bản, dễ lạc đề
GPT-3175B2020In-context learning — cho vài ví dụ là hiểu task
GPT-4 / GPT-4o~1.8T2023Reasoning mạnh, multimodal, thi đậu bar exam
GPT-5.5Không công bố2026Reasoning & coding vượt trội
Claude Opus 4.7Không công bố2026Reasoning sâu, ít hallucination hơn
Gemini 3.1 ProKhông công bố2026Context cực lớn (1M tokens)
Bạn không cần hiểu hết toán Transformer

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.

TextTokens (ước tính)Chi phí tương đối
"Hello, how are you?"~61x
"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
💰 CostTính theo input + output tokensKiểm tra pricing mới nhất tại trang docs của từng provider
⏱️ LatencyOutput càng dài càng chờ lâuDùng max_tokens hợp lý để kiểm soát
📏 Context limitVượt giới hạn → input bị cắt hoặc lỗiXem 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")
Không muốn code? Thử online

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.

ModelContext windowTương đương khoảng
GPT-5.5256K – 1MHàng trăm đến nghìn trang
Claude Sonnet 4.6200K (1M ở một số tier)~500 trang sách
Claude Opus 4.71MPhù hợp phân tích tài liệu lớn
Gemini 3.1 Pro1MVua 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ìTemperatureTại sao
Extract JSON từ text0.0Cần output cố định, không "sáng tạo"
Viết code0.0 – 0.2Code cần chính xác
Viết email / marketing copy0.7 – 0.9Cần đa dạng, tránh lặp
Brainstorm ý tưởng1.0 – 1.3Cà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.

Tại sao đây là vấn đề lớn với engineer

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ạiModel bịa cái gìMức nguy hiểm
FabricationSự kiện, người, tài liệu chưa từng tồn tại🔴 Rất cao
InaccuracyTê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
InconsistencyNó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 đíchGợ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ằngclaude-sonnet-4-6, gpt-4o-mini
Reasoning mạnhclaude-opus-4-7, gpt-5.5
Context siêu dàigemini-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ề:

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

  2. Temperature là tham số bạn dùng nhiều nhất. 0 cho extraction/code, 0.7+ cho creative. Đừng động vào top_p trừ khi bạn biết tại sao.

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

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

  5. API cực kỳ đơn giản. messages array + 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.0 có 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ệuLoạiTại sao nên đọc
What Is ChatGPT Doing…BlogGiải thích LLM trực quan nhất cho engineer
Attention Is All You NeedPaperPaper gốc Transformer — đọc abstract + section 3 là đủ
Lost in the MiddlePaperGiới hạn thực tế của context window dài
A Survey on HallucinationPaperPhân loại và nguyên nhân hallucination
OpenAI TokenizerToolVisualize token ngay trên browser
All Languages Are Not Created (Tokenized) EqualBlogPhân tích token cost giữa các ngôn ngữ

Khóa học khuyến nghị cho Software Engineer

Nếu muốn đào sâu hơn song song với lộ trình này:

Khóa họcNơi họcPhù hợp nhất
LLM CourseHugging FaceMiễn phí, thực hành cực tốt, rất phù hợp dev
Generative AI with LLMsCoursera / DeepLearning.AINền tảng lý thuyết vững
ChatGPT Prompt Engineering for DevelopersDeepLearning.AIBắt đầu nhanh, 1–2 giờ là xong

Tiếp theo: Chapter 2 — LLM Abilities & Limitations →