Nhiều năm trước, một nhóm bạn chơi một trò vớ vẩn: cầm điện thoại, chỉ dùng các từ gợi ý từ autocomplete để gõ một tin nhắn gửi bạn. Mở iMessage, gõ "I", để bàn phím đề xuất 3 từ, chọn 1 trong 3...
- Xây bằng tay một mô hình dự đoán token đơn giản (Markov chain) từ 5 tin nhắn — hiểu "training" và "sampling" là gì
- Giải thích transition matrix là gì và tại sao normalize row cho ra xác suất "next token"
- Thực hiện sampling với các strategies khác nhau (greedy, random, temperature, top-k) — chính là các "knob" của Claude
- Kết nối Markov chain (1906) với modern LLM (transformer 2017) — cùng một nguyên lý, khác ở cách compute distribution
Phần 1: Training bằng tay (7 phút)
Dataset của chúng ta: 5 tin nhắn
Bước 1: Đếm các "bigram" (cặp từ liền nhau)
Với mỗi tin nhắn, ghi lại cặp (word A → word B). Ví dụ từ tin 1:
Hãy làm cho cả 5 tin nhắn. Có thể bạn muốn mở một tờ giấy và tự làm. Đây là kết quả:
Đây gọi là frequency table (bảng tần suất). Bạn vừa train một model.
Bước 2: Chuẩn hóa thành xác suất
Cho mỗi word A, tính xác suất của mỗi word B nó có thể đi tiếp:
Từ "i":
- i → think
- think → we
- we → should
- should → probably
- probably → ship
- ship → it
| From → To | Count |
|---|---|
| i → think | 3 |
| think → we | 2 |
| think → that | 1 |
| we → should | 3 |
| should → probably | 2 |
| should → check | 1 |
| probably → ship | 1 |
| probably → wait | 1 |
| ship → it | 1 |
| that → sounds | 2 |
| sounds → good | 2 |
| good → to | 1 |
| to → me | 1 |
| check → with | 1 |
| with → the | 1 |
| the → team | 1 |
1. "i think we should probably ship it"
2. "i think that sounds good"
3. "i think we should probably wait"
4. "we should check with the team"
5. "that sounds good to me"Bước 2: Chuẩn hóa thành xác suất
Từ "think":
i → think = 3/3 = 100% (i luôn theo bởi think)Phần 1: Training bằng tay (7 phút) (tiếp)
Từ "we":
think → we = 2/3 ≈ 67%
think → that = 1/3 ≈ 33%Phần 1: Training bằng tay (7 phút) (tiếp)
Từ "should":
we → should = 3/3 = 100%Phần 1: Training bằng tay (7 phút) (tiếp)
Từ "probably":
should → probably = 2/3 ≈ 67%
should → check = 1/3 ≈ 33%Phần 1: Training bằng tay (7 phút) (tiếp)
Cứ thế cho mọi word. Đây là transition matrix — tim của Markov chain.
┌─────────────────────────────────────────────────┐ │ │ │ TRANSITION MATRIX │ │ │ │ To: think we should that probably │ │ From: │ │ i 1.00 │ │ think .67 .33 │ │ we 1.00 │ │ should .67 │ │ probably │ │ ... │ │ │ └─────────────────────────────────────────────────┘
probably → ship = 1/2 = 50%
probably → wait = 1/2 = 50%Phần 2: Sampling bằng tay (7 phút)
Bây giờ, dùng matrix bạn vừa train, hãy sinh ra một tin nhắn mới.
Sampling step by step
Bắt đầu với "i". Xem matrix: i → think với xác suất 100%.
Tiếp, xem row "think": think → we (67%) hoặc think → that (33%).
Word 1: i
Next options: {think: 100%}
Pick: think
Current: "i think"Sampling step by step
Tiếp, we → should (100%).
Word 2: think
Next options: {we: 67%, that: 33%}
Pick: (random, weighted) → we
Current: "i think we"Phần 2: Sampling bằng tay (7 phút) (tiếp)
Tiếp, should → probably (67%) hoặc should → check (33%).
Word 3: we → should
Current: "i think we should"Phần 2: Sampling bằng tay (7 phút) (tiếp)
Tiếp, probably → ship (50%) hoặc probably → wait (50%).
Word 4: should → probably (giả sử pick probably)
Current: "i think we should probably"Phần 2: Sampling bằng tay (7 phút) (tiếp)
Đây là tin 3 trong training data — model đã reproduce exactly.
Nhưng đôi khi nó sinh ra tin mới
Chạy lại, nếu ở bước "should" ta pick "check" thay vì "probably":
Word 5: probably → wait
Current: "i think we should probably wait"Nhưng đôi khi nó sinh ra tin mới
Đây không phải tin nào trong 5 tin training — nhưng lại là một tin hoàn toàn hợp lý. Model đã "học" đủ về cách gộp các từ với nhau.
Hai thuật ngữ quan trọng bạn vừa làm
- Sampling: hành động pick next word dựa vào distribution đã tính. Thuật ngữ này giữ nguyên cho mọi model hiện đại, bao gồm Claude.
- Context: từ (hoặc các từ) bạn đang look up trong matrix. Ở Markov bigram, context chỉ là 1 từ. Ở Claude, context là toàn bộ hội thoại đến thời điểm này.
i think we should check with the teamPhần 3: Scale up (3 phút)
5 tin nhắn cho bạn một matrix nhỏ với ít lựa chọn. Điều gì xảy ra với nhiều hơn?
Nhiều data hơn → distributions mịn hơn, contexts đa dạng hơn, output hợp lý hơn.
Thí nghiệm suy nghĩ
Nếu matrix của bạn train từ 100 tin nhắn của chính bạn, bạn sẽ thấy giọng mình trong output — vì sampling theo patterns của bạn. Đó là "Me-bot" của trò chơi teen.
5 messages → 17 unique words, 13 contexts, 24 transitions
50 messages → ~100 unique words, 80 contexts, 300+ transitions
500 messages → ~1000 unique words, richer distributions
5,000 messages → ~10,000 words, rare combinations begin to appear
...
5,000,000 messages → SwiftKey / QuickType (phone autocomplete)Phần 4: Các "knobs" — Sampling strategies (5 phút)
Khi sampling, bạn có thể thấy xác suất, nhưng bạn cũng dùng instinct để chọn từ "feels right". Nếu bạn phải viết code để pick, quy tắc nào sẽ tạo kết quả tốt nhất?
Đây chính xác là các knobs developers pass vào Claude API. Khi bạn dùng Claude qua UI, anthropic đã chọn sẵn temperature ≈ 0.7. Qua API, bạn control được.
┌──────────────────────────────────────────────────────────┐ │ │ │ STRATEGY 1: Greedy (temperature = 0) │ │ ───────────────────────────── │ │ Luôn pick từ có xác suất cao nhất. │ │ │ │ Pros: Deterministic, consistent output. │ │ Cons: Boring, lặp lại, không có creativity. │ │ │ │ Dùng khi: cần output ổn định (code, factual answer). │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ STRATEGY 2: Weighted random (temperature = 1) │ │ ────────────────────────────────────── │ │ Pick semi-random theo xác suất. │ │ │ │ Pros: Natural variation, creative. │ │ Cons: Có thể đi vào đường thấp xác suất. │ │ │ │ Dùng khi: brainstorming, creative writing. │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ STRATEGY 3: Temperature > 1 │ │ ────────────────────────── │ │ Flatten distribution — các option không phổ biến │ │ được chọn nhiều hơn. │ │ │ │ Pros: Creative, surprising, diverse. │ │ Cons: Rủi ro incoherent, nonsensical. │ │ │ │ Dùng khi: poetry, brainstorming extreme ideas. │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ STRATEGY 4: Top-k │ │ ─────────── │ │ Chỉ pick từ **k token cao nhất**, bỏ phần đuôi. │ │ │ │ Pros: Loại bỏ token rác. │ │ Cons: Cut off creativity nếu k quá thấp. │ │ │ │ Dùng khi: control stability, tránh output lạ. │ │ │ ├──────────────────────────────────────────────────────────┤ │ │ │ STRATEGY 5: Top-p (nucleus sampling) │ │ ────────────────────────────────── │ │ Pick từ subset có cumulative probability ≥ p. │ │ │ │ Pros: Adaptive — vùng confident thì strict, │ │ vùng không confident thì diverse. │ │ Cons: Phải tune p. │ │ │ │ Dùng khi: production systems. │ │ │ └──────────────────────────────────────────────────────────┘
Phần 5: Từ Markov đến Claude
Sampling giống hệt. Training khác căn bản.
Output format: Cả hai đều sinh ra probability distribution trên vocabulary.
Điểm khác biệt lớn:
- Context window: Markov bigram chỉ nhìn 1 từ. Claude Opus 4.8 nhìn đến 1 triệu tokens (≈ 750,000 từ).
- Cách compute distribution: Markov lookup table (đơn giản, explainable). Claude neural network với trillions of parameters.
- Exponential wall: Markov cần table kích thước vocabulary^N — grows exponentially. Neural network trade off: mất explainability, đổi lấy context dài + generalization.
┌──────────────────────────────────────┬──────────────────────────────────────┐ │ MARKOV CHAIN │ LLM (Claude) │ ├──────────────────────────────────────┼──────────────────────────────────────┤ │ │ │ │ 1. Read context: │ 1. Read context: │ │ "last word" (hoặc last N words) │ Entire conversation so far │ │ │ │ │ ───────────────────────────────── │ ───────────────────────────────── │ │ │ │ │ 2. Compute distribution: │ 2. Compute distribution: │ │ Look up 1 row in table │ Forward pass through billions │ │ │ of parameters — attention, │ │ (1 phép cộng + chia) │ embeddings, feedforward layers, │ │ │ residual connections, layer │ │ │ norms... │ │ │ │ │ ───────────────────────────────── │ ───────────────────────────────── │ │ │ │ │ 3. Sample next token │ 3. Sample next token │ │ │ │ │ (greedy / random / temperature / │ (same sampling strategies) │ │ top-k / top-p) │ │ │ │ │ └──────────────────────────────────────┴──────────────────────────────────────┘
Phần 6: 100 năm lịch sử (3 phút)
"Đây có phải công nghệ thật không?" Câu hỏi hay.
1906 ─── Andrey Markov xuất bản bài báo về Markov chains.
Nguyên lý: next word ~ distribution dựa trên previous words.
1948 ─── Claude Shannon áp dụng Markov chains cho information theory.
First "language models" chính thức.
2010 ─── SwiftKey (rồi QuickType của Apple) — n-gram models
chạy trên điện thoại. Đây là Me-bot của nhóm bạn tuổi teen.
2015 ─── RNNs (Recurrent Neural Networks) bắt đầu replace
lookup tables. Học được context dài hơn.
2017 ─── Transformer paper ("Attention is All You Need") thay đổi
mọi thứ. Attention mechanism cho phép attend arbitrary
positions trong context.
2018 ─── GPT-1, BERT — ứng dụng transformer cho language.
2020 ─── GPT-3 — scale lên 175 billion parameters.
2022 ─── ChatGPT — RLHF + fine-tuning biến base model thành
assistant. "Everyone" biết đến LLM.
2026 ─── Claude Opus 4.8 (1M context window). Vẫn là
probabilistic token predictor. Chỉ là **rất, rất tốt.**Anti-patterns khi nghĩ về LLM
❌ "AI có hiểu thực sự"
Không. LLM predict distribution. Trong probability space này, "understanding" là emergent — nó hiện ra như kết quả phụ của việc dự đoán token tốt. Không có cơ chế "hiểu".
Nhưng — research từ Anthropic (Tracing Thoughts, 2025) cho thấy model plan ahead nhiều từ. Ví dụ: khi Claude viết thơ, nó "chọn" rhyming word trước khi viết đầu dòng. Đây là behavior phức tạp hơn "predict 1 token at a time" — nhưng vẫn là emergent từ nguyên lý cơ bản.
❌ "AI tra cứu trong database"
Không. Ngay cả khi AI trả lời "Paris là thủ đô của Pháp", nó không look up. Nó sinh ra "Paris" vì đó là token statistically most likely sau "The capital of France is". Pattern đã dày đến mức output giống như lookup — nhưng không phải lookup.
❌ "Temperature = 0 làm AI chính xác"
Một phần đúng, phần khác sai. Temperature = 0 làm deterministic — cùng input, cùng output. Nhưng nếu model đã hallucinate ở cái distribution, greedy sampling sẽ pick hallucination với tỷ lệ cao. Low temperature ≠ accuracy.
Áp dụng ngay
Bài tập 1: Xây Markov chain của chính mình (~15 phút)
Bước 1: Lấy 5-10 tin nhắn thực của bạn từ Messages / Zalo / Slack. Copy vào giấy.
Bước 2: Tokenize — chỉ cần tách theo space.
Bước 3: Đếm bigram (cặp liền nhau) — làm bảng tần suất.
Bước 4: Chuẩn hóa → xác suất.
Bước 5: Sample một tin nhắn mới bắt đầu từ từ "I" (hoặc từ hay dùng của bạn).
Observe:
Bài tập 2 (stretch): Sampling strategies trong Claude API
Nếu bạn có access tới Claude API:
Compare 4 output. Note khi nào mỗi strategy tỏa sáng.
Bài tập 3: Giải thích cho bạn
Trong 2-3 câu, giải thích cho một đồng nghiệp không biết về AI cách Claude sinh ra text. Không dùng từ "magic", "think", "understand". Chỉ: prediction, distribution, sampling, context.
Nếu bạn giải thích được → bạn thực sự hiểu bài này.
- Tin nhắn mới có "giọng" của bạn không?
- Có hợp lý không? Hay là word salad?
- Nếu bạn có 50 tin thay vì 5, output sẽ khác ra sao?
- Gửi cùng prompt với temperature=0 → observe consistency
- Gửi cùng prompt với temperature=0.7 (default) → observe variation
- Gửi cùng prompt với temperature=1.5 → observe creativity vs coherence
- Gửi cùng prompt với top_p=0.5 → observe constraint
Suy ngẫm bài học
- Lần sau khi thấy Claude "tự tin trả lời", bạn có nhìn nó khác đi không?
- Bạn có thấy tại sao scaling up data + model làm output tự nhiên hơn không?
- Đâu là khoảnh khắc "eureka" với bạn trong bài này?
Tóm tắt bài học
🎯 Training = đếm transitions. Một Markov chain "train" bằng cách đếm bigram frequency. Neural network "train" bằng cách backprop weights, nhưng output cùng loại: distribution.
🎯 Sampling = pick next token dựa vào distribution. Thuật ngữ và mechanism giống hệt giữa Markov chain (1906) và Claude (2026).
🎯 Knobs là cùng bộ: greedy, random, temperature, top-k, top-p. Developers pass chúng vào Claude y như họ pass vào n-gram model.
🎯 Cái khác biệt lớn: không phải nguyên lý mà là cách compute distribution. Markov: lookup table. Neural network: billions of parameters qua attention.
🎯 LLM không "understand" theo nghĩa phổ thông. Nhưng behavior emergent (plan ahead, abstract reasoning) làm output trông như understanding. Research interpretability đang mở ra "hộp đen" này.
- Andrey Markov (1906) — Bài báo gốc về Markov chains
- Anthropic — "Tracing the thoughts of a large language model" (2025) — LLM plan ahead
- Claude Shannon — "A Mathematical Theory of Communication" (1948) — Ứng dụng Markov cho language
- "Attention is All You Need" (Vaswani et al., 2017) — Transformer paper
- Bài 17.3 — Next Token Prediction (lý thuyết)