当你使用大语言模型(LLM)时,可能会注意到,即使提交相同的请求,多次运行后仍然会得到不同的回应。这是因为 LLM 具有概率性,它们的输出基于所学到的模式和概率,而不是固定规则。
幸运的是,你可以通过调整特定的参数来控制 LLM 的行为,就像微调收音机的旋钮来调整到想要的电台一样。理解这些参数可以帮助你更好地定制 LLM 的输出,使其更具可预测性或创造性,具体取决于你的需求。
在本文中,我们将探讨多个关键参数,这些参数可以影响 LLM 的输出:
Temperature(温度):控制输出的随机性。较高的值增加创造性,而较低的值使输出更加确定。
Top-P(顶层概率采样):限制模型选择的单词范围,使其仅考虑累计概率达到特定阈值的最可能选项,以平衡多样性和连贯性。
Max Tokens(最大标记数):定义生成的响应的最大长度。
Frequency Penalty(频率惩罚):通过降低已使用词汇的概率,减少重复。
Presence Penalty(存在惩罚):通过降低已出现的词汇的概率,鼓励新词的使用。
Stop Sequences(停止序列):定义特定的标记模式,以指示模型停止生成文本。
在本指南中,我们将使用 OpenAI 的 ChatGPT 和 API 作为示例,演示如何有效地配置这些参数。让我们开始吧!
尽管标准的聊天界面(如 ChatGPT 或 Google Gemini)可能不提供参数调整功能,但当你通过 API 访问 LLM 时,通常可以自定义这些参数。
在本指南中,我们将使用 OpenAI API 及其 Python 库来演示如何通过调整参数影响模型的输出。当然,你也可以使用其他 API,例如 Google Gemini、Anthropic 的模型,或者开源方案如 Hugging Face 的 Transformers 库。
要在 Python 中使用 OpenAI API,首先需要安装 openai
库:
pip install openai
安装完成后,你需要从 OpenAI 获取 API 密钥。在 OpenAI 的 API 密钥页面 申请新的 API 密钥。
然后,使用该密钥初始化 API 客户端:
import openai
OPENAI_API_KEY = "你的 API 密钥"
client = openai.OpenAI(api_key=OPENAI_API_KEY)
注意:请勿泄露你的 API 密钥,以免账户安全受损或产生额外费用。
初始化 API 客户端后,你就可以与 OpenAI 模型交互了。要向 LLM 发送查询,你需要指定模型名称、你的请求内容以及相关参数。例如,以下代码使用 gpt-4o
模型(即 ChatGPT 登录后默认使用的模型)生成一段关于玫瑰花的文字:
# 发送聊天请求并定义参数
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "写一小段关于玫瑰花的描述。",
}
],
stop=["."], # 最多可设置 4 个停止序列
temperature=1,
top_p=0.2,
max_tokens=100,
frequency_penalty=0.2,
presence_penalty=0.5
)
# 输出模型生成的文本
print(response.choices[0].message.content)
你可以调整 stop
、temperature
、top_p
、max_tokens
、frequency_penalty
和 presence_penalty
参数,并观察它们如何影响生成的文本。在本博客中,我们将重点介绍这六个关键参数,并讨论它们如何影响输出。
在解释 LLM 参数之前,我们先快速回顾一下 LLM 生成文本的核心原理和关键术语。
LLM 通过大量的文本数据进行训练,以预测句子中的下一个单词。它们逐步生成文本,每一步根据所有可能单词的概率选择一个单词。
LLM 不像人类那样直接处理文本,而是将文本转换为“标记”(tokens)。标记可以是完整的单词、单词的一部分,甚至是字符,具体取决于语言和标记化系统。在我们的示例中,每个单词都是一个标记。
在文本生成的任何时刻,模型都会评估其词汇表中的所有标记,并为每个标记分配一个概率。例如,对于输入 “天空是”,模型可能生成以下预测:
“蓝色” → 0.7
“晴朗” → 0.2
“绿色” → 0.05
其他单词(如“粉色”、“嘈杂”等) → 较小的概率
模型如何选择下一个单词取决于采样方法(sampling method),即指导 LLM 选择单词的数学规则。
接下来,我们将介绍第一个参数——Temperature(温度),它影响 LLM 如何分配单词的概率。
在 LLM 中,温度参数控制模型生成输出的随机性或“创造性”。调整该参数可以影响响应的多样性和确定性:
Temperature = 1:模型使用其原始计算的概率进行选择。
Temperature < 1(低温度):增加高概率单词与低概率单词之间的差距,使最可能的单词更具主导性。这会生成更聚焦和确定的响应,适用于需要准确性和一致性的任务。
Temperature > 1(高温度):使所有单词的概率更接近,从而使低概率单词更有机会被选择。这会生成更具创意和多样化的输出,适用于创意写作或头脑风暴。
假设你的输入是:
法国的首都是:
当温度值设为 0.2 时,你可能会得到如下回应:
巴黎
当温度值设为 0.8 时,你可能会得到更具创意的回应:
巴黎,这座以埃菲尔铁塔和丰富文化闻名的城市。
由于较低的温度值会使模型生成更确定的响应,因此在创建事实性或技术性内容时,低温度是理想的选择。相反,较高的温度值适用于创意写作、头脑风暴或需要一定随机性的任务。
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "美国的首都是哪里?简要描述。",
}
],
temperature=0.1, # 设置低温度值
)
print(response.choices[0].message.content)
当 temperature=0.1
时,输出可能是:
美国的首都是华盛顿特区,位于波托马克河沿岸,靠近马里兰州和弗吉尼亚州。它是美国的政治中心,拥有白宫、国会大厦和最高法院。
当 temperature=2
时,可能的输出会更加随机,甚至可能包含无意义的词汇。
Top-P 参数(也称为 Nucleus Sampling,核采样)控制 LLM 在生成文本时的词汇选择范围。 它的作用是限制模型选择的单词列表,使其仅考虑累计概率达到一定阈值的最有可能的单词,从而在多样性和连贯性之间取得平衡。
模型计算整个词汇表中的概率分布
假设输入是 “天空是”,模型可能预测:
“蓝色” → 0.7
“晴朗” → 0.2
“绿色” → 0.05
其他单词(如“粉色”、“嘈杂”等)→ 概率较小
按照概率从高到低排序,并计算累积概率
例如,假设 top_p = 0.9
,那么计算累积概率如下:
“蓝色” → 0.7(累积:0.7)
“晴朗” → 0.2(累积:0.9) ← 达到阈值 0.9,停止计算
忽略其余单词(如“绿色”)
模型仅在这个子集内随机选择下一个单词
由于 "绿色" 及其他低概率单词被排除,模型的输出更聚焦于高概率的选项。
低值(如 top_p = 0.2
)
只允许模型选择最可能的几个单词。
生成的文本更加保守、可预测,适用于精确任务(如技术文档、摘要)。
高值(如 top_p = 1
)
允许模型从更广泛的词汇选择单词,增加多样性。
适用于创意写作、故事生成、头脑风暴等任务。
Temperature:调整单词概率,使低概率单词更具优势(增加创造力)。
Top-P:直接限制模型的选择范围,仅保留最可能的单词(增加可预测性)。
建议:通常不建议同时调整 Temperature 和 Top-P,建议只调整其中一个,以避免不可预测的行为。
import openai
OPENAI_API_KEY = "你的 API 密钥"
client = openai.OpenAI(api_key=OPENAI_API_KEY)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "美国的首都是哪里?简要描述。",
}
],
top_p=0.2, # 只允许模型选择最可能的单词
)
print(response.choices[0].message.content)
美国的首都是华盛顿特区,成立于 1790 年,位于波托马克河东岸,毗邻马里兰州和弗吉尼亚州。作为美国的政治中心,华盛顿特区是白宫、国会大厦和最高法院的所在地。
美国的首都是华盛顿特区,它不仅是政治中心,还拥有丰富的文化景观,如史密森尼博物馆群和林肯纪念堂。此外,该城市的历史和地理位置使其成为美国历史的关键组成部分。
结论:较低的 Top-P 使输出更加简洁明确,而较高的 Top-P 让文本更加多样化。
Max Tokens 参数用于设置 LLM 在一次交互中可以生成的最大标记数(tokens)。
低 max_tokens
值 → 生成较短的响应,适用于摘要、简短回答。
高 max_tokens
值 → 生成较长的响应,适用于详细解释、故事、代码生成。
注意:API 计费通常基于 token 数量,减少 max_tokens 可以降低使用成本!
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "美国的首都是哪里?简要描述。",
}
],
max_tokens=10, # 仅生成最多 10 个 token
)
print(response.choices[0].message.content)
美国的首都是华盛顿特区。
美国的首都是华盛顿特区,成立于 1790 年,以第一任总统乔治·华盛顿命名。它位于波托马克河东岸,毗邻马里兰州和弗吉尼亚州,是美国的政治中心,拥有白宫、国会大厦和最高法院。
结论:较低的 max_tokens 生成简短的答案,而较高的 max_tokens 允许更详细的解释。
Frequency Penalty 参数控制 LLM 对已使用词汇的重复率。
正值(如 1.0) → 降低重复单词的出现率,避免冗余。
负值(如 -1.0) → 允许更频繁地重复单词,适用于诗歌、押韵文本等应用。
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "写一小段关于玫瑰花的描述。",
}
],
frequency_penalty=1.5, # 增加惩罚,减少重复词
)
print(response.choices[0].message.content)
Presence Penalty 参数影响 LLM 是否重复使用已经出现的单词。
正值(如 1.0) → 促使模型使用新词,提高文本的多样性。
负值(如 -1.0) → 允许更多词汇重复,有助于强调关键词。
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "写一小段关于玫瑰花的描述。",
}
],
presence_penalty=1.0, # 促进新词使用
)
print(response.choices[0].message.content)
Stop Sequences 参数定义特定的标记模式,指示模型停止生成文本。
示例:
stop=["."]
→ 句号结束文本
stop=["END"]
→ "END" 作为停止信号
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": "写一段关于玫瑰花的描述。",
}
],
stop=["."], # 遇到句号停止生成
)
print(response.choices[0].message.content)
在学习了各个参数的作用以及如何针对特定任务调整它们之后,让我们总结一下如何优化参数以获得最佳输出。
首先,明确任务的目标。例如:
你是在生成创意内容(如故事或诗歌)吗?
你需要技术性或事实性内容(如代码解释或者论文)吗?
你希望进行头脑风暴并产生多样化的想法吗?
不同的任务需要不同的参数设置。
根据任务类型,设置初始参数。例如:
技术文档或事实性内容 → 需要低温度(temperature)和低 top-p,以获得更确定的输出。
创意写作 → 需要高温度和高 top-p,以增加创造性和多样性。
代码解释 → 需要低频率惩罚(frequency penalty),以允许重复使用相同的术语。
运行 API 调用,查看生成的文本是否符合预期。
如果输出不符合要求,调整参数并重新测试。
重要提示:一次只调整一个参数,这样可以清楚地看到该参数对输出的影响。例如:
如果输出过于随机或无关紧要,降低 temperature
或 top_p
。
如果输出太短或不完整,增加 max_tokens
。
如果文本中过多重复单词,增加 frequency_penalty
或 presence_penalty
。
以下是针对不同任务的推荐参数设置:
任务类型 | Temperature(温度) | Top-P(顶层概率采样) | Max Tokens(最大标记数) | Frequency Penalty(频率惩罚) | Presence Penalty(存在惩罚) | Stop Sequences(停止序列) |
---|---|---|---|---|---|---|
创意写作 | 1.2 | 0.9 | 500 | 0.8 | 0.6 | \n\n |
技术代码解释 | 0.3 | 1.0 | 200 | 0.0 | 0.0 | ### |
头脑风暴 | 1.0 | 0.8 | 300 | 0.6 | 1.0 | --- |
摘要 | 0.7 | 0.9 | 150 | 0.5 | 0.3 | \n |
对话系统 | 0.8 | 0.85 | 100 | 0.4 | 0.7 | User: |
创意写作:高 temperature
和 top_p
保证创造力,而 frequency_penalty
和 presence_penalty
避免重复语言,使文本更具多样性。
技术代码解释:低 temperature
确保准确性,frequency_penalty
和 presence_penalty
设为 0 以允许重复使用技术术语。
头脑风暴:适度的 temperature
和 top_p
生成有创意但仍然连贯的想法,presence_penalty
增强新词使用。
摘要:稍高的 temperature
允许一定的变通,frequency_penalty
避免冗余,presence_penalty
控制词汇多样性。
对话系统:均衡的设置保证输出既连贯又富有变化,停止序列 User:
确保对话流畅。
通过掌握 temperature、top-p、max tokens、frequency penalty、presence penalty 和 stop sequences 这六个主要参数,你可以针对不同的应用场景微调 LLM,无论是写作、代码解释、头脑风暴,还是构建对话系统。
虽然找到最佳参数组合可能需要一些试验和调整,但遵循结构化的方法(先确定任务类型 → 设定初始值 → 生成输出 → 调整参数),可以让你的 LLM 更加精准地满足需求。
✅ 下一步行动:
尝试不同的参数设置,看看它们如何影响你的 LLM 输出。
记录你的实验结果,找出最适合你的任务的参数组合。
在实际项目中应用这些参数调优技巧,优化你的 AI 生成文本体验!
你学习到了什么?
你了解了 LLM 的核心参数及其作用。
你学会了如何调整这些参数以优化不同类型的任务。
你掌握了调试 LLM 输出的方法,并知道如何针对特定目标微调模型。
希望本指南对你有所帮助!如果你有任何问题或想法,欢迎讨论!