AI Core cho lập trình viên/Dự đoán token kế tiếp — vòng lặp sinh văn bản
20/54
Bài 20 / 54~12 phútCỗ máy LLMMiễn phí lượt xem

Dự đoán token kế tiếp — vòng lặp sinh văn bản

LLM không tra cứu, không suy luận theo luật: nó dự đoán mảnh văn bản kế tiếp, lặp đi lặp lại. Mọi hành vi khác đều là hệ quả của vòng lặp này.

TL;DR: LLM không có "bộ não" chứa sẵn câu trả lời, cũng không có tập luật suy luận riêng cho từng loại yêu cầu. Nó chỉ làm đúng một việc, lặp đi lặp lại: nhìn toàn bộ mảnh văn bản (token) đã có, tính ra một phân phối xác suất cho mảnh kế tiếp, chọn một mảnh từ phân phối đó, nối vào cuối, rồi lặp lại cho mảnh sau. Viết thơ, giải thích lỗi, trả lời câu hỏi — tất cả chạy qua đúng vòng lặp này; khác biệt duy nhất là những token đã có sẵn trong đầu vào, không phải cơ chế xử lý bên trong.

Bạn mở một trợ lý AI, gõ "viết cho tôi một khổ thơ về mùa thu", nhận lại vài dòng có vần có điệu. Dòng tiếp theo, bạn dán một stack trace và hỏi "lỗi này do đâu?" — nhận lại một đoạn giải thích kỹ thuật mạch lạc, đúng thuật ngữ. Hai câu trả lời khác hẳn nhau về giọng điệu và nội dung, nên phản xạ tự nhiên là nghĩ: bên trong chắc có một bộ định tuyến, nhận diện "đây là yêu cầu sáng tác" để bật một chế độ, nhận diện "đây là debug" để bật chế độ khác.

Không có bộ định tuyến nào cả. Không có "chế độ thơ ca" hay "chế độ kỹ thuật" nào được cài sẵn. Cả khổ thơ lẫn lời giải thích lỗi được sinh ra bởi đúng một vòng lặp, chạy lại y hệt hàng trăm lần: dự đoán một token, nối vào, lặp lại. Bài này trace chính xác vòng lặp đó — nền tảng mà mọi bài sau trong module dựng lên trên.

1. Analogy — bàn phím gợi ý từ trên điện thoại

Gõ vài chữ trên bàn phím điện thoại, phía trên phím hiện ra 1-3 từ gợi ý cho từ tiếp theo — dựa trên vài từ bạn vừa gõ. Bạn chạm chọn một gợi ý, bàn phím lại hiện gợi ý mới cho từ sau đó. LLM làm đúng việc này, chỉ khác về quy mô và ai là người bấm chọn.

Bàn phím gợi ý từLLM
Gợi ý dựa trên vài từ gần nhất bạn vừa gõDự đoán dựa trên toàn bộ chuỗi token đã có — có thể hàng nghìn token trước đó (context window — bài 03)
Bạn tự tay chạm chọn 1 gợi ýModel tự "chọn" 1 token từ phân phối xác suất — cơ chế chọn ở bài 04
Gợi ý dừng khi bạn ngừng gõVòng lặp tự dừng khi model sinh ra token báo kết thúc, hoặc chạm giới hạn độ dài
Gợi ý chỉ 1-3 lựa chọn hiện raPhân phối trải trên toàn bộ vocabulary — hàng chục nghìn token khả dĩ, nhưng hầu hết mang xác suất gần như bằng không
💡 Cách nhớ

LLM = bàn phím gợi ý từ, nhưng nhìn xa hơn (toàn bộ ngữ cảnh, không chỉ vài từ gần nhất) và tự lặp lại việc chọn — bấm gợi ý — gõ tiếp hàng trăm lần liên tục, không cần bạn chạm tay vào.

2. Vòng lặp autoregressive — trace từng bước

Tên kỹ thuật cho đúng ý tưởng ở trên là autoregressive: đầu ra của bước trước (token vừa sinh) trở thành một phần đầu vào của bước sau. Model không giữ một bộ nhớ ẩn nào khác ngoài chuỗi token nó vừa nhìn thấy — mọi thứ nó "biết" về cuộc hội thoại nằm hết trong chuỗi đó.

Thử đoán

Đọc câu sau và tự viết ra từ bạn nghĩ sẽ đứng kế tiếp, trước khi đọc phần giải thích bên dưới: "Hôm nay trời rất ___"

Bạn vừa làm đúng việc model làm ở mỗi bước — trừ một điểm: model không chọn một mảnh duy nhất, nó tính ra xác suất cho mọi mảnh trong vocabulary cùng lúc. Với câu trên, xác suất dồn cao vào nhóm mảnh khớp chủ đề thời tiết — như "đẹp", "nóng", "lạnh", "mưa" — và gần như bằng không cho mảnh lạc chủ đề như "compile". (Các mảnh này thực ra là token sub-word, không phải luôn trọn một từ — bài 02 gọi tên chính xác.) Đây chính là phân phối xác suất: một bảng gán một con số cho từng token khả dĩ, không phải một câu trả lời "đúng" duy nhất được tính sẵn.

Bước kế tiếp — chọn đúng một token từ bảng xác suất đó — là sampling, chủ đề bài 04. Bài này chỉ cần nắm: có một bước chọn, và bước đó không tất định 100% (token có xác suất cao nhất chưa chắc luôn được chọn).

Viết lại toàn bộ vòng lặp thành các bước:

input <- danh sách token của prompt ban đầu
while chưa gặp token báo kết thúc VÀ chưa chạm giới hạn độ dài:
    phan_phoi <- model(input)          -- xác suất cho MỌI token trong vocabulary
    token_moi <- chon_tu(phan_phoi)     -- cách chọn: bài 04 (sampling)
    input <- input + [token_moi]        -- nối token vừa chọn vào cuối
    hien_thi(token_moi)                 -- đây là "chữ chạy" bạn thấy khi model stream
-- Kết thúc: input chứa toàn bộ chuỗi, kể cả phần model vừa sinh

Mỗi vòng while chỉ sinh đúng một token. Câu trả lời dài trăm từ là hàng trăm lần lặp lại y hệt vòng lặp trên, không phải một bước "viết cả đoạn" duy nhất.

3. Vì sao cùng một model viết được cả thơ lẫn giải thích lỗi code?

Quay lại nghịch lý ở đầu bài: vì sao cùng một cơ chế lại ra được cả khổ thơ lẫn lời giải thích lỗi? Vì input trong vòng lặp trên không chỉ chứa câu hỏi vừa gõ — nó chứa toàn bộ prompt hệ thống, lịch sử hội thoại, và câu hỏi hiện tại, nối liền thành một chuỗi token duy nhất. Yêu cầu "viết thơ" và yêu cầu "giải thích lỗi" đơn giản là hai chuỗi input khác nhau đưa vào cùng một hàm model(input). Không có bước nào trong vòng lặp kiểm tra "đây là loại yêu cầu gì" rồi rẽ nhánh sang cơ chế xử lý khác — phân phối xác suất ở mỗi bước đã tự nghiêng về từ hợp với ngữ cảnh, chỉ vì ngữ cảnh đó nằm sẵn trong input.

Nói cách khác, model không "tra cứu" — nó không có kho lưu sẵn "câu trả lời cho câu hỏi X" để lấy ra. Mỗi token được tính lại từ đầu, bằng cách áp thống kê học được lúc train lên đúng chuỗi input hiện tại. Cùng một câu hỏi hỏi hai lần với ngữ cảnh y hệt, vòng lặp chạy lại y hệt — không phải vì có bộ nhớ cache, mà vì model(input) là một hàm áp lên input, không phải một bảng tra cứu.

Vòng lặp sinh văn bản: model tính phân phối cho mọi token, sampling chọn một token, nối vào cuối chuỗi, rồi quay lại tính phân phối cho token kế tiếp

4. Pitfall tổng hợp

Nhầm 1 — nghĩ model "tra cứu" câu trả lời có sẵn, giống công cụ tìm kiếm:

✅ Model không lưu trữ nguyên văn câu trả lời cho từng câu hỏi. Nó tính lại phân phối xác suất từ đầu ở mỗi bước, dựa trên pattern thống kê học được lúc train (hàng tỷ tham số), không phải một chỉ mục tra cứu tại thời điểm chạy.

Nhầm 2 — nghĩ có "chế độ suy luận logic" riêng, khác "chế độ viết văn", và model tự chuyển đổi giữa chúng:

✅ Không có bộ chuyển chế độ nào. Đúng một vòng lặp chạy cho mọi loại yêu cầu; khác biệt nằm ở token ngữ cảnh đã có trong input, không nằm ở cơ chế xử lý bên trong.

Nhầm 3 — nghĩ model "biết trước" toàn bộ câu trả lời rồi in ra dần, như hiệu ứng gõ chữ giả lập trong giao diện:

✅ Model sinh thật sự tuần tự. Ở token thứ n, nó chưa "biết" token thứ n+5 sẽ là gì — token đó chỉ được tính sau, dựa trên chuỗi đã dài thêm đúng 1 token. Đây là lý do model đôi khi tự mâu thuẫn giữa chừng một câu trả lời dài: không có bản nháp hoàn chỉnh nào được viết sẵn trước khi sinh chữ đầu tiên.

5. 📚 Deep Dive

📚 Nguồn gốc — đọc khi muốn xuống tầng sâu hơn

Paper chính chủ:

  • Brown et al. — Language Models are Few-Shot Learners (arXiv:2005.14165) — đây là nơi ý tưởng mở rộng dự đoán next-token lên quy mô hàng tỷ tham số (GPT-3) được trình bày hệ thống. Đọc để thấy vòng lặp đơn giản trong bài này đứng sau những hệ thống lớn thế nào — không cần đọc để lấy con số cụ thể, bài này không tóm tắt kết quả của paper.

Ghi chú: bài này thuần cơ chế, không đo số liệu thực nghiệm nào — mọi ví dụ (câu thời tiết, khổ thơ, stack trace) là minh hoạ định tính cho vòng lặp, không phải kết quả đo từ một model cụ thể.

6. Liên hệ các bài khác

  • Bài 02 — Tokenization — bài này gọi tạm đơn vị là "mảnh"; bài 02 gọi tên chính xác là token và giải thích tokenizer cắt nó ra sao.
  • Bài 04 — Sampling & temperature — đào sâu đúng bước "chọn 1 token từ phân phối" mà bài này mới chỉ nêu tên.
  • Bài 06 — Hallucination — hệ quả của việc model sinh tuần tự, không "biết trước" toàn cục: đôi khi nó tự tin sai suốt cả câu trả lời.

7. Tóm tắt

  • Model không tra cứu, không suy luận theo luật riêng cho từng loại yêu cầu — nó lặp lại đúng một thao tác: dự đoán token kế tiếp.
  • Mỗi bước, model nhận toàn bộ chuỗi token đã có và xuất ra một phân phối xác suất trên toàn bộ vocabulary.
  • Một token được chọn từ phân phối đó (sampling — bài 04), nối vào cuối input, và vòng lặp lặp lại cho token kế tiếp.
  • Không có "chế độ" chuyển đổi giữa viết thơ, viết code hay trả lời câu hỏi — cùng một vòng lặp, khác biệt chỉ ở token ngữ cảnh đã có sẵn trong input.
  • Model sinh tuần tự thật sự, không biết trước phần sau của câu trả lời sẽ ra sao — nền của hiện tượng tự mâu thuẫn giữa chừng (bài 06 đào sâu).

8. Tự kiểm tra

Tự kiểm tra
Q1
Mô tả vòng lặp autoregressive bằng lời của bạn: model nhận gì ở mỗi bước, xuất ra gì, và làm gì với thứ xuất ra đó trước khi sang bước kế tiếp?

Mỗi bước, model nhận toàn bộ chuỗi token đã có (kể cả token vừa sinh ở bước trước), tính ra một phân phối xác suất trên toàn bộ vocabulary — một con số cho mỗi token khả dĩ, không phải một câu trả lời duy nhất.

Một token được chọn từ phân phối đó, nối vào cuối chuỗi input, rồi vòng lặp lặp lại cho token kế tiếp — cho tới khi gặp token báo kết thúc hoặc chạm giới hạn độ dài.

Q2
Đồng nghiệp của bạn nói: "Chắc bên trong model có bộ định tuyến, nhận diện câu hỏi kỹ thuật thì bật chế độ suy luận logic, câu hỏi sáng tác thì bật chế độ viết văn." Đâu là chỗ sai trong lập luận này?

Không có bộ định tuyến hay chế độ nào được cài sẵn bên trong. Đúng một vòng lặp — dự đoán token, nối vào, lặp lại — chạy cho mọi loại yêu cầu.

Khác biệt giữa câu trả lời kỹ thuật và câu trả lời sáng tác nằm ở token ngữ cảnh đã có trong input (prompt, lịch sử hội thoại) — không nằm ở cơ chế xử lý bên trong model.

Q3
Vì sao nói output của mỗi bước là một phân phối xác suất, chứ không phải một token duy nhất được tính sẵn? Và bước 'chọn 1 token từ phân phối đó' thuộc về bài nào?

Model gán một xác suất cho mọi token trong vocabulary ở mỗi bước — token khớp ngữ cảnh được xác suất cao, token lạc chủ đề gần như bằng không. Đó là một bảng phân phối, không phải một câu trả lời "đúng" duy nhất.

Cách chọn một token cụ thể từ bảng đó — sampling, ảnh hưởng của temperature — là chủ đề bài 04. Bài này chỉ cần biết bước chọn đó tồn tại và không tất định.

Q4
Model sinh văn bản tuần tự, từng token một — không viết trước cả câu rồi in ra. Hệ quả quan sát được của điều này là gì, và vì sao đây không phải một bug ngẫu nhiên?

Ở token thứ n, model chưa "biết" token thứ n+5 sẽ là gì — token đó chỉ được tính sau, dựa trên chuỗi đã dài thêm 1. Vì vậy một câu trả lời dài đôi khi tự mâu thuẫn giữa chừng: phần đầu chọn một hướng, phần sau không còn khớp, vì không có bản nháp hoàn chỉnh nào được viết sẵn trước khi sinh chữ đầu tiên.

Đây là hệ quả trực tiếp của cơ chế autoregressive, không phải lỗi ngẫu nhiên — cùng gốc với hiện tượng hallucination ở bài 06.

Q5
Bàn phím gợi ý từ trên điện thoại và LLM cùng dựa trên một ý tưởng — dự đoán từ/token kế tiếp. Nêu hai khác biệt chính khiến LLM mạnh hơn hẳn, dù cùng gốc ý tưởng.

Thứ nhất, phạm vi ngữ cảnh: bàn phím chỉ nhìn vài từ gần nhất, LLM nhìn toàn bộ chuỗi token đã có — có thể hàng nghìn token trước đó (context window, bài 03).

Thứ hai, quy mô lựa chọn và tự động hoá: bàn phím chỉ gợi ý 1-3 từ để người dùng tự tay chạm chọn, còn LLM tính phân phối trên toàn bộ vocabulary rồi tự chọn (sampling, bài 04) và tự lặp lại hàng trăm lần không cần con người can thiệp giữa chừng.

Bài tiếp theo: Tokenization — vì sao model không thấy ký tự

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Tokenization — vì sao model không thấy ký tự