Menu

Temperature trong LLM: là gì và nên đặt bao nhiêu

Temperature điều chỉnh mức độ ngẫu nhiên mà mô hình ngôn ngữ dùng khi chọn từng từ tiếp theo. Xem temperature thay đổi xác suất của mỗi từ ra sao, khi nào nên đặt thấp hay cao, và nó khác top_p thế nào.

Mọi prompt bên dưới đều có thể chỉnh sửa: thay đổi nó, rồi mở trong ChatGPT, Claude hoặc ứng dụng AI khác.

Temperature là một con số điều chỉnh mức độ ngẫu nhiên mà mô hình ngôn ngữ dùng khi chọn từ tiếp theo. Ở temperature thấp, mô hình gần như lúc nào cũng chọn từ có khả năng cao nhất, nên câu trả lời tập trung và lặp lại được. Ở temperature cao, cơ hội được trải đều hơn, nên câu trả lời đa dạng hơn và đôi khi đi lan man. Temperature thay đổi cách mô hình chọn giữa những từ nó đã cân nhắc; nó không thay đổi những gì mô hình biết.

Mô hình chọn từ tiếp theo như thế nào

Mô hình viết từng token một, trong đó token là một từ hoặc một phần của từ (xem token và cửa sổ ngữ cảnh). Ở mỗi bước, nó cho mọi token trong bộ từ vựng một điểm số, gọi là logit. Một hàm gọi là softmax chuyển các điểm số đó thành xác suất: mỗi điểm số được lấy lũy thừa rồi chia cho tổng của tất cả, nên điểm cao hơn nhận phần lớn hơn và tổng mọi phần bằng 1. Sau đó mô hình rút ngẫu nhiên một token theo các tỷ lệ đó.

Temperature tham gia ngay trước softmax. Mọi điểm số được chia cho temperature T:

probability(word) = exp(score / T) / sum of exp(score / T) over all candidates

Với T nhỏ hơn 1, khoảng cách giữa các điểm số tăng lên, nên từ dẫn đầu càng bỏ xa các từ khác. Với T lớn hơn 1, khoảng cách thu hẹp lại, nên các từ yếu thế bắt kịp. Ở T = 1 bạn nhận được xác suất gốc của mô hình. Ở T = 0 phép chia không xác định, nên các API coi nó là "luôn chọn token đứng đầu", cách này gọi là greedy decoding (giải mã tham lam).

Thử ngay: thanh trượt temperature

Bản demo bên dưới viết tiếp cụm từ "Ngôn ngữ lập trình yêu thích của tôi là" với sáu từ ứng viên. Các điểm số chỉ mang tính minh họa, được chọn cho bản demo này; một mô hình thật chấm điểm cho cả bộ từ vựng hàng chục nghìn token trở lên, và tên một ngôn ngữ có thể bị tách thành nhiều token. Phép tính thì là thật: các thanh là kết quả softmax của những điểm số này ở temperature bạn chọn, và nút lấy mẫu rút ra mười từ từ đó.

Ngôn ngữ lập trình yêu thích của tôi là …
Next word probabilities
Python46%
JavaScript28%
Rust14%
C7.6%
Haskell3.4%
COBOL0.8%
Samples
Press Sample to let the model pick a word ten times.

Ở mức 1,0, Python chiếm khoảng 46% còn COBOL dưới 1%. Kéo xuống 0,5 thì Python tăng lên khoảng 67% trong khi COBOL gần như biến mất. Kéo lên 2,0 thì Python giảm còn khoảng 32% trong khi COBOL tăng lên khoảng 4%, nên cứ khoảng ba lượt lấy mẫu mười từ thì có một lượt chứa COBOL ít nhất một lần. Hãy để ý điều không bao giờ xảy ra: thứ tự các từ giữ nguyên ở mọi mức. Temperature không thể khiến COBOL có khả năng cao hơn Python; nó chỉ nới rộng hoặc thu hẹp khoảng cách.

Một câu trả lời thật là hàng trăm lần chọn như thế nối tiếp nhau, và mỗi lần chọn trở thành một phần ngữ cảnh cho lần chọn sau. Một từ bất thường ở đầu sẽ thay đổi mọi thứ phía sau, đó là lý do một câu trả lời ở temperature cao trôi xa hơn nhiều so với những gì một từ đơn lẻ trong bản demo này cho thấy.

Khi nào nên dùng temperature thấp hay cao

Tác vụĐiểm khởi đầuLý do
Code, sửa bug, SQLThấp, từ 0 đến 0,3Thường chỉ có một phần tiếp theo tốt nhất, và bạn muốn kết quả giống nhau mỗi lần chạy
Trích xuất, phân loại, JSON0Mọi sự thay đổi đều là nhiễu, và một chương trình phải đọc đầu ra
Giải thích, câu hỏi thường ngàyGiá trị mặc định của nhà cung cấpGiá trị mặc định được chọn cho mục đích chung
Brainstorm, đặt tên, ý tưởng truyệnMặc định hoặc cao hơn một chútBạn muốn các lựa chọn khác biệt nhau

Có hai điều cần lưu ý. Thứ nhất, temperature thấp không làm câu trả lời trở nên đúng. Nếu câu trả lời có khả năng cao nhất của mô hình là sai, temperature 0 sẽ cho bạn câu trả lời sai đó mọi lần, chỉ là một cách nhất quán; xem ảo giác AI. Thứ hai, giá trị rất cao (vượt xa 1, trên những API có thang đo đến 2) thường tạo ra văn bản lạc mạch hoặc vô nghĩa, vì các token ít khả năng ngày càng được chọn nhiều hơn.

Đôi khi sự ngẫu nhiên lại chính là mục đích. Self-consistency prompting cố ý chạy cùng một câu hỏi suy luận nhiều lần ở temperature khác 0, rồi chọn đáp án mà phần lớn các lần chạy đồng ý.

Temperature, top_p và top_k

Hai tham số khác cũng điều khiển việc lấy mẫu, và các API thường đặt chúng cạnh temperature.

top_p (nucleus sampling) chỉ giữ lại các token có khả năng cao nhất mà tổng xác suất bằng p, rồi lấy mẫu trong số đó. Dùng các con số của bản demo ở temperature 1: Python, JavaScript và Rust cộng lại khoảng 88%, thêm C thì vượt 90%. Vậy với top_p = 0.9, mô hình chỉ lấy mẫu trong bốn từ đó; Haskell và COBOL không bao giờ xuất hiện. Khác với temperature, top_p tự thích ứng: khi mô hình tự tin, ít token lọt vào nhóm, còn khi nó không chắc, nhiều token lọt vào.

top_k giữ lại một số lượng cố định các token có khả năng cao nhất, ví dụ 40 token đứng đầu. Một số API có tham số này, số khác thì không.

Các nhà cung cấp thường khuyên chỉ thay đổi temperature hoặc top_p, không đổi cả hai, vì tác động của chúng cộng dồn theo những cách khó đoán.

Đặt temperature trong API

Các ứng dụng chat ẩn tham số này, nhưng API nhận nó như một tham số. Khoảng giá trị tùy nhà cung cấp: Chat Completions API của OpenAI chấp nhận từ 0 đến 2, còn Messages API của Anthropic chấp nhận từ 0 đến 1. Một số mô hình suy luận chỉ chấp nhận giá trị mặc định.

from openai import OpenAI

client = OpenAI()
MODEL = "your-model-id"  # e.g. from your provider's model list

response = client.chat.completions.create(
    model=MODEL,
    messages=[{"role": "user", "content": "Write a SQL query that counts orders per customer."}],
    temperature=0.2,
)
print(response.choices[0].message.content)
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

message = client.messages.create(
    model=MODEL,
    max_tokens=500,
    temperature=0.2,
    messages=[{"role": "user", "content": "Write a SQL query that counts orders per customer."}],
)
print(message.content[0].text)

Vì sao ứng dụng chat ẩn temperature, và nên làm gì thay thế

Các ứng dụng ChatGPT, Claude và Gemini tự chọn tham số lấy mẫu cho bạn và không có thanh trượt nào. Điều đó giúp ứng dụng đơn giản, và với hầu hết các yêu cầu, viết lại prompt thay đổi câu trả lời nhiều hơn hẳn so với một tham số lấy mẫu.

Vì vậy trong ứng dụng chat, prompt chính là công cụ điều khiển của bạn. Yêu cầu một câu trả lời sẽ cho bạn thứ gần với lựa chọn đầu tiên của mô hình. Yêu cầu nhiều câu trả lời khác biệt nhau sẽ cho bạn sự đa dạng ở bất kỳ temperature nào, vì giờ mô hình có lý do để tránh lựa chọn đầu tiên. Chuyển qua lại giữa các tab và đổi sản phẩm để thấy sự khác biệt.

Fill in
Gợi ý một cái tên cho ứng dụng theo dõi thói quen.
Try it
Example replyReplies vary between models and runs.

Streakly. Tên ngắn, dễ nhớ, và gợi đến chuỗi ngày liên tiếp (streak) khiến người dùng quay lại mỗi ngày.

Nút tạo lại câu trả lời trong ứng dụng chat lấy mẫu một câu trả lời mới từ cùng một prompt, đây là cách nhanh để xem các câu trả lời dao động đến mức nào. Nếu chúng dao động nhiều hơn bạn muốn, cách sửa thường là một prompt cụ thể hơn: một nhiệm vụ rõ ràng thu hẹp phạm vi các câu trả lời tốt, và điều đó khiến các lần chạy giống nhau hơn. Bài hướng dẫn viết prompt trình bày những gì cần thêm vào.

Câu hỏi thường gặp

Temperature trong LLM là gì?

Temperature là một tham số lấy mẫu điều chỉnh mức độ ngẫu nhiên khi chọn từng token tiếp theo. Mô hình cho mỗi token có thể xuất hiện tiếp theo một điểm số, và các điểm số này được chia cho temperature trước khi chuyển thành xác suất. Giá trị thấp để lựa chọn hàng đầu chiếm ưu thế; giá trị cao làm xác suất đồng đều hơn, nên các token ít khả năng hơn được chọn thường xuyên hơn.

Nên dùng temperature bao nhiêu khi viết code?

Một giá trị thấp, khoảng từ 0 đến 0,3, là điểm khởi đầu phổ biến cho code, trích xuất dữ liệu và mọi tác vụ chỉ có một đáp án đúng, vì bạn muốn phần tiếp theo có khả năng cao nhất và kết quả lặp lại được. Hãy tăng lên khi bạn muốn sự đa dạng, như nghĩ tên hoặc tìm các phương án thiết kế khác. Một số mô hình suy luận chỉ chấp nhận giá trị mặc định, nên hãy xem tài liệu của nhà cung cấp.

Temperature và top_p khác nhau thế nào?

Temperature thay đổi hình dạng của toàn bộ phân phối xác suất. top_p, còn gọi là nucleus sampling, thì cắt bớt nó: mô hình chỉ lấy mẫu trong nhóm token nhỏ nhất có tổng xác suất bằng p, nên top_p = 0.9 loại bỏ phần đuôi dài các token ít khả năng. Các nhà cung cấp thường khuyên chỉ điều chỉnh một trong hai và để cái còn lại ở giá trị mặc định.

Temperature 0 có làm đầu ra hoàn toàn cố định không?

Gần như vậy, nhưng không tuyệt đối. Ở mức 0, mô hình chọn token có khả năng cao nhất ở mỗi bước, nên các lần chạy lặp lại thường giống hệt hoặc rất gần nhau. Những khác biệt nhỏ về tính toán số trên máy chủ của nhà cung cấp thỉnh thoảng vẫn có thể làm thay đổi một token, và khi một token đã khác, phần còn lại của câu trả lời có thể rẽ sang hướng khác.

Có thể đổi temperature trong ChatGPT hoặc Claude không?

Không, trong các ứng dụng chat thì không: chúng tự chọn tham số lấy mẫu và không có nút điều chỉnh temperature. Bạn có thể đặt nó qua API và trong các công cụ dành cho lập trình viên như OpenAI Playground, Anthropic Console và Google AI Studio. Trong ứng dụng chat, hãy yêu cầu sự đa dạng hoặc tính nhất quán ngay trong prompt.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu