Mở đầu — vì sao bài này quan trọng
Hãy tưởng tượng bạn vừa viết một prompt "hoàn hảo": rõ ràng, đủ ngữ cảnh, có ví dụ, đúng cấu trúc. Bạn chạy nó lần đầu, kết quả tuyệt vời. Bạn chạy lần thứ hai với cùng prompt đó, kết quả... lệch hẳn. Lần thứ ba, mô hình bịa ra một con số không có trong dữ liệu. Bạn bắt đầu nghi ngờ chính prompt của mình.
Vấn đề thường không nằm ở prompt. Vấn đề nằm ở những "núm vặn" (tuning knobs) mà bạn chưa từng chạm tới: temperature, top_p và max_tokens. Đây là ba tham số quyết định cách mô hình chọn từ và dừng lại — thứ mà một prompt dù hay đến mấy cũng không kiểm soát được nếu bạn để mặc định một cách mù quáng.
Trong những bài trước, bạn đã học cách nói gì với AI (zero-shot, few-shot, cấu trúc anatomy của prompt). Bài này nói về một tầng khác: cách điều chỉnh hành vi của mô hình ở cấp độ sinh chữ. Đây là ranh giới giữa người dùng ChatGPT bình thường và người thực sự đưa AI vào production. Một chatbot chăm sóc khách hàng của ngân hàng không thể để temperature cao — nó sẽ "sáng tạo" ra chính sách lãi suất không tồn tại. Ngược lại, một công cụ viết caption quảng cáo mà để temperature = 0 sẽ cho ra những câu chữ nhàm chán, lặp đi lặp lại. Hiểu ba núm vặn này giúp bạn biến prompt tốt thành hệ thống đáng tin cậy.
Khái niệm cốt lõi
Trước khi đi vào từng tham số, cần hiểu một điều nền tảng: LLM không "biết" câu trả lời đúng — nó dự đoán từ tiếp theo có xác suất cao nhất. Với mỗi bước, mô hình tạo ra một phân phối xác suất trên toàn bộ từ vựng (hàng chục nghìn token). Ví dụ sau câu "Thủ đô của Việt Nam là", mô hình có thể tính: "Hà" (94%), "Sài" (3%), "Huế" (1%)... Ba tham số dưới đây quyết định cách chọn ra token thực tế từ phân phối đó.
Temperature — độ ngẫu nhiên của output
Temperature (thường ký hiệu temperature, khoảng 0.0–2.0, mặc định 1.0) điều chỉnh độ sắc nét của phân phối xác suất.
- Temperature thấp (0.0–0.3): Mô hình gần như luôn chọn token có xác suất cao nhất. Output xác định (deterministic), nhất quán, "an toàn". Phù hợp cho việc cần chính xác: trích xuất dữ liệu, phân loại, trả lời sự kiện, viết code.
- Temperature trung bình (0.5–0.8): Cân bằng giữa nhất quán và biến thể. Phù hợp cho đa số tác vụ hội thoại, tóm tắt, viết email công việc.
- Temperature cao (1.0–1.5+): Mô hình dám chọn cả những token xác suất thấp. Output đa dạng, "sáng tạo", đôi khi bất ngờ — nhưng cũng dễ lạc đề và bịa đặt. Phù hợp brainstorm, viết quảng cáo, thơ, đặt tên thương hiệu.
top_p — nucleus sampling (lấy mẫu theo phần trăm tích lũy)
top_p (khoảng 0.0–1.0, mặc định 1.0) là một cách kiểm soát ngẫu nhiên khác. Thay vì làm mềm toàn bộ phân phối như temperature, top_p giới hạn tập token được xét.
Cụ thể: mô hình sắp xếp các token theo xác suất giảm dần, rồi chỉ giữ lại nhóm token đầu tiên có tổng xác suất cộng dồn đạt ngưỡng p. Ví dụ top_p = 0.9 nghĩa là "chỉ xét các token nằm trong 90% xác suất tích lũy đầu tiên, bỏ hết phần đuôi". top_p = 0.1 rất hẹp (gần như chỉ token tốt nhất); top_p = 1.0 xét toàn bộ.
Khác biệt cốt lõi so với temperature: temperature co giãn hình dạng phân phối, còn top_p cắt bỏ phần đuôi. top_p thấp đặc biệt hữu ích để loại các token "rác" xác suất cực thấp mà đôi khi temperature cao vẫn cho lọt.
Nguyên tắc thực hành quan trọng nhất: thường bạn chỉ nên chỉnh một trong hai (temperature HOẶC top_p), không chỉnh cả hai cùng lúc, vì chúng tương tác khó lường. Đa số người làm production chọn: cố định top_p = 1.0 và điều chỉnh temperature, HOẶC cố định temperature = 1.0 và điều chỉnh top_p. Cách đầu phổ biến hơn vì trực giác hơn.
max_tokens — giới hạn độ dài đầu ra
max_tokens quy định số token tối đa mà mô hình được phép sinh ra trong câu trả lời. Đây không phải tham số về chất lượng mà về độ dài và chi phí.
Cần nhớ ba điều:
- Token không phải là từ. Với tiếng Anh, 1 token ≈ 0.75 từ. Với tiếng Việt có dấu, một từ có thể ngốn 2–3 token (do bảng mã hóa). Vì vậy một đoạn tiếng Việt tốn nhiều token hơn tiếng Anh cùng nghĩa — điều này ảnh hưởng trực tiếp đến chi phí và giới hạn.
- max_tokens chỉ giới hạn đầu ra, không tính phần đầu vào (prompt). Tổng đầu vào + đầu ra phải nằm trong context window của mô hình (chủ đề của Bài 12).
- Đặt quá thấp sẽ cắt cụt câu trả lời giữa chừng. Nếu chatbot của bạn trả lời "Chính sách hoàn tiền của chúng tôi cho phép khách hàng..." rồi dừng đột ngột, gần như chắc chắn max_tokens quá nhỏ.
Tình huống thực tế
Ví dụ 1 — Tiki: chatbot tra cứu chính sách bị "ảo giác"
Một đội kỹ thuật giả định tại Tiki xây chatbot trả lời câu hỏi về chính sách đổi trả. Ban đầu họ để nguyên cấu hình mặc định (temperature = 1.0). Trong 500 hội thoại thử nghiệm, có khoảng 40 lần bot bịa ra thông tin: nói thời hạn đổi trả là "45 ngày" trong khi chính sách thật là 30 ngày, hoặc tự nghĩ ra "phí đổi trả 15.000đ" vốn không tồn tại.
Nguyên nhân: với temperature cao, mỗi khi gặp chỗ mơ hồ, mô hình "sáng tạo" ra con số nghe hợp lý thay vì bám sát ngữ cảnh được cung cấp. Đội hạ temperature xuống 0.2 và giữ top_p = 1.0. Tỷ lệ bịa đặt giảm mạnh, các câu trả lời cho cùng một câu hỏi trở nên nhất quán giữa các lần chạy — điều bắt buộc với một hệ thống nói về tiền của khách hàng.
Bài học: Với tác vụ dựa trên sự thật (facts, chính sách, số liệu), temperature thấp là mặc định an toàn. Sáng tạo là kẻ thù khi khách hàng cần thông tin chính xác.
Ví dụ 2 — Agency marketing tại TP.HCM: máy đẻ ý tưởng caption
Một agency giả định chuyên chạy quảng cáo Facebook cho các shop thời trang. Họ dùng AI sinh caption cho mỗi bài đăng. Ban đầu để temperature = 0.3 vì "an toàn", nhưng khách phàn nàn: 20 caption sinh ra na ná nhau, đều bắt đầu bằng "Bạn ơi..." và cấu trúc giống hệt. Nhàm chán, không có cái nào "viral".
Đội chuyển sang temperature = 1.1 và yêu cầu sinh 10 phương án mỗi lần. Kết quả đa dạng hẳn: có caption dùng câu hỏi khiêu khích, có cái kể chuyện, có cái chơi chữ tiếng Việt. Copywriter chỉ việc chọn lọc và tinh chỉnh 2–3 cái tốt nhất. Năng suất viết caption tăng gấp ba, và quan trọng hơn là chất lượng ý tưởng đa dạng để A/B test.
Bài học: Với tác vụ phát tán ý tưởng (divergent thinking), temperature cao là bạn đồng hành. Bạn muốn nhiều phương án khác nhau để chọn, không phải một câu trả lời "đúng" duy nhất.
Ví dụ 3 — Startup fintech: chi phí phình to vì max_tokens
Một startup fintech giả định ở Singapore xây tính năng tóm tắt giao dịch hàng tháng cho người dùng. Họ đặt max_tokens = 4000 "cho chắc, để không bị cắt". Với 200.000 người dùng chạy mỗi tháng, hóa đơn API leo lên bất ngờ. Khi rà soát, họ phát hiện phần lớn bản tóm tắt thực tế chỉ dài 150–200 token; mức 4000 chỉ là trần an toàn thừa thãi — nhưng vấn đề thật nằm ở chỗ khác: prompt không giới hạn độ dài, nên đôi lúc mô hình viết lan man tới 800–1000 token.
Họ làm hai việc: (1) thêm ràng buộc trong prompt "tóm tắt trong tối đa 4 câu", (2) hạ max_tokens xuống 300 làm van an toàn. Kết quả: độ dài đầu ra ổn định, chi phí token đầu ra giảm khoảng 60%, và trải nghiệm người dùng tốt hơn vì bản tóm tắt ngắn gọn dễ đọc trên điện thoại.
Bài học: max_tokens là van an toàn về chi phí, nhưng kiểm soát độ dài thực sự nên đến từ prompt. Đừng để max_tokens quá cao một cách vô tội vạ, và luôn ước lượng độ dài thực tế trước khi nhân với quy mô người dùng.
Hướng dẫn từng bước
Đây là quy trình để chọn tham số cho một tác vụ mới:
- Xác định bản chất tác vụ: hội tụ hay phát tán?
- Chọn một núm để điều chỉnh. Mặc định: giữ top_p = 1.0, chỉ chỉnh temperature. Đừng chỉnh cả hai cùng lúc.
- Ước lượng độ dài đầu ra và đặt max_tokens. Đo độ dài thực tế của vài câu trả lời mẫu, rồi đặt max_tokens cao hơn khoảng 20–30% làm biên an toàn. Nhớ tiếng Việt tốn nhiều token hơn ước lượng theo từ.
- Chạy thử nhiều lần với cùng prompt. Nếu cần nhất quán (production), hạ temperature. Nếu output quá giống nhau khi bạn muốn đa dạng, tăng temperature.
- Cố định cấu hình sau khi hài lòng và ghi lại. Ghi rõ temperature/top_p/max_tokens vào tài liệu prompt của bạn — đây là một phần của việc quản lý prompt như code (chủ đề Bài 37).
Lỗi thường gặp & mẹo
- Chỉnh cả temperature lẫn top_p cùng lúc. Đây là lỗi số một. Hai tham số tương tác phi tuyến, khiến bạn không biết cái nào gây ra thay đổi. Chọn một, khóa cái kia.
- Nghĩ temperature cao = "thông minh hơn". Sai. Temperature cao chỉ tăng độ ngẫu nhiên, không tăng độ thông minh. Với bài toán suy luận (Bài 7 — Chain-of-Thought), temperature thấp thường cho kết quả logic chắc chắn hơn.
- Để max_tokens quá thấp và bị cắt cụt câu. Nếu câu trả lời hay dừng giữa chừng, kiểm tra max_tokens trước khi đổ lỗi cho prompt. Ngược lại, để quá cao thì lãng phí tiền.
- Quên rằng tiếng Việt tốn nhiều token. Một đoạn 100 từ tiếng Việt có thể chiếm 200–250 token. Nếu đặt max_tokens theo cảm giác "số từ", bạn dễ bị cắt cụt.
- Kỳ vọng temperature = 0 cho kết quả y hệt tuyệt đối. Nó là mức nhất quán nhất, nhưng vẫn có thể dao động nhỏ. Đừng xây hệ thống phụ thuộc vào việc output giống nhau từng ký tự.
- Mẹo: Khi debug một prompt cho ra kết quả thất thường, việc đầu tiên nên làm là hạ temperature xuống 0 để loại yếu tố ngẫu nhiên. Nếu ở temperature = 0 mà vẫn sai, lỗi nằm ở prompt chứ không phải tham số.
- Mẹo: Với tác vụ cần vừa chính xác vừa có chút tự nhiên (ví dụ trả lời hỗ trợ khách hàng), temperature 0.3–0.5 là "vùng vàng" thường dùng.
Bài tập thực hành
- Thí nghiệm temperature. Lấy một prompt đặt tên thương hiệu ("Đề xuất 10 tên cho một quán cà phê specialty ở Đà Nẵng"). Chạy ở temperature = 0.2, rồi 0.8, rồi 1.3. Ghi lại độ đa dạng và độ "an toàn" của kết quả ở mỗi mức. Bạn thấy mức nào phù hợp nhất cho mục tiêu này?
- Thí nghiệm nhất quán. Viết một prompt trích xuất số điện thoại và email từ một đoạn văn bản. Chạy 5 lần ở temperature = 1.0, rồi 5 lần ở temperature = 0. So sánh mức độ nhất quán giữa các lần chạy.
- Ước lượng token. Lấy một đoạn tóm tắt tiếng Việt khoảng 4 câu bạn đã viết. Đếm số từ, rồi ước lượng số token (nhân hệ số ~2). Đặt max_tokens phù hợp với biên an toàn 25%. So sánh với khi bạn đặt max_tokens = 50 — điều gì xảy ra với câu trả lời?
- Tình huống thiết kế. Bạn xây một trợ lý viết mô tả sản phẩm cho sàn thương mại điện tử: cần đúng thông số kỹ thuật nhưng câu chữ hấp dẫn. Bạn sẽ đặt temperature, top_p, max_tokens bao nhiêu? Giải thích lựa chọn.
Tóm tắt
- LLM sinh chữ bằng cách dự đoán token tiếp theo từ một phân phối xác suất. Ba núm vặn quyết định cách chọn token và khi nào dừng.
- Temperature (0.0–2.0) điều chỉnh độ ngẫu nhiên: thấp = nhất quán, chính xác, hợp tác vụ hội tụ; cao = đa dạng, sáng tạo, hợp tác vụ phát tán.
- top_p (0.0–1.0) cắt bỏ phần đuôi xác suất thấp (nucleus sampling). Chỉ nên chỉnh temperature HOẶC top_p, không chỉnh cả hai.
- max_tokens giới hạn độ dài đầu ra — công cụ kiểm soát chi phí và tránh câu trả lời lan man. Nhớ tiếng Việt tốn nhiều token hơn tiếng Anh.
- Quy trình: xác định tác vụ hội tụ/phát tán → chọn temperature tương ứng → ước lượng và đặt max_tokens → chạy thử nhiều lần → cố định và ghi lại cấu hình.
- Một prompt tốt cộng cấu hình tham số đúng mới tạo nên một hệ thống AI đáng tin cậy trong production.