Chào mừng bạn trở lại với loạt bài “AI Agent Roadmap”! Trong những bài viết trước, chúng ta đã cùng nhau khám phá những nền tảng cốt lõi, từ việc AI Agent là gì và Chúng Hoạt Động Như Thế Nào?, hiểu về Vòng Lặp Agent, cho đến việc đào sâu vào Transformers và LLM, cũng như tầm quan trọng của Tokenization và Cửa sổ Ngữ cảnh. Chúng ta cũng đã nhìn qua một số trường hợp sử dụng thực tế, từ xây dựng công cụ đến ứng dụng trong game (Trợ Lý Cá Nhân cho NPC). Hôm nay, chúng ta sẽ đi sâu vào một khía cạnh cực kỳ quan trọng giúp định hình đầu ra của các mô hình ngôn ngữ lớn (LLM) mà AI Agent của bạn sử dụng: các tham số kiểm soát quá trình sinh văn bản.
Khi làm việc với LLM, đặc biệt là khi tích hợp chúng vào các AI Agent, chúng ta không chỉ đơn thuần gọi API và nhận về một chuỗi văn bản. Khả năng kiểm soát sự “sáng tạo”, sự “ngẫu nhiên” hay tính “tập trung” của câu trả lời là then chốt để agent hoạt động hiệu quả, đáng tin cậy và phù hợp với từng nhiệm vụ cụ thể. Ba tham số chính mà chúng ta thường gặp để làm điều này là Temperature, Top-p (hay Nucleus Sampling) và các loại Penalty (hình phạt).
Mục lục
Kiểm soát Xác suất: Nơi Ma thuật Xảy ra
Hãy nhớ lại cách LLM hoạt động cơ bản: nó nhận một chuỗi token đầu vào (prompt) và dự đoán token tiếp theo dựa trên phân phối xác suất của toàn bộ vốn từ vựng mà nó được huấn luyện. Quá trình này lặp đi lặp lại cho đến khi đạt độ dài mong muốn hoặc gặp token kết thúc. Vấn đề là, đối với mỗi bước dự đoán token tiếp theo, mô hình đưa ra một phân phối xác suất trên hàng chục nghìn, thậm chí hàng trăm nghìn token khả dĩ. Ví dụ, sau từ “Con mèo ngồi trên…”, các từ có xác suất cao có thể là “thảm”, “ghế”, “bàn”, “cửa sổ”, v.v. Các từ có xác suất thấp hơn có thể là “mây”, “ngôi sao”, “xe hơi”.
Nếu chúng ta luôn chọn token có xác suất cao nhất (greedy decoding), kết quả sẽ rất lặp đi lặp lại và thiếu tự nhiên. AI Agent cần sự linh hoạt hơn thế. Đây chính là lúc các kỹ thuật lấy mẫu (sampling) phát huy tác dụng, và các tham số Temperature, Top-p, cùng với Penalties là những công cụ để điều chỉnh quá trình lấy mẫu này.
Temperature: Điều chỉnh Độ “Nóng” của Phân phối
Tham số Temperature là một trong những cách phổ biến nhất để kiểm soát sự ngẫu nhiên (randomness) trong quá trình sinh văn bản của LLM. Về mặt kỹ thuật, temperature được áp dụng cho “logits” của các token trước khi chúng được chuyển đổi thành xác suất thông qua hàm softmax. Logits là các điểm số thô mà mô hình dự đoán cho mỗi token tiềm năng.
Công thức tính xác suất sau khi áp dụng temperature (giả sử cho token i
với logit l_i
) là:
P(token_i) = exp(l_i / T) / sum(exp(l_j / T) for all tokens j)
Trong đó, T
là giá trị temperature.
- Temperature = 0: Khi temperature bằng 0 (hoặc rất gần 0), phép chia logit cho temperature sẽ làm cho logit của token có điểm số cao nhất trở nên cực kỳ lớn so với các logit khác. Sau khi áp dụng softmax, xác suất của token có logit cao nhất sẽ tiến về 1, trong khi các token khác tiến về 0. Điều này tương đương với việc luôn chọn token có xác suất cao nhất (greedy decoding). Kết quả là văn bản sẽ rất dự đoán được, lặp đi lặp lại và ít sáng tạo. Tuy nhiên, nó lại hữu ích cho các nhiệm vụ yêu cầu tính chính xác và nhất quán cao, ví dụ như tóm tắt văn bản, trích xuất thông tin, hoặc các bước suy luận logic trong agent.
- Temperature > 0 (thường từ 0.1 đến 1.0 hoặc hơn): Khi temperature lớn hơn 0, nó làm “làm phẳng” (smooth) phân phối xác suất. Điều này có nghĩa là sự khác biệt giữa xác suất của các token có điểm số cao và thấp sẽ giảm đi. Các token có xác suất ban đầu thấp hơn vẫn có cơ hội được chọn cao hơn so với khi temperature bằng 0. Kết quả là văn bản sẽ đa dạng hơn, sáng tạo hơn và ít lặp lại. Giá trị temperature càng cao thì sự ngẫu nhiên càng lớn, đôi khi có thể dẫn đến những câu trả lời kỳ lạ hoặc không liên quan.
Ví dụ minh họa (ý tưởng):
Giả sử mô hình dự đoán các token tiếp theo cho câu “Con mèo ngồi trên…” với logits như sau:
– “thảm”: logit 3.0
– “ghế”: logit 2.5
– “bàn”: logit 2.0
– “cửa sổ”: logit 1.5
– “mây”: logit -5.0
Nếu Temperature = 0 (gần như): Xác suất của “thảm” sẽ gần 100%. Mô hình sẽ luôn chọn “thảm”.
Nếu Temperature = 0.8: Sự khác biệt giữa các logit sẽ được chia cho 0.8 trước khi đưa vào softmax. Điều này làm tăng xác suất tương đối của “ghế”, “bàn”, “cửa sổ” so với “thảm”. Dù “thảm” vẫn có xác suất cao nhất, các từ khác cũng có cơ hội đáng kể được chọn trong quá trình lấy mẫu ngẫu nhiên.
Khi nào sử dụng Temperature?
- Temperature thấp (0 – 0.4): Khi cần độ chính xác, tính nhất quán, và ít sự ngẫu nhiên. Thích hợp cho các tác vụ như trả lời câu hỏi dựa trên văn bản, tạo mã code, trích xuất dữ liệu, hoặc khi agent cần thực hiện các bước logic cụ thể.
- Temperature trung bình (0.5 – 0.8): Phù hợp cho các tác vụ yêu cầu sự cân bằng giữa tính sáng tạo và tính liên quan. Ví dụ: viết email, tạo nội dung blog thông thường, tóm tắt văn bản một cách tự nhiên hơn.
- Temperature cao (0.9 – 1.0+): Dành cho các tác vụ sáng tạo, đòi hỏi sự đa dạng và đột phá. Ví dụ: viết truyện, thơ, brainstorming ý tưởng, tạo lời thoại cho nhân vật (liên quan đến ứng dụng cho NPC). Cần cẩn trọng vì giá trị quá cao có thể làm giảm chất lượng và tính mạch lạc.
Code Example (Python – conceptual):
import openai # Ví dụ sử dụng thư viện OpenAI
def generate_with_temperature(prompt, temp_value):
response = openai.chat.completions.create(
model="gpt-4o", # Thay thế bằng model bạn dùng
messages=[
{"role": "user", "content": prompt}
],
temperature=temp_value, # Đặt giá trị temperature
max_tokens=100 # Giới hạn độ dài để dễ quan sát
)
return response.choices[0].message.content
# Ví dụ sử dụng temperature thấp và cao
prompt = "Hãy viết một câu về một cuộc phiêu lưu không tưởng."
print("--- Temperature = 0.2 ---")
print(generate_with_temperature(prompt, 0.2)) # Kết quả thường rất tập trung
print("\n--- Temperature = 0.9 ---")
print(generate_with_temperature(prompt, 0.9)) # Kết quả đa dạng, có thể bất ngờ
Top-p (Nucleus Sampling): Lấy mẫu từ “Nhân” Xác suất
Trong khi temperature làm thay đổi toàn bộ phân phối xác suất, Top-p (còn gọi là Nucleus Sampling) lại tiếp cận khác. Thay vì làm phẳng phân phối, Top-p chỉ xem xét một tập hợp con các token có xác suất cao nhất. Cụ thể hơn, nó xác định tập hợp các token có xác suất đủ cao sao cho tổng xác suất của chúng đạt đến một ngưỡng p
nhất định. Sau đó, quá trình lấy mẫu ngẫu nhiên chỉ diễn ra trên tập hợp “nhân” (nucleus) này.
- Top-p = 1.0: Khi top-p bằng 1.0, nó xem xét toàn bộ vốn từ vựng (tất cả các token). Điều này tương đương với việc không sử dụng Top-p, hoặc tương tự như sử dụng temperature cao (nhưng không giống hệt nhau).
- Top-p < 1.0: Khi top-p nhỏ hơn 1.0, nó loại bỏ những token có xác suất rất thấp. Ví dụ, với
top_p=0.9
, mô hình sẽ xếp hạng tất cả các token theo xác suất giảm dần, sau đó chọn tập hợp token đầu tiên mà tổng xác suất của chúng đạt hoặc vượt quá 90%. Quá trình lấy mẫu chỉ diễn ra trên tập hợp token đã chọn này.
Sự khác biệt giữa Temperature và Top-p:
Temperature thay đổi hình dạng của phân phối xác suất bằng cách “nóng” hoặc “lạnh” nó, ảnh hưởng đến tất cả các token. Top-p lại cắt bỏ phần “đuôi” xác suất thấp của phân phối, chỉ giữ lại phần “nhân” có xác suất cao. Điều này có nghĩa là Top-p linh hoạt hơn Temperature ở chỗ kích thước của tập hợp lấy mẫu (nhân) có thể thay đổi tùy thuộc vào hình dạng của phân phối xác suất ở mỗi bước sinh văn bản. Nếu phân phối rất “nhọn” (một vài token có xác suất rất cao), tập hợp nhân sẽ nhỏ. Nếu phân phối “phẳng” hơn, tập hợp nhân sẽ lớn hơn.
Thường thì, bạn sẽ sử dụng một trong hai tham số này cho cùng một yêu cầu kiểm soát sự ngẫu nhiên, không nên dùng cả hai với giá trị khác 0/1. Một số framework API cho phép bạn đặt cả hai, nhưng hành vi chính xác có thể khác nhau; thường thì một trong hai sẽ ưu tiên hoặc chúng tương tác theo cách phức tạp. Hướng dẫn phổ biến là chọn một và điều chỉnh nó.
Khi nào sử dụng Top-p?
- Top-p thường được ưa chuộng hơn Temperature trong nhiều trường hợp bởi vì nó tự động điều chỉnh phạm vi lựa chọn token dựa trên ngữ cảnh. Nếu ngữ cảnh đòi hỏi một câu trả lời rất cụ thể (phân phối nhọn), top-p sẽ giới hạn lựa chọn vào các token có xác suất cực cao. Nếu ngữ cảnh mở hơn (phân phối phẳng), top-p sẽ cho phép lựa chọn từ một tập hợp token rộng hơn.
- Giống như Temperature, Top-p thấp (< 0.5) dẫn đến kết quả tập trung và ít ngẫu nhiên; Top-p cao (> 0.8) dẫn đến kết quả đa dạng và sáng tạo hơn.
Code Example (Python – conceptual):
import openai # Ví dụ sử dụng thư viện OpenAI
def generate_with_topp(prompt, top_p_value):
response = openai.chat.completions.create(
model="gpt-4o", # Thay thế bằng model bạn dùng
messages=[
{"role": "user", "content": prompt}
],
top_p=top_p_value, # Đặt giá trị top_p
max_tokens=100
)
return response.choices[0].message.content
# Ví dụ sử dụng top_p thấp và cao
prompt = "Mô tả cảm giác bay lên bầu trời."
print("--- Top-p = 0.5 ---")
print(generate_with_topp(prompt, 0.5)) # Kết quả tập trung vào các từ phổ biến
print("\n--- Top-p = 0.95 ---")
print(generate_with_topp(prompt, 0.95)) # Kết quả đa dạng, có thể dùng từ hiếm hơn
Penalties (Hình phạt): Giảm thiểu Sự Lặp lại
Ngay cả khi sử dụng Temperature hoặc Top-p, LLM đôi khi có xu hướng lặp lại các cụm từ, ý tưởng hoặc cấu trúc câu nhất định, đặc biệt là khi sinh văn bản dài hoặc khi prompt đầu vào chứa sự lặp lại. Các tham số hình phạt (Penalties) được thiết kế để chống lại hành vi này bằng cách giảm điểm logit (hoặc xác suất) của các token dựa trên việc chúng đã xuất hiện trong văn bản được sinh ra tính đến thời điểm hiện tại.
Frequency Penalty (Hình phạt Tần suất)
Frequency penalty giảm logit của một token tỷ lệ thuận với số lần token đó đã xuất hiện trong văn bản. Nếu một token đã xuất hiện nhiều lần, nó sẽ bị phạt nặng hơn.
- Giá trị thường từ 0.0 đến 2.0.
frequency_penalty = 0.0
: Không áp dụng hình phạt tần suất.frequency_penalty > 0.0
: Giảm khả năng mô hình lặp lại cùng một token thường xuyên.
Điều này hữu ích để ngăn mô hình cứ lặp đi lặp lại một từ hoặc cụm từ cụ thể, giúp văn bản mượt mà và tự nhiên hơn.
Presence Penalty (Hình phạt Sự hiện diện)
Presence penalty giảm logit của một token chỉ đơn giản vì nó đã xuất hiện ít nhất một lần trong văn bản, bất kể tần suất là bao nhiêu. Mức phạt là cố định cho mỗi token đã xuất hiện.
- Giá trị thường từ 0.0 đến 2.0.
presence_penalty = 0.0
: Không áp dụng hình phạt sự hiện diện.presence_penalty > 0.0
: Giảm khả năng mô hình nói lại những gì nó đã nói. Khuyến khích mô hình tạo ra các ý tưởng hoặc chủ đề mới.
Hình phạt sự hiện diện đặc biệt hữu ích khi bạn muốn agent khám phá các khía cạnh khác nhau của một vấn đề hoặc đảm bảo tính đa dạng trong các điểm được đề cập.
Kết hợp Penalties:
Frequency penalty và Presence penalty có thể được sử dụng cùng nhau. Frequency penalty kiểm soát sự lặp lại của *từ*, còn Presence penalty kiểm soát sự lặp lại của *khái niệm* hoặc *chủ đề* (thông qua việc sử dụng các từ liên quan đến chủ đề đó).
Code Example (Python – conceptual):
import openai # Ví dụ sử dụng thư viện OpenAI
def generate_with_penalties(prompt, freq_penalty, pres_penalty):
response = openai.chat.completions.create(
model="gpt-4o", # Thay thế bằng model bạn dùng
messages=[
{"role": "user", "content": prompt}
],
frequency_penalty=freq_penalty, # Đặt hình phạt tần suất
presence_penalty=pres_penalty, # Đặt hình phạt sự hiện diện
max_tokens=200 # Tăng độ dài để dễ thấy hiệu ứng
)
return response.choices[0].message.content
# Ví dụ sử dụng penalties
prompt = "Kể chi tiết về sở thích đọc sách của bạn. Hãy đảm bảo bao gồm nhiều loại sách khác nhau."
print("--- Không có Penalties ---")
print(generate_with_penalties(prompt, 0.0, 0.0)) # Có thể lặp lại cụm "tôi thích đọc sách" hoặc chỉ nói về một loại sách
print("\n--- Với Frequency Penalty = 1.0, Presence Penalty = 0.5 ---")
print(generate_with_penalties(prompt, 1.0, 0.5)) # Nên đa dạng hơn về từ ngữ và chủ đề sách được đề cập
Tổng kết: Chọn Tham số nào cho AI Agent của Bạn?
Việc lựa chọn và tinh chỉnh các tham số Temperature, Top-p và Penalties phụ thuộc rất lớn vào mục tiêu và tính cách của AI Agent mà bạn đang xây dựng. Không có một bộ tham số “tối ưu” cho mọi trường hợp.
Dưới đây là bảng tóm tắt giúp bạn dễ hình dung:
Tham số | Cách hoạt động | Ảnh hưởng đến Phân phối Xác suất | Ảnh hưởng đến Đầu ra | Khi nào Sử dụng (cho Agent) |
---|---|---|---|---|
Temperature | Làm “nóng” hoặc “lạnh” logits trước softmax | Làm phẳng (T cao) hoặc làm nhọn (T thấp) toàn bộ phân phối | Sáng tạo/Đa dạng (T cao) Tập trung/Dự đoán (T thấp) |
Kiểm soát mức độ ngẫu nhiên/sáng tạo chung của agent. Thích hợp khi cần độ “mềm dẻo” đồng đều. |
Top-p | Lấy mẫu từ tập token có tổng xác suất đạt ngưỡng p | Cắt bỏ phần “đuôi” xác suất thấp. Kích thước tập lấy mẫu linh hoạt theo ngữ cảnh. | Sáng tạo/Đa dạng (p cao) Tập trung/Dự đoán (p thấp) |
Kiểm soát mức độ ngẫu nhiên/sáng tạo, đặc biệt trong các ngữ cảnh có phân phối xác suất token khác nhau. Thường được ưa chuộng hơn T. |
Frequency Penalty | Giảm điểm token dựa trên tần suất đã xuất hiện | Giảm xác suất của các token đã xuất hiện nhiều lần | Giảm sự lặp lại của các từ/cụm từ | Ngăn agent lặp lại chính nó về mặt ngôn từ. Giúp văn phong mượt mà, đa dạng. |
Presence Penalty | Giảm điểm token nếu nó đã xuất hiện ít nhất một lần | Giảm xác suất của các token đã xuất hiện | Khuyến khích đề cập đến các ý/chủ đề mới | Ngăn agent lặp lại ý tưởng hoặc chủ đề. Hữu ích khi agent cần đưa ra các điểm khác nhau hoặc brainstorm. |
Lưu ý quan trọng:
- Thử nghiệm là chìa khóa: Cách tốt nhất để tìm ra bộ tham số phù hợp là thử nghiệm với các giá trị khác nhau và quan sát đầu ra của agent.
- Hiệu quả tương quan với mô hình: Mỗi mô hình LLM có thể phản ứng hơi khác nhau với cùng một giá trị tham số.
- Cân bằng: Đôi khi tăng tính sáng tạo (cao T/P) có thể làm giảm tính chính xác, và ngược lại. Bạn cần tìm ra sự cân bằng phù hợp với nhiệm vụ của agent.
- Kết hợp với Prompt Engineering: Các tham số này hoạt động song song với kỹ thuật prompt engineering. Một prompt rõ ràng, cụ thể có thể giúp mô hình đưa ra câu trả lời tốt hơn ngay cả với các tham số mặc định.
Việc làm chủ các tham số kiểm soát quá trình sinh văn bản là một kỹ năng quan trọng đối với bất kỳ nhà phát triển AI Agent nào. Nó cho phép bạn tinh chỉnh “tính cách” và hành vi của agent, đảm bảo rằng nó không chỉ hiểu yêu cầu mà còn phản hồi theo cách phù hợp nhất với bối cảnh và mục tiêu của ứng dụng. Cho dù agent của bạn cần sự chính xác “robot” hay sự sáng tạo “con người”, bạn đều có thể điều chỉnh nó bằng các công cụ này.
Trong các bài viết tiếp theo của series “AI Agent Roadmap”, chúng ta sẽ tiếp tục khám phá sâu hơn các khía cạnh khác trong việc xây dựng những tác nhân thông minh này. Hẹn gặp lại!