写在前面:今天老师问了一个很有意思的问题------"大模型是怎么随机说话的?" 你用同样的 Prompt 问 AI 两次,它给的答案可能不完全一样。这不是 bug,是设计。LLM 预测下一个词时,会给每个候选词分配一个概率------"吗"的概率 0.6,"啊"的概率 0.15,"呀"的概率 0.1......最后选哪个?这就靠
temperature和Top K这两个参数来控制。老师说,这两个参数就是 AI 的"性格旋钮"------你调一调,它就从"严谨的律师"变成"狂放的诗人的"。
一、LLM 怎么"选词"?
1.1 概率分布
老师举了一个例子:
上一句是"你好",LLM 预测下一个词的概率分布可能是:
arduino
"吗" 0.60 ← 概率最高
"啊" 0.15
"呀" 0.10
"美" 0.05
"坏" 0.01
...... 其他
LLM 本质上是根据前面的词,算每个候选词的概率。概率最高的词就叫"最优解"。
但问题来了------每次都选概率最高的那个吗?
- 如果是 → 每次输出都一样 → 确定性高,但缺乏创意。
- 如果不一定 → 有时选概率第二的 → 多样性高,但可能"跑偏"。
temperature 和 Top K 就是控制"怎么选"的关键参数。
二、Temperature:随机性的"温度计"
2.1 温度的作用
老师说:
"
temperature------温度,随机性,0 - 1,文艺创作 | 写代码。"
temperature 控制的是概率分布的"陡峭程度":
- 低温度(0.1 - 0.3):让高概率更高,低概率更低。模型几乎只选最高概率的词 → 严谨、确定性高。
- 高温度(0.7 - 1.0):拉平概率分布,低概率的词也有机会被选中 → 创意、多样性高。
| temperature | 效果 | 适合场景 |
|---|---|---|
| 0.1 | 几乎每次都选"吗" | 代码生成、法律合同 |
| 0.2 | 大概率选"吗",偶尔选别的 | 数据分析、客服回复 |
| 0.5 | 平衡,既有质量又有创意 | 文案辅助、邮件撰写 |
| 0.8 | 可能选"啊""呀",不再单调 | 故事创作、广告文案 |
| 1.0 | 随意选,完全放飞 | 头脑风暴、诗歌生成 |
看 main.mjs 中两个模型的配置:
javascript
// 创意写作模型------温度高
const creativeModel = new ChatOpenAI({
model: 'deepseek-v4-pro',
temperature: 0.8, // 创意发散
topK: 4, // 限制不跑偏
maxTokens: 600,
});
// 严谨写实模型------温度低
const preciseModel = new ChatOpenAI({
model: 'deepseek-v4-pro',
temperature: 0.2, // 保守严谨
topK: 8, // 保证信息完整
maxTokens: 600,
});
同一个 model(deepseek-v4-pro),只改了 temperature 和 Top K,性格就完全不一样了。
2.2 做个试验
如果用两个模型写同一个主题"秋日山野晚风":
严谨模式(temperature=0.2):
"秋天的山野,晚风轻拂,带来阵阵凉意。树叶在风中沙沙作响,远处的天空渐渐暗了下来......"
创意模式(temperature=0.8):
"晚风像一只调皮的手,撩动着山野的裙摆。秋叶在风中打着旋儿,像是在跳一支无人能懂的舞......"
明明是同一个 LLM、同一个 Prompt,输出风格天差地别。这就是 temperature 的魔力。
三、Top K:限制"候选名单"
3.1 Top K 的作用
老师说:
"Top K------随机样本得分排序。"
Top K 限制模型在选词时,只看概率最高的前 K 个词。
- Top K = 1:每次都选概率最高的那个 → 完全确定。
- Top K = 4:只看前 4 个候选词,其他的完全不考虑。
- Top K = 8:有更多选择,但质量依然有保障(默认值)。
java
概率分布:
"吗" 0.60
"啊" 0.15
"呀" 0.10
"美" 0.05
"坏" 0.01
......
如果 Top K = 3:只看"吗""啊""呀"这三个。temperature 从这三个里选。
如果 Top K = 8:看前 8 个,"美"也有可能被选到。
3.2 Temperature 和 Top K 的配合
老师说了一句精辟的话:
"
temperature和Top K不可能都太大,都很小也没有必要。"
| temperature | Top K | 效果 | 比喻 |
|---|---|---|---|
| 小 | 大 | 准确,艺术性高 | 只选好的,但不死板 |
| 大 | 小 | 靠谱的创意 | 发挥创意但不跑偏 |
| 大 | 大 | 完全放飞,可能乱来 | 两个疯子在一起 |
| 小 | 小 | 太死板,缺乏变化 | 机器人说话 |
老师推荐的最佳配合:
- 代码/法律/合同 :
temperature=0.2,TopK=8(低随机 + 大候选池) - 创意写作/多模态 :
temperature=0.8,TopK=4(高随机 + 小候选池)
四、LangChain 的 Chain:把模型串成"流水线"
4.1 为什么要 Chain?
老师说:
"LangChain = Language + Chain(LLM 工作流编排)。"
之前我们每次都用 model.invoke(messages) 单独调用 LLM。但一个 AI 应用往往需要多个步骤:
PromptTemplate(模板化) → Model(调用 LLM) → OutputParser(格式化输出)
Chain(链)就是把多个步骤串起来,像工厂里的流水线一样。
4.2 PromptTemplate:让 Prompt 可复用
javascript
import { PromptTemplate } from '@langchain/core/prompts';
const storyPrompt = PromptTemplate.fromTemplate(`
请写一篇短篇散文,主题是{theme}
风格温柔治愈,篇幅200字左右,不要分段,文字细腻有画面感。
`);
{theme} 是一个占位符,可以在调用时动态替换。
- 以前:每次都要硬编码写完整的 Prompt。
- 现在:模板化,复用性高,维护方便。
4.3 StringOutputParser:自动格式化输出
javascript
import { StringOutputParser } from '@langchain/core/output_parsers';
const outputParser = new StringOutputParser();
StringOutputParser 把 LLM 返回的复杂对象自动解析成纯文本。 以前要写 response.choices[0].message.content,现在 parser 自动帮你做了。
4.4 用 .pipe() 组装 Chain
javascript
const creativeChain = storyPrompt
.pipe(creativeModel)
.pipe(outputParser);
const preciseChain = storyPrompt
.pipe(preciseModel)
.pipe(outputParser);
async function runWriteDemo() {
const theme = '秋日山野晚风';
console.log('创意写作模式');
const creativeText = await creativeChain.invoke({ theme });
console.log(creativeText);
console.log('严谨写实模式');
const preciseText = await preciseChain.invoke({ theme });
console.log(preciseText);
}
.pipe() 把三个步骤串在一起:
PromptTemplate(填好 theme)
→ ChatOpenAI(调用 LLM)
→ StringOutputParser(提取纯文本)
调用 creativeChain.invoke({ theme: '秋日山野晚风' }),一次执行整条流水线。
五、总结:控制 LLM 输出的四个参数
| 参数 | 作用 | 推荐值 | 比喻 |
|---|---|---|---|
| temperature | 控制随机性(0-1) | 0.2(严谨)/ 0.8(创意) | 温度计 |
| Top K | 限制候选项数量 | 4(创意)/ 8(严谨) | 候选名单 |
| maxTokens | 最大输出 Token 数 | 600 | 字数限制 |
| model | 选择 LLM 型号 | deepseek-v4-pro | 大脑 |
| LangChain 概念 | 作用 |
|---|---|
| PromptTemplate | 模板化 Prompt,占位符动态替换 |
| StringOutputParser | 自动提取 LLM 返回的纯文本 |
| .pipe() | 串联多个步骤,形成 AI 工作流 |
temperature 和 Top K 是控制 LLM 输出"性格"的关键参数。理解它们,你就能让同一个模型在不同场景下展现出不同的能力。
写在最后
今天最大的收获,是理解了 temperature 和 Top K 的配合关系。以前我只知道"temperature 高 = 创意,低 = 严谨",现在知道了还要搭配 Top K。而且 LangChain 的 Chain 机制------PromptTemplate.pipe(model).pipe(parser)------让 AI 工作流的组织变得清晰又优雅。
下次面试官问你:"怎么控制 LLM 输出的随机性?"
你可以淡定地说:
"LLM 的随机性主要通过两个参数控制:temperature 和 Top K。temperature(0-1)控制概率分布的陡峭程度,值越低越倾向于选最高概率的词,输出更严谨;值越高概率分布越平坦,低概率词也有机会被选中,输出更多样。Top K 限制模型只从前 K 个概率最高的词中采样,值小可以防止输出跑偏。两者需要配合使用:temperature 低 + Top K 大 → 准确且稳定;temperature 高 + Top K 小 → 有创意但不离谱。在 LangChain 中,可以通过 ChatOpenAI 的 temperature 和 topK 参数配置,再用 .pipe() 组装成完整的 AI 工作流。"
然后看着面试官满意的表情,心里默念:这波,又稳了。
本文所有代码示例均来自课堂学习资料,真实可运行。